V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yodhcn
V2EX  ›  程序员

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

  •  
  •   yodhcn ·
    yodhcn · 124 天前 · 1447 次点击
    这是一个创建于 124 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如说,一个文档包含以下 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" 分词。

    问题:大家遇到过类似的场景吗?又用的哪种方案解决的?
    9 条回复    2023-12-25 20:09:16 +08:00
    yodhcn
        2
    yodhcn  
    OP
       124 天前
    @ericguo #1 这个分词器不是只适配了中文&英文吗?
    matrix1010
        4
    matrix1010  
       124 天前 via iPhone
    专用分词器是指带词库的那种?短文本 title 很适合 ngram ,长文本由于各类干扰词很多而且为了缩减总 token 量才需要词库
    skymei
        5
    skymei  
       124 天前
    方案 1 就挺好,你说的效率低是指的什么情况?搜索速度么,正常 match 的话速度是很快,不会有明显的速度的差异感知
    zuixinwenyue
        6
    zuixinwenyue  
       124 天前
    +1 ,感觉方案 1 比较好,效率问题待验证就是
    lix7
        7
    lix7  
       124 天前
    一般都是方案一,没啥性能问题
    kuituosi
        8
    kuituosi  
       124 天前
    明显是 1 ,关键词可以识别出语言,直接在一种语言是查询
    sadfQED2
        9
    sadfQED2  
       124 天前 via Android
    方案 1 ,不会有性能问题,你太小看 es 了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1202 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 17:54 · PVG 01:54 · LAX 10:54 · JFK 13:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.