如何使用golang bleve搜索结果?
How to use golang bleve search results?
我是 Go 的新手并且 Bleve(抱歉,如果我问的是琐碎的事情……)。这个搜索引擎看起来很不错,但是我在处理搜索结果时遇到了问题。
假设我们有一个结构:
type Person struct {
Name string `json:"name"`
Bio string `json:"bio"`
}
现在,我们从数据库中提取数据(使用 sqlx 库):
rows := []Person{}
db.Select(&rows, "SELECT * FROM person")
...并将其编入索引:
index.Index, err = bleve.Open("index.bleve")
batch := index.Index.NewBatch()
i := 0
for _, row := range rows {
rowId := fmt.Sprintf("%T_%d", row, row.ID)
batch.Index(rowId, row)
i++
if i > 100 {
index.Index.Batch(batch)
i = 0
}
}
现在我们已经创建了索引。效果很好。
使用 bleve command line utility,returns 数据正确:
bleve query index.bleve doe
3 matches, showing 1 through 3, took 27.767838ms
1. Person_68402 (0.252219)
Name
Doe
Bio
My name is John Doe!
2. ...
在这里我们看到 bleve 存储了 Name
和 Bio
字段。
现在我想通过我的代码访问它!
query := bleve.NewMatchAllQuery()
searchRequest := bleve.NewSearchRequest(query)
searchResults, _ := index.Index.Search(searchRequest)
fmt.Println(searchResults[0].ID) // <- This works
但我不只是想要ID然后查询数据库以获取其余日期。对于 avoid hitting database,我希望能够做类似的事情:
fmt.Println(searchResults[0].Bio) // <- This doesn't work :(
你能帮忙吗?
搜索结果中的每个匹配都是 DocumentMatch。您可以在文档中看到 DocumentMatch
有 Fields
这是一个 map[string]interface{}
并且可以按如下方式访问:
searchResults.Hits[0].Fields["Bio"].(string)
默认情况下,Bleve 不在结果中包含文档的字段。您必须提供您希望 return 编辑到 SearchRequest.Fields
的字段列表(index.Search
的参数)。或者,您可以设置
searchRequest.Fields = []string{"*"}
到return所有字段。
我是 Go 的新手并且 Bleve(抱歉,如果我问的是琐碎的事情……)。这个搜索引擎看起来很不错,但是我在处理搜索结果时遇到了问题。
假设我们有一个结构:
type Person struct {
Name string `json:"name"`
Bio string `json:"bio"`
}
现在,我们从数据库中提取数据(使用 sqlx 库):
rows := []Person{}
db.Select(&rows, "SELECT * FROM person")
...并将其编入索引:
index.Index, err = bleve.Open("index.bleve")
batch := index.Index.NewBatch()
i := 0
for _, row := range rows {
rowId := fmt.Sprintf("%T_%d", row, row.ID)
batch.Index(rowId, row)
i++
if i > 100 {
index.Index.Batch(batch)
i = 0
}
}
现在我们已经创建了索引。效果很好。
使用 bleve command line utility,returns 数据正确:
bleve query index.bleve doe
3 matches, showing 1 through 3, took 27.767838ms
1. Person_68402 (0.252219)
Name
Doe
Bio
My name is John Doe!
2. ...
在这里我们看到 bleve 存储了 Name
和 Bio
字段。
现在我想通过我的代码访问它!
query := bleve.NewMatchAllQuery()
searchRequest := bleve.NewSearchRequest(query)
searchResults, _ := index.Index.Search(searchRequest)
fmt.Println(searchResults[0].ID) // <- This works
但我不只是想要ID然后查询数据库以获取其余日期。对于 avoid hitting database,我希望能够做类似的事情:
fmt.Println(searchResults[0].Bio) // <- This doesn't work :(
你能帮忙吗?
搜索结果中的每个匹配都是 DocumentMatch。您可以在文档中看到 DocumentMatch
有 Fields
这是一个 map[string]interface{}
并且可以按如下方式访问:
searchResults.Hits[0].Fields["Bio"].(string)
默认情况下,Bleve 不在结果中包含文档的字段。您必须提供您希望 return 编辑到 SearchRequest.Fields
的字段列表(index.Search
的参数)。或者,您可以设置
searchRequest.Fields = []string{"*"}
到return所有字段。