elasticsearch/lucene 怎么优化多语言搜索?

136 天前
 yodhcn
比如说,一个文档包含以下 3 个字段:
- title_cn # 中文标题
- title_ja # 日文标题
- title_ko # 韩文标题

需求:无论搜索哪种语言的标题中的关键字,都能搜索到该文档

解决方案一:
[写索引] 为每个字段各建立一个索引,分别设置不同的 analyzer 。
[查索引] "query" match title_cn OR "query" match title_ja OR "query" match title_ko
优点:为每种语言配置不同的语言专用的分词器,分词效果好
缺点:3 个字段分别映射到 3 个倒排索引,搜索时需要到 3 个索引上查找,效率低

解决方案二:
[写索引] 3 个字段通过 copy_to 复制到一个字段,建立一个索引,设置一个语言不敏感的 analyzer ,比如基于 ngram 算法的分词器。
[查索引] "query" match title_all
优点:搜索时只需到 1 个索引上查找,效率高
缺点:分词效果不如对应语言专用的分词器,分词效果差

解决方案三(与方案二基本相同,区别只在 analyzer ):
[写索引] 3 个字段通过 copy_to 复制到一个字段,建立一个索引,设置一个能自动检测语言的 analyzer (实现方式:先检测文本的语言,再使用对应语言专用的分词器分词)
[查索引] "query" match title_all
优点:搜索时只需到 1 个索引上查找,效率高
缺点:如果检测语言的准确率较低,会导致内部使用错误的分词器,最终影响 [写索引] [查索引] 的分词

方案一 & 方案二各有利弊;
方案三似乎解决了问题,但 [自动检测语言] 引入了新的不确定性

矛盾点:
期望不同字段用不同的分词器,并将分词后的词元写入同一个倒排索引。
但是 match 搜索操作,需要对 "query" 也进行分词,所以分词器不同的字段,虽然可以写入到一个索引,但在搜索时无法确定该用哪个分词器对 "query" 分词。

问题:大家遇到过类似的场景吗?又用的哪种方案解决的?
1470 次点击
所在节点    程序员
9 条回复
ericguo
136 天前
yodhcn
136 天前
@ericguo #1 这个分词器不是只适配了中文&英文吗?
HeasyYS
136 天前
matrix1010
136 天前
专用分词器是指带词库的那种?短文本 title 很适合 ngram ,长文本由于各类干扰词很多而且为了缩减总 token 量才需要词库
skymei
136 天前
方案 1 就挺好,你说的效率低是指的什么情况?搜索速度么,正常 match 的话速度是很快,不会有明显的速度的差异感知
zuixinwenyue
136 天前
+1 ,感觉方案 1 比较好,效率问题待验证就是
lix7
136 天前
一般都是方案一,没啥性能问题
kuituosi
136 天前
明显是 1 ,关键词可以识别出语言,直接在一种语言是查询
sadfQED2
136 天前
方案 1 ,不会有性能问题,你太小看 es 了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1003197

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX