在弹性搜索中不过滤的情况下提升匹配术语查询的结果

Posted

技术标签:

【中文标题】在弹性搜索中不过滤的情况下提升匹配术语查询的结果【英文标题】:Boost results matching terms query without filtering in elasticsearch 【发布时间】:2015-10-22 21:30:19 【问题描述】:

上下文:我对 ElasticSearch 比较陌生,所以也许我缺少一个概念。

我想提高具有一个或多个标签的文档的相关性分数(标签越多,分数越高),而不过滤掉没有任何标签的文档。

尝试过的解决方案:

我尝试使用术语查询:


  "query": 
    "terms": 
      tags: ['some','tags','to','boost'],
      minimum_should_match: 0
    
  

minimum_should_match 选项似乎被忽略了(文档对此不太清楚,但我认为此选项必须不为零)。

我还尝试使用带有match_allbool should 查询“作弊”:


  "query": 
    "bool": 
      "should" : [
        "terms": tags: ['some','tags','to','boost'],
        "match_all": 
      ]
    
  
    

但由于某种原因,没有任何标签的结果无论如何都会被过滤掉。

我还尝试使用function_scoreboosting_query,但无法找出保留术语查询生成的相关性分数的有效语法。

编辑:

本着“布尔作弊”的精神,似乎有一个可行的解决方案:


  "query": 
    "dis_max": 
      "queries" : [
        "terms": tags: ['some','tags','to','boost'],
        "match_all": 
      ]
    
  
 

但是:

这感觉很老套, 我不知道如何精确控制在这种情况下生成的相关性

问题:我觉得这一定是一个常见且简单的用例,那么有没有办法使用terms查询而不过滤掉不匹配的文档?

【问题讨论】:

对minimum_should_match 给出了很好的解释,即没有必需子句的布尔查询应该至少匹配一个可选子句。但是我不确定为什么您在 OP 中提到的第一个所谓的“布尔作弊”不起作用,似乎对我有用 抱歉耽搁了,假期回来了 ;) 我认为这与我使用的 gem 有关(我正在使用带有 Chewy 的 Rails,它基于“官方”elasticsearch gem )。不知何故,该库构建了一个奇怪的查询,它与我的预期不完全匹配,如果我发现更多,稍后会返回 【参考方案1】:

即使这样也可以解决您的问题:

https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-boosting-query.html

您可以使用0 的负提升。

【讨论】:

以上是关于在弹性搜索中不过滤的情况下提升匹配术语查询的结果的主要内容,如果未能解决你的问题,请参考以下文章

将聚合限制为弹性搜索中的热门内容

应用聚合后过滤掉弹性搜索中的术语聚合桶

我如何在 Elastic Search 中获得完全匹配过滤器结果

如何使用Hibernate Search查询DSL匹配多个术语?

在 Algolia 索引中搜索准确的术语

如何在 es6 中仅比较和过滤两个对象数组中不匹配的数组