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
这是网上比较普遍的版本,但是设置好了以后测试发现并不生效,还是使用的默认的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 同上。