Elasticsearch对来自多个索引的结果进行排序,因此一个索引具有优先级

时间:2019-06-19 18:44:22

标签: sorting elasticsearch indexing

我有6个网站,可以将它们称为A,B,C,D,E和M。M是主网站,因为您可以从中搜索其他网站的内容,我通过使用所有索引轻松完成了此操作在搜索查询中用逗号分隔。

但是我现在有一个新的要求,即从每个网站上您都可以搜索所有网站(操作简便,将M的解决方案应用于所有网站),但是优先考虑当前网站的结果。

因此,如果我从C中进行搜索,则首先应从C中获得结果,然后再根据得分从其他结果中获得结果。

现在,我如何赋予一个索引优先于其余索引的结果?

1 个答案:

答案 0 :(得分:1)

boosting query很好地达到了这个目的:

样本数据

POST /_bulk
{"index":{"_index":"a"}}
{"message":"First website"}
{"index":{"_index":"b"}}
{"message":"Second website"}
{"index":{"_index":"c"}}
{"message":"Third website"}
{"index":{"_index":"d"}}
{"message":"Something irrelevant"}

查询

POST /a,b,c,d/_search
{
  "query": {
    "boosting": {
      "positive": {
        "match": {
          "message": "website"
        }
      },
      "negative": {
        "terms": {
          "_index": ["b", "c", "d"]
        }
      }, 
      "negative_boost": 0.2
    }
  }
}

响应

{
  ...
  "hits" : {
    "total" : {
      "value" : 3,
      "relation" : "eq"
    },
    "max_score" : 0.2876821,
    "hits" : [
      {
        "_index" : "a",
        "_type" : "_doc",
        "_id" : "sx-DkWsBHWmGEbsYwViS",
        "_score" : 0.2876821,
        "_source" : {
          "message" : "First website"
        }
      },
      {
        "_index" : "b",
        "_type" : "_doc",
        "_id" : "tB-DkWsBHWmGEbsYwViS",
        "_score" : 0.05753642,
        "_source" : {
          "message" : "Second website"
        }
      },
      {
        "_index" : "c",
        "_type" : "_doc",
        "_id" : "tR-DkWsBHWmGEbsYwViS",
        "_score" : 0.05753642,
        "_source" : {
          "message" : "Third website"
        }
      }
    ]
  }
}

注释

  1. 您制作的negative_boost越小,“活动索引”结果胜过其他索引的可能性就越大
  2. 如果将negative_boost设置为0,则可以保证“活动站点”的结果排在第一位,但是您将舍弃所有其他站点的所有分数,因此剩下的将是任意的。

我认为negative_boost: 0.1之类的东西对相关性进行了幅度调整,应该能为您提供所需的东西。