如何在golang的elasticsearch文档(索引)中搜索字符串?

我正在用 golang 编写一个函数来搜索已编入索引的 elasticsearch 文档中的字符串。我正在使用 elasticsearch golang 客户端elastic。例如考虑对象是推文,


type Tweet struct {

    User    string

    Message string

    Retweets int

}

搜索功能是


func SearchProject() error{

    // Search with a term query

    termQuery := elastic.NewTermQuery("user", "olivere")

    searchResult, err := client.Search().

        Index("twitter").   // search in index "twitter"

        Query(&termQuery).  // specify the query

        Sort("user", true). // sort by "user" field, ascending

        From(0).Size(10).   // take documents 0-9

        Pretty(true).       // pretty print request and response JSON

        Do()                // execute

    if err != nil {

        // Handle error

        panic(err)

        return err

    }


    // searchResult is of type SearchResult and returns hits, suggestions,

    // and all kinds of other information from Elasticsearch.

    fmt.Printf("Query took %d milliseconds\n", searchResult.TookInMillis)


    // Each is a convenience function that iterates over hits in a search result.

    // It makes sure you don't need to check for nil values in the response.

    // However, it ignores errors in serialization. If you want full control

    // over iterating the hits, see below.

    var ttyp Tweet

    for _, item := range searchResult.Each(reflect.TypeOf(ttyp)) {

        t := item.(Tweet)

        fmt.Printf("Tweet by %s: %s\n", t.User, t.Message)

    }


此搜索正在打印用户“olivere”的推文。但是如果我给出“橄榄”,那么搜索就不起作用了。如何搜索属于用户/消息/转推的字符串?


有人可以帮我解决这个问题吗?谢谢


郎朗坤
浏览 234回答 2
2回答

不负相思意

您搜索和查找数据的方式取决于您的分析器 - 从您的代码来看,很可能正在使用标准分析器(即您没有在映射中指定替代方案)。该标准分析仪只会检索完整的单词。因此,要将“olive”与“olivere”相匹配,您可以:更改搜索过程例如,从术语查询切换到前缀查询或使用带有通配符的查询字符串查询。更改索引过程如果您想在较大的字符串中查找字符串,请查看在分析器中使用nGrams或Edge nGrams。

一只萌萌小番薯

multiQuery := elastic.NewMultiMatchQuery(    term,    "name", "address", "location", "email", "phone_number", "place", "postcode",).Type("phrase_prefix")
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go