php - 对具有模糊匹配的多个字段进行弹性搜索,并对多个字段组合分数进行排序
问题描述
我在 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
]
]
解决方案
查询是不言自明的。我添加了“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) 的索引中,这是默认设置。那么所有文档的索引统计信息将是相同的,并且分数将是一致的。
推荐阅读
- java - 对 Hashtable JSP 的每个元素使用子字符串
- r - OS-Version 和 R-Version 稳定的 Docker 镜像
- excel - Excel 宏调用不适用于计时器,但适用于另一个宏
- excel - 当指定的字符串出现在行中时,VBA Excel将数据从一个工作簿复制到另一个工作簿
- list - Linq 从字符串列表中获取元素以及该列表中字符的位置
- vba - 我可以在 Access 中使用 VBA 来确定用户是否打开了多个数据库实例?
- google-chrome - HTTP 302 上的不同浏览器行为
- java - PoolingHttpClientConnectionManager 的实现
- react-native - 反应本机导航 - 状态更改时不会重新渲染材质顶部选项卡
- javascript - 一旦永远计算,我们如何存储几个变量的实例?