Spring Data Elasticsearch 使用 IK 分词器全文检索 时间: 2019-03-05 02:37 分类: JAVA Web,修仙日记 Spring Data Elasticsearch 使用 IK 分词器的方法很简单,只需要在`@Field`注解中指定分词器参数即可,比如下面这样: ```java @Field(searchAnalyzer = "ik_max_word",analyzer = "ik_smart") private String fileName; ``` 但是尽管如此,在进行搜索时发现中文搜索结果有种牛头不对马嘴的感觉,于是换成英文单词搜索,结果还是比较正常的。 于是猜想:是不是配置的 IK 分词器没生效? 首先验证 IK 分词器插件是否安装成功,Github 找到 IK 分词器的文档,按照 README 中的例子进行了一遍操作,发现搜索`中国`二字与教程中返回的结果一致,所以排除 IK 分词器没安装成功的可能。 那就只能是 Spring Data Elasticsearch 的原因了,由于项目中直接使用 Spring Data Elasticsearch 自动创建索引以及 mapping,所以在命令行查看: ``` curl -XGET "http://127.0.0.1:9200/索引名字/_mapping?pretty" ``` 发现 mapping 里面的一些字段居然没有设置 IK 分词器,所以问题就是出在这里了,解决办法: 实体类添加`@Mapping`注解 ```java @Mapping(mappingPath = "torrent_search_mapping.json") public class Torrent implements Serializable ``` torrent_search_mapping.json 内容如下: ```json { "torrent": { "properties": { "createDate": { "type": "long" }, "fileName": { "type": "text", "analyzer": "ik_max_word", "search_analyzer": "ik_max_word", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "fileSize": { "type": "long" }, "fileType": { "type": "text", "analyzer": "ik_max_word", "search_analyzer": "ik_max_word", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "files": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } } } } } ``` 对于以前的数据,网上有人说删除 mapping,然后重建 mapping 运行程序即可,但是查看 Elasticsearch 官方文档发现,在后面的版本已经不支持删除 mapping 的操作了,只能直接删除索引。 由于我是直接拿 Elasticsearch 当数据库使用的,当前数据也不怎么重要,所以直接删除索引重新运行程序就可以了。 标签: 无