【问题标题】:Elasticsearch sort results from several indexes so that one index has priorityElasticsearch 对多个索引的结果进行排序,以便一个索引具有优先级
【发布时间】:2019-11-02 13:39:16
【问题描述】:

我有 6 个网站,我们称它们为 A、B、C、D、E 和 M。M 是主网站,因为您可以从中搜索其他网站的内容,我通过使用所有索引很容易做到这一点在搜索查询中用逗号分隔。

不过我现在有个新要求,就是每个网站都可以搜索所有网站(很简单,把M的解决方案应用到所有网站),但是优先考虑当前网站的结果。

所以如果我从 C 中搜索,首先结果应该来自 C,然后根据分数来自其他结果。

现在,我如何让一个索引优先于其他索引的结果?

【问题讨论】:

    标签: sorting elasticsearch indexing


    【解决方案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 这样的东西,它是对相关性的一个数量级调整,应该可以为您提供所需的内容。

    【讨论】:

    • 现在有没有办法限制结果的数量?因为对于没有提升的搜索,我会得到 600 个结果,现在我得到了超过 1800 个,我认为这接近于文档的总数,就像它不再有“截止点”一样。即使文档中没有关键字,它也会列出文档。
    • 据记录(以及我在 ES 6.6 和 7.1 中测试过的),提升查询应该只包含与 positive 查询子句匹配的结果。您确定结果实际上没有您搜索的任何关键字吗?关于您在该查询中使用的positive 子句,您还有什么可以分享的吗?
    • 绝对不是,在这个链接上你可以看到我的 unboosted 然后 boosted 查询:pastebin.com/WeH5iNg7 这是最后一个结果,准确地说是第 1660 分,它甚至有 1.5 分! !它只是一个被索引的示例空文档。然而,当搜索“dna”时,它会出现......pastebin.com/ssvcwpX2
    • 问题不在于提升查询,而在于您构建主布尔查询的方式。如果您同时包含must 子句和should 子句,则minimum_should_match 实际上默认为0(即-存在must 子句意味着您不再需要至少1 个should 子句来命中) .我建议进行两项更改:(#1)将明确的minimum_should_match: 1添加到您的顶级布尔和(#2)将您的must切换为filter(日期范围的东西似乎没有帮助评分/相关性,过滤器更便宜):pastebin.com/ZjpZQsM3
    猜你喜欢
    • 2021-01-13
    • 1970-01-01
    • 2011-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-28
    • 2018-07-08
    • 2016-05-21
    相关资源
    最近更新 更多