Query DSL не работает в поиске pyes
Я пытаюсь использовать пользовательский запрос DSL для получения результатов с помощью библиотеки pyes. У меня есть запрос DSL, который работает, когда я использую командную строку
curl -XGET localhost:9200/test_index/_search -d '{
"query": {
"function_score": {
"query": {
"match_all": {}
},
"field_value_factor": {
"field": "starred",
"modifier": "none",
"factor": 2
}
}
},
"aggs" : {
"types" : {
"filters" : {
"filters" : {
"category1" : { "type" : { "value" : "category1"}},
"category2" : { "type" : { "value" : "category2"}},
"category3" : { "type" : { "value" : "category3"}},
"category4": { "type" : { "value" : "category4"}},
"category5" : { "type" : { "value" : "category5"}}
}
},
"aggs": {
"topFoundHits": {
"top_hits": {
"size": 5
}
}
}
}
}
}'
Идея здесь состоит в том, чтобы искать во многих категоризованных документах все документы, соответствующие конкретному строковому запросу. Затем, используя агрегаты, я хочу найти пять лучших документов по категориям. Помеченные элементы увеличиваются, поэтому они отображаются над другими результатами поиска.
Это прекрасно работает, когда я ввожу команду, как указано выше, непосредственно в терминале, но не работает, когда я пытаюсь поместить ее в pyes. Я не уверен, что лучший способ сделать это. Документация для библиотеки pyes действительно сбивает меня с толку, чтобы полностью перевести это в объекты pyes.
Я пытаюсь сделать следующее:
query_dsl = self.get_text_index_query_dsl()
resulting_docs = conn.search(query=query_dsl)
(где self.get_test_index_query_dsl
возвращает запрос dsl dict выше)
Поиск как есть дает мне:ElasticSearchException: QueryParsingException[[test_index] No query registered for [query]]; }]
Если я удаляю родительское сопоставление "запрос" и пытаюсь:
query_dsl = {
"function_score": {
"query": {
"match_all": {}
},
"field_value_factor": {
"field": "starred",
"modifier": "none",
"factor": 2
}
},
"aggs" : {
"types" : {
"filters" : {
"filters" : {
"category1" : { "type" : { "value" : "category1"}},
"category2" : { "type" : { "value" : "category2"}},
"category3" : { "type" : { "value" : "category3"}},
"category4": { "type" : { "value" : "category4"}},
"category5" : { "type" : { "value" : "category5"}}
}
},
"aggs": {
"topFoundHits": {
"top_hits": {
"size": 5
}
}
}
}
}
}
Это также ошибки с: ElasticSearchException: ElasticsearchParseException[Expected field name but got START_OBJECT "aggs"]; }]
Эти ошибки в дополнение к тому факту, что у pyes пока нет функциональности topFoundHits (я думаю), удерживают меня.
Есть идеи, почему это происходит и как это исправить? Спасибо вам большое!
1 ответ
Я получил эту работу, используя эту библиотеку, где вы можете просто использовать обычный синтаксис dsl JSON запроса: http://elasticsearch-dsl.readthedocs.org/en/latest/.