elasticSearch 分词器踩的坑

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yu280265067/article/details/71107658

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 同上。

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试

关闭