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查询的专用构造方法。

