Golang如何在Elasticsearch中使用星号

Golang如何在Elasticsearch中使用星号 我正在使用 olivere/elastic 库进行 Elasticsearch 操作,以下是正常的 Elastic 查询:

PUT i/i/1
{
  "name":"SquadBattle",
  "id": 1
}

PUT i/i/2
{
  "name":"BombSquad",
  "id": 2
}

GET i/_search
{"query": {
    "query_string" : {"default_field" : "name", "query" : "*squad*"}
} }

我在 Golang 中遇到的问题是:如何正确使用星号? 我尝试了以下方法但没有成功:

package main

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

func main() {
	fmt.Println("line (42):::", A())
}

func A () []map[string]int {

	ctx := context.Background()
	client, _ := elastic.NewClient()
	client.Ping("http://127.0.0.1:9200").Do(ctx)
	v,_:=client.ElasticsearchVersion("http://127.0.0.1:9200")
	fmt.Println("line(15):::", v)
	m, _ := client.IndexExists("i").Do(ctx)
	fmt.Println("line (17):::", m)
	
	d := ` {"query_string" : {"default_field" : "name", "query" : "*squad*" }}`
	//d := ` {"query_string" : {"default_field" : "name", "query" : "BombSquad" }}`
	
	
	//d:= `{ "match_phrase_prefix":{"name","query": "BombSquad" }}`
	//d :=  `{"match_all":{}}`
	//d := ` {"name", "query" : "squad"}`
	
	myQuery := elastic.NewSimpleQueryStringQuery(d)
	
	searchResult, err := client.Search().Index("i").Query(myQuery).
		From(0).Size(100).Pretty(false).Do(ctx)
	fmt.Println("line (26):::", err)
	type GameStruct struct {
		Name          string  `json:"name"`
		Id            int     `json:"id"`
	}
	
	var (
		mapGameId       =      make(map[string]int)
		sliceMapGameId       []map[string]int
		foundResult          []interface{}
		ttyp                   GameStruct
	)
	
	for _, item := range searchResult.Each(reflect.TypeOf(ttyp)) {
		foundResult = append(foundResult, item)
		if t, ok := item.(GameStruct); ok {
			//fmt.Printf("elastic by %s: %s\n", t.Name, t.Id)
			mapGameId[t.Name]=t.Id
		}
	}
	sliceMapGameId = append(sliceMapGameId, mapGameId)
	//fmt.Println("line (220):::", sliceMapGameId)
	return sliceMapGameId
}

更多关于Golang如何在Elasticsearch中使用星号的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

终于,我解决了这个问题:

myQuery := elastic.NewSimpleQueryStringQuery(d)

应该改为:

myQuery := elastic.NewRawStringQuery(d)

这是非常强大的查询语句,希望这个帖子能对他人有所帮助。

更多关于Golang如何在Elasticsearch中使用星号的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Golang中使用olivere/elastic库进行Elasticsearch查询时,使用星号进行通配符查询的正确方法是使用elastic.NewWildcardQuery而不是elastic.NewSimpleQueryStringQuery。以下是修正后的代码示例:

package main

import (
	"context"
	"fmt"
	"reflect"

	"github.com/olivere/elastic"
)

func main() {
	fmt.Println("line (42):::", A())
}

func A() []map[string]int {
	ctx := context.Background()
	client, _ := elastic.NewClient()
	client.Ping("http://127.0.0.1:9200").Do(ctx)
	v, _ := client.ElasticsearchVersion("http://127.0.0.1:9200")
	fmt.Println("line(15):::", v)
	m, _ := client.IndexExists("i").Do(ctx)
	fmt.Println("line (17):::", m)

	// 使用通配符查询
	wildcardQuery := elastic.NewWildcardQuery("name", "*squad*")
	
	searchResult, err := client.Search().Index("i").Query(wildcardQuery).
		From(0).Size(100).Pretty(false).Do(ctx)
	fmt.Println("line (26):::", err)

	type GameStruct struct {
		Name string `json:"name"`
		Id   int    `json:"id"`
	}

	var (
		mapGameId     = make(map[string]int)
		sliceMapGameId []map[string]int
		foundResult   []interface{}
		ttyp          GameStruct
	)

	for _, item := range searchResult.Each(reflect.TypeOf(ttyp)) {
		foundResult = append(foundResult, item)
		if t, ok := item.(GameStruct); ok {
			mapGameId[t.Name] = t.Id
		}
	}
	sliceMapGameId = append(sliceMapGameId, mapGameId)
	return sliceMapGameId
}

如果你坚持要使用query_string查询,可以使用以下方式:

// 使用QueryStringQuery
queryStringQuery := elastic.NewQueryStringQuery("*squad*").DefaultField("name")

searchResult, err := client.Search().Index("i").Query(queryStringQuery).
	From(0).Size(100).Pretty(false).Do(ctx)

或者使用RawStringQuery:

// 使用原始查询字符串
rawQuery := elastic.NewRawStringQuery(`{
	"query_string": {
		"default_field": "name",
		"query": "*squad*"
	}
}`)

searchResult, err := client.Search().Index("i").Query(rawQuery).
	From(0).Size(100).Pretty(false).Do(ctx)

主要问题是elastic.NewSimpleQueryStringQuery期望的是查询字符串本身,而不是完整的JSON查询结构。正确的做法是直接使用通配符查询或query_string查询的专用构造方法。

回到顶部