【问题标题】:elasticsearch boost importance of exact phrase matchelasticsearch提高精确短语匹配的重要性
【发布时间】:2013-08-28 07:19:11
【问题描述】:

在 elasticsearch 中有没有办法提高文档中出现的确切短语的重要性?

例如,如果我正在搜索短语“web developer”,并且如果“web developer”这两个词一起出现,那么与在整个文档中分别出现的“web”和“developer”相比,它们将被提升 5。因此,任何包含“web developer”的文档都会首先出现在结果中。

【问题讨论】:

    标签: elasticsearch query-string elastica


    【解决方案1】:

    您可以使用bool query 将不同的查询组合在一起,也可以对它们进行不同的提升。假设您对这两个术语都有一个常规的match query,无论它们的位置如何,然后是一个具有更高提升的短语查询。

    类似于以下内容:

    {
      "query": {
        "bool": {
          "should": [
            {
              "match": {
                "field": "web developer"
              }
            },
            {
              "match_phrase": {
                "field": "web developer",
                "boost": 5
              }
            }
          ],
          "minimum_number_should_match": 1
        }
      }
    }
    

    【讨论】:

    • 但是当我想跨多个索引和一组不同的字段执行这样的查询时会发生什么?据我所知 match_phrase 仅适用于特定的字段名称。在我的情况下,我需要(一般来说)使用类似{ "query_string": { "query": "my exact phrase", "fields": ["typeA.fieldA", "typeB.fieldB"] } }
    • [match_phrase] 查询不支持多个字段
    • also: [bool] 查询不支持 [minimum_number_should_match]
    【解决方案2】:

    作为 javanna 答案的替代方案,您可以在 bool 查询中对 mustshould 子句执行类似操作:

    {
      "query": {
        "bool": {
          "must": {
              "match": {
                "field": "web developer",
                "operator": "and"
              }
          },
          "should": {
              "match_phrase": {
                "field": "web developer"
              }
          }
        }
      }
    }
    

    未经测试,但我相信这里的must 子句将匹配包含“web”和“developer”的结果,而should 子句将匹配“web developer”的短语得分更高。

    【讨论】:

    • 是的,这确实与其中包含 web developer 的文档具有更高的相关性,但 OP 想要控制相对重要性(使用数字 5)。例如,在极少数情况下,一个包含大量标记 webdeveloper 的文档可能会击败一个包含单个 web developer 的文档。有了这个答案,您就可以同等重视这两个查询 (ref)。
    【解决方案3】:

    您可以尝试使用 rescore 对您的初始结果运行完全匹配的词组。来自文档:

    “重新评分有助于提高精度,方法是仅对查询和 post_filter 阶段返回的顶部(例如 100 - 500)个文档进行重新排序,使用次要(通常成本更高)算法,而不是将成本高昂的算法应用于索引。”

    https://www.elastic.co/guide/en/elasticsearch/reference/current/filter-search-results.html#rescore

    【讨论】:

      【解决方案4】:

      在我的情况下,我使用了下面的示例查询,它正在工作。它带来了精确 + 模糊的结果,但精确的结果得到了提升!

      { "query": {
      "bool": {
        "should": [
          {
            "match": {
              "name": "pala"
            }
          },
          {
            "fuzzy": {
              "name": "pala"
            }
          }
        ]
      }}}
      

      【讨论】:

        【解决方案5】:

        我认为它的默认行为已经与匹配查询“或”运算符一起使用。它将首先过滤短语“web developer”,然后过滤诸如“web”或“develeper”之类的术语。尽管您可以使用上述答案来提升您的查询。如果我错了,请纠正我。

        【讨论】:

          【解决方案6】:

          我没有足够的声誉来评论James Adison's answer,我同意这一点。 仍然缺少的是增强因子,可以使用以下语法来完成:

          {
            "match_phrase": 
              {
                  "fieldName": {
                      "query": "query string for exact match",     
                      "boost": 10
                   }        
          
                }
          }
          

          【讨论】:

          • 我喜欢这个答案。您可以添加完整的解决方案而不是其中的一部分吗?我的理解是,这仍然需要整个"query": { "bool": { "should": 嵌套。
          猜你喜欢
          • 2021-03-08
          • 1970-01-01
          • 2019-05-08
          • 1970-01-01
          • 2012-02-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-30
          • 1970-01-01
          相关资源
          最近更新 更多