Как использовать результаты поиска 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{"*"} вернуть все поля.

Другие вопросы по тегам