Elasticsearch 对于多语言字段的处理 时间: 2021-05-01 19:58 分类: JAVA ####前言 问题来源于之前写的一个项目:[https://github.com/xwlcn/Dodder](https://github.com/xwlcn/Dodder) 这是一个`磁力爬虫`的项目,爬取的是世界各地的种子资源,因此文件名会存在各种语言,因此就有了`Elasticsearch`对于多语言字段处理的需求。 ####解决问题 在这里,我不想去处理世界上所有的语言,因为这不现实,因此也只是说下在使用`IK分词器`时候出现的问题。 本打算就靠`IK分词器`简单处理下算了,但是,发现资源中`俄语`出现的频率还是比较高的,同时`韩语`、`日语`也比较常见,但发现`IK`虽然不擅长处理这两种语言,但是勉强还能过得去。 至于`俄语`,测试发现,`IK分词器`会直接丢掉俄语单词。 因此,仅仅靠`IK分词器`看样子是不行了,于是搜索一番,发现大多数解决方案就是使用`fileds`来解决,有点 redis 中`Map`的意思,比如`fileName`字段,多语言就是`fileName.cn`、`fileName.en`、`fileName.ru`等。 每个`field`都可以单独设置`分词器`。 但是,这样真的好吗?我的猜测是这样的:每个`field`都会进行`分词 索引`,增加了磁盘以及内存开销。 因为`fileName`文件名一般同时最多包含两种语言,大多数情况下,都有一个`主语言`,因此,如果我们先检测出`主语言`,然后根本就没必要建立多个索引了。 比如我知道了是`俄语`,那么`fileName.cn`、`fileName.en`还去`分词 索引`是不是显得很多余了。 于是放弃使用`fileds`的方法。 最终决定做法就是:先检测出语言,然后另外设置到单独定义的字段中去,比如我这里只处理了`中文`与`俄文`,那么就建立两个字段:`fileName(默认)`、`fileNameRu(俄文)` 对于中文使用`IK分词器`、俄文使用`simple`分词器: ``` { "properties": { "fileName": { "type": "text", "analyzer": "my_ik_max_word", "search_analyzer": "my_ik_smart" }, "fileNameRu": { "type": "text", "analyzer": "simple", "search_analyzer": "simple" }, "createDate": { "type": "keyword" }, "fileSize": { "type": "long", "index": false }, "fileType": { "type": "text", "analyzer": "comma", "search_analyzer": "comma" }, "isXxx": { "type": "keyword" } } } ``` 这样做的缺点就是代码中建立索引的时候需要先判断字符串语言,查询的时候我们也可以先判断啊语言,但这里不判断也是可以的,查询可以这么写: ``` boolQuery.must(multiMatchQuery(request.getFileName(), "fileName", "fileNameRu")); ``` 其优点就是减少索引数量,数据量越大提升的性能越明显。 标签: 无