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

我在 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

            ]

        ] 


慕桂英4014372
浏览 364回答 1
1回答

慕桂英3389331

查询是不言自明的。我添加了“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) 的索引中,这是默认设置。那么所有文档的索引统计信息都是相同的,并且分数将是一致的。
打开App,查看更多内容
随时随地看视频慕课网APP