Как построить запрос Elasticsearch с помощью Go?

Я использую библиотеку Olivere Elasticsearch для Go — https://github.com/olivere/elastic.

Я не могу правильно построить поисковый запрос, он продолжает возвращать 0 результатов.

termQuery := elasticClient.NewTermQuery("hash", "hashedID")
fmt.Println(termQuery)
searchResult, err := qs.client.Search().Index("someIndex").
    Type("node").
    Query(termQuery).
    Pretty(true).
    Do(ctx)
if err != nil {
    return nil
}

searchResult.Hits.TotalHits дает 0 совпадений, хотя есть данные. Данные находятся на сервере Elasticsearch, работающем на моем локальном компьютере, который я могу увидеть, если я запускаю вызов REST API:

{
   "_index": "someIndex",
   "_type": "node",
   "_id": "hashedID",
   "_score": 1,
   "_source": {
   "node": "test",
   "hash": "hashedID",
   "active": true
}

Как я могу исправить свой поисковый запрос?


person covfefe    schedule 01.08.2017    source источник
comment
Вы уверены, что возврат nil for для условия err != nil — это хорошая идея? Я думаю, что могут быть ошибки, которые вы не видите. Вы можете использовать panic(err) для печати трассировки стека.   -  person kiran.koduru    schedule 02.08.2017


Ответы (1)


Ваш скрипт go просто в порядке, и он работает. Проблема в самом запросе. Это то, что вы выполняете против elasticsearch. Попробуйте его непосредственно с помощью elasticsearch (через Sense, Kibana или аналогичный инструмент) и проверьте, возвращает ли он то, что вы ожидаете:

POST someIndex/node/_search
{
    "query": {
        "term": {
           "hash": "hashedID"
        }
    }
}

Решение:

Я подозреваю, что хеш имеет тип text (с использованием elasticsearch 5). Тогда вместо этого вам нужно запросить hash.keyword в терминологическом запросе.

person TehSphinX    schedule 02.08.2017
comment
Было ли это полезно или вы застряли на чем-то другом? - person TehSphinX; 09.08.2017