弹性搜索7和Golang找不到数据

时间:2019-11-14 23:20:29

标签: go elasticsearch search

这是我的代码: 转到1.13并进行弹性搜索7

package main


import (
    "context"
    "encoding/json"
    "fmt"
    "github.com/teris-io/shortid"
    "github.com/olivere/elastic/v7"
    "log"
    "reflect"
    "time"
)


const (
    elasticIndexName = "documents"
)
var (
    elasticClient *elastic.Client
)
type DocumentRequest struct {
    Title   string `json:"title"`
    Content string `json:"content"`
}

type Document struct {
    ID        string    `json:"id"`
    Title     string    `json:"title"`
    CreatedAt time.Time `json:"created_at"`
    Content   string    `json:"content"`
}
func main() {
    var err error
    ctx := context.Background()
    elasticClient, err = elastic.NewClient(
        elastic.SetURL("http://127.0.0.1:9200"),
        elastic.SetSniff(false),
    )
    if err != nil {
        panic(err)
    }
    //_, err = elasticClient.CreateIndex(elasticIndexName).Do(ctx)
    if err != nil {
        fmt.Println(err)
    }
    //_,err2 := elasticClient.DeleteIndex(elasticIndexName).Do(ctx)
    if err != nil {
        fmt.Println(err)
    }
    indexParams := `{
        "settings":{
            "number_of_shards":1,
            "number_of_replicas":0


        },
        "mappings":{
                "properties": {
                    "content": {
"type":"text",
 "fielddata": true
                    },
                    "title": {
"type":"text",
 "fielddata": true
                    }
                }
            }
        }
    }`

    // Create an index
    _,err = elasticClient.CreateIndex(elasticIndexName).BodyString(indexParams).Do(ctx)
    fmt.Println(indexParams)
    if err != nil {
        // Handle error
        // Get *elastic.Error which contains additional information
        e, ok := err.(*elastic.Error)
        if !ok {
        }
        log.Printf("Elastic failed with status %d and error %s.", e.Status, e.Details)
        panic(err)
    }
    if err != nil {
        fmt.Println(err)
    }
    var docs []DocumentRequest
    var doc1 DocumentRequest
    doc1.Content = "Content Bonjour"
    doc1.Title = "Title Bonjour"
    docs = append(docs,doc1)
fmt.Println(docs)

    for _, d := range docs {
        doc := Document{
            ID:        shortid.MustGenerate(),
            Title:     d.Title,
            CreatedAt: time.Now().UTC(),
            Content:   d.Content,
        }
        docJ,_ := json.Marshal(doc)
        fmt.Println(string(docJ))
        put2, err4 := elasticClient.Index().
            Index(elasticIndexName ).
            Id(doc.ID).
            BodyString(string(docJ)).
            Do(ctx)
        if err4 != nil {
            panic(err4)
        }
        fmt.Println(put2)


    }
    termQuery := elastic.NewTermQuery("title", "Bonjour")
    result, err := elasticClient.Search().
        Index(elasticIndexName).            // search in index "documents"
        Query(termQuery).           // specify the query
        Sort("title", true). // sort by "user" field, ascending
        From(0).Size(10).           // take documents 0-9
        Pretty(true).               // pretty print request and response JSON
        Do(ctx)


    if err != nil {
        panic(err)
    }
    fmt.Println("result")
    fmt.Println(result)
    fmt.Printf("Found a total of %d docs\n", result.TotalHits())
    var ttyp DocumentRequest
    for _, item := range result.Each(reflect.TypeOf(ttyp)) {
        if t, ok := item.(DocumentRequest); ok {
            fmt.Printf("Doc %s: %s\n", t.Title, t.Content)
        }
    }
}

最后我有:

[{Title Bonjour Content Bonjour}]
{"id":"5DJ0u81WR","title":"Title Bonjour","created_at":"2019-11-14T23:16:26.028333176Z","content":"Content Bonjour"}
&{documents _doc 5DJ0u81WR 1 created 0xc0001581c0 2 1 0 false}
result
&{map[Content-Type:[application/json; charset=UTF-8]] 4 false 0 []  0xc00015b3e0 map[] map[] false <nil> <nil> 0xc000158600 0}
Found a total of 0 docs

我不明白为什么。该文档似乎已创建,但无法通过搜索找到。...

1 个答案:

答案 0 :(得分:0)

您正在使用术语查询来匹配完全相同的字段

Title Bonjour!=Bonjour

此行

termQuery := elastic.NewTermQuery("title", "Bonjour")

等效于

where title='Bonjour'

在mysql中,如果您要匹配但不完全匹配,则可以使用匹配查询

matchQuery := elastic.NewMatchQuery("title", "Bonjour")