首页 > 解决方案 > 通过 _percolator_document_slot 字段的数组长度或 docFreq 对 elasticsearch percolate 查询进行排序

问题描述

我想使用脚本按在其中找到查​​询的文档数量对渗透查询的响应进行排序。

我正在使用 Elasticsearch 6.8 版

我尝试按 _percolator_document_slot 字段的数组长度排序,但找不到访问该字段的方法。

如果有另一种解决方案使用常规 _score 使用 script_score 来反映文档的数量,这也将是一个答案。

  "sort": {
    "_script": {
      "type": "number",
      "script": "_fields._percolator_document_slot.values.size()",
      "order": "desc"
    }
  }

错误:

   "reason":{
   "type":"script_exception",
   "reason":"compile error",
   "script_stack":[
      "_fields._percolator_docum ...",
      "^---- HERE"
   ],
   "script":"_fields._percolator_document_slot.values.size()",
   "lang":"painless",
   "caused_by":{
      "type":"illegal_argument_exception",
      "reason":"Variable [_fields] is not defined."
   }
}

我也试过:

"script":"_fields._percolator_document_slot.length()",

另一种方法:

{
  "query": {
    "function_score": {
      "query": {
        "percolate": {
          "field": "query",
          "documents": [
            {
              "message": "bonsai tree"
            },
            {
              "message": "new tree"
            },
            {
              "message": "the office"
            },
            {
              "message": "office tree"
            }
          ]
        }
      },
      "script_score": {
        "script": {
          "source": "return _index['message'].docFreq();"
        }
      }
    }
  }
}

导致此错误:

"caused_by":{
   "type":"script_exception",
   "reason":"compile error",
   "script_stack":[
      "return _index['message'].docFreq...",
      " ^---- HERE"
   ],
   "script":"return _index['message'].docFreq();",
   "lang":"painless",
   "caused_by":{
      "type":"illegal_argument_exception",
      "reason":"Variable [_index] is not defined."
   }
}

这是取自文档的简单示例: https ://www.elastic.co/guide/en/elasticsearch/reference/6.8/query-dsl-percolate-query.html#_percolating_multiple_documents

指数:

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

注册查询:

PUT /my-index/_doc/1?refresh
{
    "query" : {
        "match" : {
            "message" : "bonsai tree"
        }
    }
}

匹配多个文档(不排序):

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

回复:

    {
  "took": 13,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped" : 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 1.5606477,
    "hits": [
      {
        "_index": "my-index",
        "_type": "_doc",
        "_id": "1",
        "_score": 1.5606477,
        "_source": {
          "query": {
            "match": {
              "message": "bonsai tree"
            }
          }
        },
        "fields" : {
          "_percolator_document_slot" : [0, 1, 3] 
        }
      }
    ]
  }
}

标签: elasticsearch

解决方案


推荐阅读