这是我的代码: 转到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
我不明白为什么。该文档似乎已创建,但无法通过搜索找到。...
答案 0 :(得分:0)
您正在使用术语查询来匹配完全相同的字段
Title Bonjour!=Bonjour
此行
termQuery := elastic.NewTermQuery("title", "Bonjour")
等效于
where title='Bonjour'
在mysql中,如果您要匹配但不完全匹配,则可以使用匹配查询
matchQuery := elastic.NewMatchQuery("title", "Bonjour")