1

我有以下布尔查询:

POST _search
{
  "query": {
    "bool" : {
      "must" : {
        "term" : { "title" : "technology" }
      },
      "should" : [
        { "term" : { "text" : "companies that produce hardware" } }
      ]
    }
  }
}

假设这会返回以下文档 ID(按顺序):

1. netflix
2. google
3. microsoft
4. dell
5. intel

在此查询发生之前,我查询一个单独的数据库并获得以下结果(按顺序):

1. intel
2. amazon
3. dell

我想将我的数据库结果优先于 elasticsearch 的结果,以便获得以下结果:

1. intel
2. dell
3. netflix
4. google
5. microsoft

(请注意,亚马逊没有出现,因为我们不是试图凭空创建弹性搜索文档)。

4

1 回答 1

2

您可以使用基于脚本的排序,它允许您根据自定义脚本对数据进行排序。

使用为每个结果分配优先级值的脚本。可能是这样的:

{
  "query": {
    "bool" : {
      "must" : {
        "term" : { "title" : "technology" }
      },
      "should" : [
        { "term" : { "text" : "companies that produce hardware" } }
      ]
    }
  },
  "sort": {
    "_script": {
      "type": "number",
      "order": "asc",
      "script": {
        "lang": "painless",
        "source": "if (doc['company'].value.equals('intel')) return 0;
                   else if (doc['company'].value.equals('amazon')) return 1;                          
                   else if (doc['company'].value.equals('dell')) return 2;                          
                   else return 3;
      }
    }
  }
}

我使用company了字段,因为不鼓励对“_id”字段进行排序,即使它是可能的。看看这个链接

有关更多信息,请检查排序脚本无痛

希望能帮助到你!

于 2017-12-29T00:16:38.557 回答