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

一、安装 Elasticsearch3

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

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

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


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

Bash

二、Golang 中使用 Elasticsearch3

1. 安装 Elasticsearch3 的 Golang 客户端

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

go get github.com/olivere/elastic
Bash

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)
}

Golang

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

三、使用 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)
	}
}

Golang

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

总结:

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

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