首页 > 解决方案 > 对具有模糊匹配的多个字段进行弹性搜索,并对多个字段组合分数进行排序

问题描述

我在 Laravel 中使用 Elastic Search,我的索引有 3 个字段text,mood,haloha_id。首先,如果匹配,我想匹配"haloha_id"(将 haloha_id 视为帖子,将文本视为该帖子的评论),然后进行进一步匹配。假设"haloha_id"现在匹配我想匹配“文本”字段中的子字符串,然后匹配“情绪”(整数或者 0、1、2 等)“只有当某些“文本”匹配时才应该匹配情绪,否则不匹配。我正在做 Like Mine 查询意味着仅显示与特定帖子的用户评论匹配的评论。我的查询中的问题是

这是我的查询。

 "query"=>[      

    "bool"=>[                                
        "should"=>[
            "match"=>[
                "text"=>[
                    "query"=>$userHaloha->filtered_text,
                    "fuzziness"=>"AUTO",                
                ]
            ]                           
        ],
        "minimum_should_match"=>1,
        "must"=>[
            "match"=>[
                "mood"=>$userHaloha->mood,            
            ],
            "match"=>[
                "haloha_id"=>$userHaloha->haloha_id
            ]
        ] 

标签: phplaravelelasticsearchlumenfuzzy-search

解决方案


查询是不言自明的。我添加了“haloha_id”来过滤块(它不给文档评分),“文本”到必须阻止(给文档评分)和“心情”到应该阻止(提升文档)

{
  "query": {
    "bool": {
      "filter": [
        {
          "match": {
            "haloha_id": "5ecf6bff25a36366cd134db2"
          }
        }
      ],
      "must": [
        {
          "match": {
            "text": {
              "query": "chilli ",
              "fuzziness": "auto"
            }
          }
        }
      ],
      "should": [
        {
          "term": {
            "mood": {
              "value": 2
            }
          }
        }
      ]
    }
  }
}

情绪问题:3 排名高于情绪:2(在 should 子句中搜索的词)是由于分片

来自文档

如果您注意到具有相同内容的两个文档得到不同的分数,或者完全匹配没有排在第一位,那么问题可能与分片有关。默认情况下,Elasticsearch 让每个分片负责产生自己的分数。但是,由于索引统计信息是得分的重要贡献者,因此只有在分片具有相似的索引统计信息时才有效。假设是,由于默认情况下文档被均匀地路由到分片,因此索引统计信息应该非常相似,并且评分将按预期工作。但是,如果您:

在索引时使用路由、查询多个索引或索引中的数据太少,那么很有可能搜索请求中涉及的所有分片都没有相似的索引统计信息,并且相关性可能很差。

如果您有一个小数据集,解决此问题的最简单方法是将所有内容索引到具有单个分片 (index.number_of_shards: 1) 的索引中,这是默认设置。那么所有文档的索引统计信息将是相同的,并且分数将是一致的。


推荐阅读