Elasticsearch优先考虑特定的_ids但不过滤?

时间:2016-11-21 08:26:10

标签: elasticsearch chewy-gem

我正在尝试在elasticsearch中对查询进行排序,其中查询将优先处理具有特定_ids的文档,但是它不会根据_ids优先处理它们来过滤整个查询。

以下是我尝试尝试的一个例子:

{"query":{"constant_score":{"filter":{"terms":{"_id":[2,3,4]}},"boost":2}}}

因此,上述内容将与其他查询一起包含,但查询只返回完全匹配而不是其余结果。

关于如何做到这一点的任何想法,以便它只是使用id优先处理文档但不过滤整个查询?

2 个答案:

答案 0 :(得分:4)

试试这个(而不是那个match_all(),您可以使用查询来实际过滤结果):

{
  "query": {
    "function_score": {
      "query": {
        "match_all": {}
      },
      "functions": [
        {
          "filter": {
            "terms": {
              "_id": [
                2,
                3,
                4
              ]
            }
          },
          "weight": 2
        }
      ]
    }
  }
}

答案 1 :(得分:0)

如果您需要按照确切的顺序返回

 "sort": [
    {
      "_script": {
        "script": "doc['id'] != null ? sortOrder.indexOf(doc['id'].value.toInteger()) : 0",
        "type": "number",
        "params": {
          "sortOrder": [
            2,3,4
          ]
        },
        "order": "desc"
      }
    },
    "_score"
  ]

P.S。由于@Val提到wityh _id这不起作用,因此您需要将id字段存储为单独的。

如果您需要将文档移到顶部,请查看function_score