Как использовать результаты поиска golang bleve? - PullRequest
0 голосов
/ 28 мая 2018

Я новичок в 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 fields.

Теперь я хочу сделать это, чтобы получить к нему доступ из своего кода!

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 Ответ

0 голосов
/ 29 мая 2018

Каждое попадание в результате поиска - это DocumentMatch .Из документации видно, что DocumentMatch имеет Fields, что является map[string]interface{}, и к нему можно получить доступ следующим образом:

searchResults.Hits[0].Fields["Bio"].(string)

IIRC, bleve не включает поля документа в результаты подефолт.Вы должны предоставить список полей, которые вы хотели бы вернуть SearchRequest.Fields.Кроме того, вы можете передать []string{"*"}, чтобы вернуть все поля.

...