Gem 关于 ElasticSearch 做查询时的简繁转换问题

jonnoj · 2018年08月17日 · 最后由 tinyfeng 回复于 2018年08月24日 · 7042 次阅读

在对一个 model 做查询时,想对关键字进行自动转换简繁进行查询。

目前 ES 中存储的 model 数据有简体,也有繁体,所以想实现无论查询关键字是简体还是繁体,都能查找到数据库中对应的结果。

举个例子:

数据库中有一个影片名叫 精靈旅社3:疯狂假期 ,搜索的关键字无论是 精灵旅社 还是 精靈旅社 、甚至是 精灵旅社3 瘋狂假期 都应该能搜索到这个影片。

按项目的说明,我给名为 Movie 的 model 加入了如下配置:

class Movie < ApplicationRecord

  searchkick settings: {
    analysis: {
      analyzer: {
        tsconvert: {
          type: 'custom',
          tokenizer: "tsconvert"
        }
      },
      tokenizer: {
        tsconvert: {
          type: "stconvert",
          keep_both: true,
          convert_type: "s2t"
        }
      },
      char_filter: {
        tsconvert: {
          type: "stconvert",
          convert_type: "s2t"
        }
      }
    }
  }

end

使用:Movie.search('') 搜索后,还是没起作用,命令行的 log 有如下显示:

curl http://localhost:9200/movies_development/_search?pretty -H 'Content-Type: application/json' -d '{"query":{"dis_max":{"queries":[{"match":{"number.analyzed":{"query":"精灵旅社","boost":10,"operator":"and","analyzer":"searchkick_search"}}}......

看起来并没有使用名为 tsconvert 的 analyzer,请教有没有同学做过,我是不是使用的姿势不对?

个人觉得插件配置有点不容易... 其实可以应用程序端 opencc 做转换成简体后存储和查询...

存拼音不就可以了吗

可能楼主举例的这个东西简繁体的译名都是相同的可以用拼音来解决,但是很多东西大陆、港、台三方对同一影视作品等的名称翻译都不尽相同,拼音实在是下下策

其实我倒是想到个方法,就是刷索引的时候多建几个 field 保存不同的信息,然后查询的时候用 or 去查

ywjno 回复

用一个 alias 字段索引进去就可以了,也不需要 or,因为本身就是 fulltext

这种多语言,一般在数据库也是分开存储吧,然后 es 也应该是按照系统当前的语言来搜索才对,需要配置。如果整个系统都是混合语言,那存储估计也是串存,应该都可以搜索到咯!

精靈旅社疯狂假期, 精灵旅社精靈旅社 在写入 ES 时,先全部转化为简体,只存一份。在查询时将所有的繁体转化为简体,再到 ES 查询,可行?

ywjno 回复

这个办法看起来不错,我来试一下。

early 回复

这个方法虽然可行,但比如一下繁体用户在输入繁体查询后,搜索框被转成了简体,体验看起来不太好

就算不把搜索框改成简体,程序来做隐式转换,感觉也是个不太优雅的做法。

我还是先用 #3 楼同学的办法做好了。

谢谢回复。

ywjno 回复

opencc 可以翻译常见词的

换个思路 写的时候就写两份

存的时候,存一份用户输入的文本,再存一份转化为简体的文本。搜索的时候,把用户输入的文字直接转化为简体,去搜索转为简体的文本。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号