Как использовать результаты поиска golang bleve?
Я новичок в Go и Bleve (извините, если я спрашиваю тривиальные вещи...). Эта поисковая система, кажется, действительно хороша, но я застреваю, когда дело касается моих результатов поиска.
Допустим, у нас есть структура:
type Person struct {
Name string `json:"name"`
Bio string `json:"bio"`
}
Теперь мы извлекаем данные из базы данных (используя sqlx lib):
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, он возвращает данные правильно:
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
Но я хочу не только идентификатор, а затем запросить базу данных, чтобы получить оставшуюся дату. Чтобы избежать попадания в базу данных, я хотел бы иметь возможность сделать что-то вроде:
fmt.Println(searchResults[0].Bio) // <- This doesn't work :(
Не могли бы вы помочь?
1 ответ
Каждое попадание в результате поиска является DocumentMatch. Вы можете увидеть в документации, что DocumentMatch
имеет Fields
который является map[string]interface{}
и могут быть доступны следующим образом:
searchResults.Hits[0].Fields["Bio"].(string)
IIRC, bleve не включает поля документа в результаты по умолчанию. Вы должны предоставить список полей, которые вы хотите вернуть SearchRequest.Fields
, Кроме того, вы можете пройти []string{"*"}
вернуть все поля.