使用Elasticsearch3进行Golang开发实现全文搜索功能

一、安装Elasticsearch3

1. 在官网上下载Elasticsearch的安装包,选择适合自己操作系统的版本。

2. 下载完成后,解压缩安装包到指定目录,比如解压到 "/usr/local/elasticsearch"。

3. 在命令行窗口中执行如下命令开始启动Elasticsearch:


cd /usr/local/elasticsearch/bin
./elasticsearch

二、Golang中使用Elasticsearch3

1. 安装Elasticsearch3的Golang客户端

在Golang中使用Elasticsearch3需要安装相应的Golang客户端库。可以使用以下命令安装:

go get github.com/olivere/elastic

2. 建立与Elasticsearch3的连接

在Golang代码中,我们需要通过Elasticsearch的客户端来和Elasticsearch进行交互。首先,我们需要建立与Elasticsearch的连接。可以参考以下代码示例:


package main

import (
	"context"
	"fmt"
	"log"
	"github.com/olivere/elastic/v7"
)

func main() {
	// 创建连接
	client, err := elastic.NewClient(elastic.SetURL("http://localhost:9200"))
	if err != nil {
		log.Fatal(err)
	}
	
	// 测试连接
	info, code, err := client.Ping("http://localhost:9200").Do(context.Background())
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("Elasticsearch returned with code %d and version %s\n", code, info.Version.Number)
}

3. 创建索引

在Elasticsearch中,我们需要先创建索引,然后在该索引中创建自定义的Mapping,并将数据插入到索引中。可以参考以下代码示例:


package main

import (
	"context"
	"fmt"
	"log"
	"github.com/olivere/elastic/v7"
)

type Article struct {
	Title   string
	Content string
}

func main() {
	// 创建连接
	client, err := elastic.NewClient(elastic.SetURL("http://localhost:9200"))
	if err != nil {
		log.Fatal(err)
	}

	// 创建索引
	indexName := "articles"
	createIndex, err := client.CreateIndex(indexName).Do(context.Background())
	if err != nil {
		log.Fatal(err)
	}

	if !createIndex.Acknowledged {
		log.Fatal("Create index failed")
	}

	fmt.Println("Create index successfully")

	// 创建Mapping
	mapping := `{
		"settings":{
			"number_of_shards":1,
			"number_of_replicas":0
		},
		"mappings":{
			"properties":{
				"title":{
					"type":"text",
					"analyzer":"ik_max_word"
				},
				"content":{
					"type":"text",
					"analyzer":"ik_max_word"
				}
			}
		}
	}`

	putMapping, err := client.PutMapping().Index(indexName).BodyString(mapping).Do(context.Background())
	if err != nil {
		log.Fatal(err)
	}

	if !putMapping.Acknowledged {
		log.Fatal("Put mapping failed")
	}
	fmt.Println("Put mapping successfully")
	
	// 插入数据
	article := Article{
		Title:   "Elasticsearch",
		Content: "Elasticsearch is a distributed, RESTful search and analytics engine. It is easy to use, scalable, and highly available."
	}
	_, err = client.Index().Index(indexName).BodyJson(article).Do(context.Background())
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("Insert data successfully")
}

三、使用Golang进行全文搜索

1. 简单搜索

在Golang中使用Elasticsearch进行全文搜索是非常简单的,只需要构建查询语句,指定要搜索的字段和搜索关键字即可。以下代码示例演示了如何进行简单的全文搜索:


package main

import (
	"context"
	"fmt"
	"log"
	"github.com/olivere/elastic/v7"
)

func main() {
	// 创建连接
	client, err := elastic.NewClient(elastic.SetURL("http://localhost:9200"))
	if err != nil {
		log.Fatal(err)
	}
	
	// 简单搜索
	searchResult, err := client.Search().Index("articles").Query(elastic.NewMatchQuery("content", "Elasticsearch")).Do(context.Background())
	if err != nil {
		log.Fatal(err)
	}
	
	fmt.Printf("Found %d articles\n", searchResult.Hits.TotalHits.Value)
	for _, hit := range searchResult.Hits.Hits {
		fmt.Printf("Article title: %s\n", hit.Source.Title)
		fmt.Printf("Article content: %s\n", hit.Source.Content)
	}
}

2. 高级搜索

在实际的应用中,我们可能需要进行更加复杂的搜索,例如多字段的搜索、布尔逻辑的搜索等。Elasticsearch提供了丰富的查询功能来满足这些需求。以下代码示例演示了如何进行高级搜索:


package main

import (
	"context"
	"fmt"
	"log"
	"github.com/olivere/elastic/v7"
)

func main() {
	// 创建连接
	client, err := elastic.NewClient(elastic.SetURL("http://localhost:9200"))
	if err != nil {
		log.Fatal(err)
	}
	
	// 高级搜索
	boolQuery := elastic.NewBoolQuery()
	boolQuery.Must(elastic.NewMatchQuery("content", "Elasticsearch"))
	boolQuery.Filter(elastic.NewRangeQuery("date").Gte("2021-01-01").Lte("2021-12-31"))

	searchResult, err := client.Search().Index("articles").Query(boolQuery).Do(context.Background())
	if err != nil {
		log.Fatal(err)
	}
	
	fmt.Printf("Found %d articles\n", searchResult.Hits.TotalHits.Value)
	for _, hit := range searchResult.Hits.Hits {
		fmt.Printf("Article title: %s\n", hit.Source.Title)
		fmt.Printf("Article content: %s\n", hit.Source.Content)
	}
}

总结:

本文介绍了如何在Golang中使用Elasticsearch3进行全文搜索功能的开发。首先介绍了安装Elasticsearch3的步骤,然后讲解了Golang中如何使用Elasticsearch客户端库与Elasticsearch建立连接。接着介绍了如何创建索引、添加文档,并且演示了如何进行简单搜索和高级搜索的示例代码。

希望本文对于使用Elasticsearch3进行Golang开发的全文搜索功能有所帮助。