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/.

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