admin

Spring Data Elasticsearch 使用 IK 分词器全文检索
Spring Data Elasticsearch 使用 IK 分词器的方法很简单,只需要在@Field注解中指定...
扫描右侧二维码阅读全文
05
2019/03

Spring Data Elasticsearch 使用 IK 分词器全文检索

Spring Data Elasticsearch 使用 IK 分词器的方法很简单,只需要在@Field注解中指定分词器参数即可,比如下面这样:

@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注解

@Mapping(mappingPath = "torrent_search_mapping.json")
public class Torrent implements Serializable

torrent_search_mapping.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 当数据库使用的,当前数据也不怎么重要,所以直接删除索引重新运行程序就可以了。

Last modification:March 5th, 2019 at 02:37 am
If you think my article is useful to you, please feel free to appreciate

Leave a Comment