Как правильно использовать запрос Perseasticsearch-dsl Percolate? - PullRequest
0 голосов
/ 11 февраля 2020
s = Search(index='test-index').using(client)
q = Q('percolate',
            field="query",
            documents=list_of_documents)
s = s.query(q)
p = s.execute()

Я пытаюсь выполнить перколяционный запрос к индексу со списком документов и получаю сообщение об ошибке

RequestError(400, 'search_phase_execution_exception', 'Field [_id] is a metadata field and cannot be added inside a document. Use the index API request parameters.').

Любая помощь в решении этой проблемы очень высоко ценится.

1 Ответ

0 голосов
/ 11 февраля 2020

Я начну объяснять это через API.

Запрос Percolate можно использовать для сопоставления запросов, хранящихся в индексе.

При создании индекса в поле Percolate вы указываете отображение следующим образом:

PUT /my-index
{
    "mappings": {
         "properties": {
             "message": {
                 "type": "text"
             },
             "query": {
                 "type": "percolator"
             }
        }
    }
}

Это указывает на то, что поле message будет тем, которое используется для запроса Percolate.

Если вы хотите сопоставить список документов, следует отправить список терминов с этим полем, как в примере , найденном в документации :

GET /my-index/_search
{
    "query" : {
        "percolate" : {
            "field" : "query",
            "documents" : [ 
                {
                    "message" : "bonsai tree"
                },
                {
                    "message" : "new tree"
                },
                {
                    "message" : "the office"
                },
                {
                    "message" : "office tree"
                }
            ]
        }
    }
}

Сказав это, вы должны:

  1. Установить правильные отображения в индексе ES, чтобы задать поле c.

  2. В DSL, отправьте список параметров только с полем «Percolated», а не весь документ ES.

Надеюсь, это полезно: D

...