elasticSearch 分词器踩的坑

elasticSearch 作为搜索引擎,效率是非常高的。在搜索引擎的选择上,一般是solr和es。两者都是基于lucene的。经简单调研,目前美团酒旅与外卖使用的都是以elasticSearch为主。

es的默认分词器对中文的支持非常不好,所以要使用es,分词器是必须要配置的。以下记录es分词器配置过程中踩的坑。

 

首先ik 分词器与es版本是有严格依赖的,参考git文档 https://github.com/medcl/elasticsearch-analysis-ik

 

安装过程参考官网文档。

安装好了以后在设置ik为默认分词器

配置elasticsearch.yml

增加

index:
   analysis:                  
     analyzer:     
       ik:
           alias: [ik_analyzer]
           type: org.elasticsearch.index.analysis.IkAnalyzerProvider
       ik_max_word:
           type: ik
           use_smart:  false
       ik_smart:
           type: ik
           use_smart:  true
index.analysis.analyzer. default .type: ik
或者简写为
index.analysis.analyzer.ik.type: "ik"
6:重启elasticsearch
kill -9 currentThread  ./elasticsearch -d

这是网上比较普遍的版本,但是设置好了以后测试发现并不生效,还是使用的默认的standard analyzer ,这是怎么回事... 

后来反复尝试多次无果最后参考ik 分词器作者issue。发现问题。https://github.com/medcl/elasticsearch-analysis-ik/issues/269

es 节点层面的默认分词设置已经废弃,不支持了。

解决方法:法一:在索引层面动态设置。

例:

 

PUT http://localhost:9200/index1
{
"settings": {
"refresh_interval": "5s",
"number_of_shards" : 1, // 一个主节点
"number_of_replicas" : 0 // 0个副本,后面可以加
},
"mappings": {
"_default_":{
"_all": { "enabled": false } // 关闭_all字段,因为我们只搜索title字段
},
"resource": {
"dynamic": false, // 关闭“动态修改索引”
"properties": {
"title": {
"type": "string",
"index": "analyzed",
"fields": {
"cn": {
"type": "string",
"analyzer": "ik"
},
"en": {
"type": "string",
"analyzer": "english"
}
}
}
}
}
}
}

如上常见索引后,使用java api 用法如下

boolQueryBuilder.must(QueryBuilders.termQuery("title.cn","迎"));(使用title.cn 不能只用title)

亲测可用。

法二(ik 作者推荐):使用索引模版,关于模版的用法参考官方文档,这里给出自测demo

curl -XPUT 'http://localhost:9200/_template/moban' -d '
{
"template": "te*",
"settings": {
"number_of_shards": 1
},
"mappings": {
"type1": {
"_source": {
"enabled": false
},
"properties": {
title: {
"type": "string",
"analyzer": "ik"
}
}
}
}
}'

创建模版后 title 字段有效,java api 同上。

你可能感兴趣的:(架构,搜索)