0
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.').

非常感谢任何解决此问题的帮助。

4

1 回答 1

0

我将通过 API 开始解释这一点。

Percolate 查询可用于匹配存储在索引中的查询。

在使用 Percolate 字段创建索引时,您可以指定如下映射:

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

这表明该字段message将是用于 Percolate 查询的字段。

如果您想匹配文档列表,则应发送包含此字段的术语列表,如docs 中的示例所示

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

说到这里,你应该:

  1. 在 ES 索引中设置正确的映射以渗透特定字段。

  2. 在 DSL 中,仅发送带有“Percolated”字段的参数列表,而不是整个 ES 文档。

希望这会有所帮助:D

于 2020-02-11T17:31:42.940 回答