为了账号安全,请及时绑定邮箱和手机立即绑定

Elastic Search 对多个字段进行模糊匹配,并对多个字段组合得分进行排序

Elastic Search 对多个字段进行模糊匹配,并对多个字段组合得分进行排序

PHP
慕桂英4014372 2023-04-21 14:14:43
我在 Laravel 中使用 Elastic Search,我的索引有 3 个字段text,mood,haloha_id。首先,我想匹配"haloha_id"(将 haloha_id 视为帖子,将文本视为该帖子的评论)如果匹配,则进行进一步匹配。假设"haloha_id"匹配现在我想匹配“文本”字段中的子字符串,然后匹配“心情”(整数或者 0,1,2 等)“只有当某些“文本”匹配时才匹配心情,否则不匹配。我正在制作 Like Mine 查询意味着与特定帖子的用户评论匹配的评论将仅显示。我的查询中的问题是我自己的评论没有出现在顶部因此它匹配 100%如果某人的“心情”和“评论”与我的 100% 匹配,那么它就不会出现在顶部。我删除了与“心情”相关的查询,但分数没有影响,这意味着分数不包括心情匹配的分数。这是我的查询。 "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            ]        ] 
查看完整描述

1 回答

?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

查询是不言自明的。我添加了“haloha_id”来过滤块(不对文档评分),“text”添加到 must 块(给文档评分),“mood”添加到 should block(提升文档)


{

  "query": {

    "bool": {

      "filter": [

        {

          "match": {

            "haloha_id": "5ecf6bff25a36366cd134db2"

          }

        }

      ],

      "must": [

        {

          "match": {

            "text": {

              "query": "chilli ",

              "fuzziness": "auto"

            }

          }

        }

      ],

      "should": [

        {

          "term": {

            "mood": {

              "value": 2

            }

          }

        }

      ]

    }

  }

}

mood:3 中的问题比 mood:2(should 子句中的搜索词)排名更高是由于分片

来自文档

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

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

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


查看完整回答
反对 回复 2023-04-21
  • 1 回答
  • 0 关注
  • 363 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信