-
Notifications
You must be signed in to change notification settings - Fork 61
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Proposal] meilisearch 搜索调优 #229
Comments
这个searchable的设置居然是带权重的… |
summery部分可否通过更改jieba的词库,来达到让其不要把一些很泛泛的词分出来的效果?可能能避免一些比较离谱的结果 |
应该可以吧? |
初步想了几个方案
|
This comment was marked as outdated.
This comment was marked as outdated.
现在一共 40w 条条目,每天更新排名会更新几十万条数据。经过一段时间之后 meilisearch 就会崩溃并且无法写入,虽然删除旧文件并且重建搜索只需要半小时,但是需要额外盯着监控系统确定 meilisearch 没有挂掉... 🤔 不知道是 meili 本身的问题还是我们误用了,也可能是 meili 可能不太适合这种使用场景。 暂时的解决方案直接忽略掉binlog里面排名这一列的更新,只有在别的列更新的时候才会触发数据更新,更新整个条目数据。所以现在 meili 里的数据的排名大概率不准。 如果未来这个问题比较严重,可能考虑放弃现在的近实时更新改为每周更新,或者改用 ES。 上游有些相关的 issue,可能在 v0.30 能被修复 meilisearch/meilisearch#2628 |
这些更新是一次性提交的,还是一个个提交的?后者会创建10w次更新任务(如果没有主动开启自动batch的话) |
开了auto-batch分别提交的,看grafana,meili大概是分成了3个batch处理 不开batch的话meili的处理速度跟不上,会一直积累任务 ... |
现在暂时只修改了rank rule和searchable的排序,还没有拆分名称字段。之前没仔细看漏掉了,下次再做 |
v0.29依旧有崩溃的情况。现在升级到了 v0.30.1,再观察一下 |
meilisearch用得不爽可以换成typesense试试,API很类似,从我这边的应用(~1M x (titles,authors,tags)看,索引速度和大小都比meilisearch好很多。 |
TypeSense 好像不支持中文分词 |
加 |
meilisearch 现在看起来没啥问题了,以后再考虑 🤔 |
感觉可以考虑把 infobox 里的别名也 index 一下,现在用中文还是很难搜到想要的结果的样子 |
我记得现在有吧 |
https://github.com/bangumi/server/blob/master/internal/search/index.go#L71-L97 从这里看好像没有的样子 QAQ |
|
|
#582 |
抱歉最近有些鸽,不过终于还是写完了。要看结论的话最末尾有 TL;DR。这里写得比较长主要是为了留一个记录,如果以后有人想继续这部分的工作也有一个上手的入口。
Proposal: meilisearch 搜索调优
背景
bangumi 新后端使用 meilisearch 提供全局关键字搜索能力,预期比现有后端搜索功能更好地支持模糊匹配。但当前使用 meilisearch 的默认索引参数,字段查询顺序也未根据需要进行调整。这导致了部分关键词返回结果与预期相差较大。
本提案目标即为对这些现象进行调优。
字段数据的使用
目前 bangumi 的每个 subject 有如下字段(命名可能与代码或数据库中的不一致):
meilisearch 中对字段的处理
可搜索字段指的是每个在 meilisearch 中的文档(等同于 mongodb 的 document 或 mysql 的 row)的哪些字段能被用来匹配关键字。可搜索字段在文档中的顺序被视为该字段的优先级。
可显示字段指搜索结果中返回哪些字段,类似于数据库查询的 select。本提案不包含对字段可见性进行约束。
distinct 字段指多个文档如何在搜索结果中被判断为相同的,用于令搜索结果仅包含其中一条。官方的例子是在电商搜索中用于合并SKU,感觉也用不到。
可过滤与可排序字段指文档中的哪些字段是能作为过滤条件或排序条件的,这些字段更像是数据库中“字段”的概念,他们能够被逻辑运算直接处理,而不是分词后进行模糊匹配。常用于精准匹配或固定的分类过滤,以及按某种顺序排序。
字段的选取
根据上述概念,我将 bangumi subject 的字段分为三类,他们之间可能有重叠。
meilisearch 的搜索规则
Ranking rules 是 meilisearch 对搜索规则的称呼。其内置了6种搜索规则,具体含义比较复杂,可在这里查看,优先级按数组成员顺序排列:
同时还支持对可过滤参数(filterable attributes)添加排序规则,以影响搜索结果的顺序。类似于若需要在搜索结果中将榜单排名靠前的条目尽量优先展示,可以配置为:
本提案的具体目标
因而,本提案将从两方面对搜索结果进行调优
检验集的建立
目前开发团队并未针对搜索设置测试样例,而我对此也无法称得上专业,同时我仅对动画条目的数据比较熟悉(因此本提案可能会存在对其他类型的 subject 不够适用的情况,请注意)。
故仅凭经验(aka 拍脑袋)选取常用的几种 case,如下:
现状分析
描述的权重非常高,经常导致非常不相关的条目出现在结果前排,仅仅因为这个关键词在 summary 中出现过。
如搜索“哥布林”,毫不相干的两个「偷影子的老鼠」条目横割开了更合理的两个「哥布林杀手」条目。这一问题在使用模糊且通用的搜索词,如「loli」时更为严重。
tags 也对搜索结果影响巨大,如搜索「林明美」,第一个条目竟然是「天元突破 Parallel Works 2」……因为 tag 里有人打了 「林明美」(同名动画师)的标签……
匹配规则的权重不合理,仍然是搜索「林明美」,排在结果第四位的「アニ*クリ15」让事情更加离谱。其仅仅是因为 summary 非常长,里面出现了很多「美」字(美术、美少女、美国……),就出现在了搜索结果中。
系列作品的排序顺序不合理
调优
字段的优化
当前设置的 searchable 列表为:
Summary, Tag, Name
(这里的Name同时包括了 name、nameCN和infobox中的“别名”),这是导致上述多个问题的主要原因。我将其修改为:优化后前述 summary 占用过高权重的问题消失。
优化 ranking rules
默认的 ranking rules 以关键词匹配到的数量为最优先事项,这在 searchable attributes 较多,且包含 tags 这种字段的情况下明显不适合。
甚至官方的示例(电影条目搜索,与 bangumi 的场景非常相似)都是以此为反例说明如何调整 ranking rules……那么我们不妨先采用官方在这个场景下推荐的优先级:
这优化了前述4的问题。
将 summary 移出可搜索字段
以上优化之后,问题3仍然不能得到很好的解决。同时,在设置关键词 cases 的过程中,也同样见到了许多相似的情况。
究其原因,summary 虽然是该条目的「简介」,但实际上其内容往往不局限于条目故事内容本身,经常包含对动画创作背景、制作人员、获得奖项等的介绍,这引入了大量毫不相干的关键词。
尝试将其去除,获得了很好的效果。
关于移除 summary 对搜索结果影响的进一步探讨
可能你会担心将 summary 移除出可搜索字段会导致一部分条目更难以被搜索到,我也曾有这个担心。但就像上一节所说,将其保留会导致远远更广泛的问题。更何况包含 summary 真的能提供更多的信息以供人检索吗?
Bangumi 条目的标签功能对搜索结果的优化意义重大,这一“由用户产生的标签”无疑是与“用户使用标签搜索”背后对于“标签”的理解是一致的,换句话说可以这么认为,标签功能为搜索提供了非常精准的人工优化。可能被用于搜索的关键词通常都能在这里找到,它比由机器胡乱分词(jieba 的分词效果也就那么回事……)的 summary(多数情况下)更精准和覆盖面更广。
所以至少在我的测试中,去除 summary 效果更好一些。
遗留问题
infobox 数据的标准化
由于我暂时没找到合适的方案解析 infobox 的数据,所以我提出的方案相比于现有方案,反而还少了 infobox 中的“别名”,但这部分是应该包含的,建议排在 nameCN 后面。
infobox 中其他的数据可能也有可以拿来用的,特别是用于精确匹配的高级搜索中的某个项目(如提供精准匹配某个制作公司、监督或出版社的功能)。但是因为 infobox 中的数据没有很好地标准化(至少在我看来是这样),所以这部分不在本次的考虑范围内,也许后续能有其他人继续研究这方面的内容吧。
一些边缘 case
这里列举一些早期想要优化掉,但实际上并没有找到方案的 case。
TL;DR
The text was updated successfully, but these errors were encountered: