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.').
非常感谢您对解决此问题的任何帮助。

最佳答案

我将开始通过API对此进行解释。

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

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

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

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

如果要匹配文档列表,则应像在example found in the docs中一样发送带有此字段的术语列表:
GET /my-index/_search
{
    "query" : {
        "percolate" : {
            "field" : "query",
            "documents" : [
                {
                    "message" : "bonsai tree"
                },
                {
                    "message" : "new tree"
                },
                {
                    "message" : "the office"
                },
                {
                    "message" : "office tree"
                }
            ]
        }
    }
}

这样说,您应该:
  • 在ES索引中设置适当的映射以对特定字段进行渗透。
  • 在DSL中,仅使用“Percolated”字段发送参数列表,而不发送整个ES文档。

  • 希望这会有所帮助:D

    10-06 14:35