创建索引模板
以下参数配置定义官网都有介绍,这块就直接记录官网的地址,方便查阅。
索引模板的具体参数参考官网:https:///guide/en/elasticsearch/reference/7.9/indices-templates-v1.html
索引setting具体参数参考:https:///guide/en/elasticsearch/reference/7.9/index-modules.html#index-modules-settings
索引mapping具体参数参考:https:///guide/en/elasticsearch/reference/7.9/mapping.html
由于参数定义很多,就不在复制到文中。
一般创建索引要么在kibana中创建,要么代码创建,
java代码创建:
CreateIndexRequest request = new CreateIndexRequest(index);
request.settings("配置json");
request.mapping("配置json");
try {
CreateIndexResponse indexResponse = restHighLevelClient.indices().create(request);
if (indexResponse.isAcknowledged()) {
log.info("创建索引成功");
} else {
log.info("创建索引失败");
}
return indexResponse.isAcknowledged();
} catch (Exception e) {
e.printStackTrace();
}
配置json代码参考:
{
"template": "*",
"order": 0,
"version": 60001,
"settings": {
"index": {
"refresh_interval": "5s",
"analysis": {
"filter": {
"edge_ngram_filter": {
"type": "edge_ngram",
"min_gram": 1,
"max_gram": 50
},
"pinyin_simple_filter": {
"type": "pinyin",
"keep_first_letter": true,
"keep_separate_first_letter": false,
"keep_full_pinyin": false,
"keep_original": false,
"limit_first_letter_length": 50,
"lowercase": true
},
"pinyin_full_filter": {
"type": "pinyin",
"keep_first_letter": false,
"keep_separate_first_letter": false,
"keep_full_pinyin": true,
"none_chinese_pinyin_tokenize": true,
"keep_original": false,
"limit_first_letter_length": 50,
"lowercase": true
}
},
"analyzer": {
"ngramIndexAnalyzer": {
"type": "custom",
"tokenizer": "keyword",
"filter": [
"edge_ngram_filter",
"lowercase"
]
},
"ngramSearchAnalyzer": {
"type": "custom",
"tokenizer": "keyword",
"filter": [
"lowercase"
]
},
"ikIndexAnalyzer": {
"type": "custom",
"tokenizer": "ik_smart"
},
"ikSearchAnalyzer": {
"type": "custom",
"tokenizer": "ik_smart"
},
"pinyiSimpleIndexAnalyzer": {
"tokenizer": "keyword",
"filter": [
"pinyin_simple_filter",
"edge_ngram_filter",
"lowercase"
]
},
"pinyiSimpleSearchAnalyzer": {
"tokenizer": "keyword",
"filter": [
"pinyin_simple_filter",
"lowercase"
]
},
"pinyiFullIndexAnalyzer": {
"tokenizer": "keyword",
"filter": [
"pinyin_full_filter",
"lowercase"
]
},
"pinyiFullSearchAnalyzer": {
"tokenizer": "keyword",
"filter": [
"pinyin_full_filter",
"lowercase"
]
}
}
}
}
},
"mappings": {
"doc": {
"properties": {
"simplePyTitle": {
"type": "text",
"norms": false,
"analyzer": "ngramIndexAnalyzer",
"search_analyzer": "ngramSearchAnalyzer",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
}
}
}
}
上边的配置文件中只配置了一个索引字段simplePyTitle。具体每个字段的含义参考官网。
这里边要知道analyzer和search_analyzer的区别:
分析器主要有两种情况会被使用:
第一种是插入文档时,将text类型的字段做分词然后插入倒排索引,
第二种就是在查询时,先对要查询的text类型的输入做分词,再去倒排索引搜索
如果想要让 索引 和 查询 时使用不同的分词器,ElasticSearch也是能支持的,只需要在字段上加上search_analyzer参数
在索引时,只会去看字段有没有定义analyzer,有定义的话就用定义的,没定义就用ES预设的
在查询时,会先去看字段有没有定义search_analyzer,如果没有定义,就去看有没有analyzer,再没有定义,才会去使用ES预设的
filter和analyzer的区别。
简单说,Document
中的数据是如何转变成倒排索引的,以及查询语句是如何转换成一个个词(Term
)使高效率文本搜索变得可行,这种转换数据的过程就称为文本分析(analysis
)。
analysis
基本概念 === elasticsearch全文搜索引擎会用某种算法(Tokenizer
)对要建索引的文档进行分析, 从文档中提取出若干Token
(词元), 这些算法称为Tokenizer
(分词器), 这些Token
会被进一步处理, 比如转成小写等, 这些进一步的处理算法被称为Filter
(过滤器), 被处理后的结果被称为Term
(词), 文档中包含了几个这样的Term
被称为Frequency
(词频)。 引擎会建立Term
和原文档的Inverted Index(倒排索引), 这样就能根据Term
很快到找到源文档了。
文本分析(analysis
)工作由analyzer
(分析器)组件负责。analyzer
由一个分词器(tokenizer
)和0个或者多个过滤器(filter
)组成,也可能会有0个或者多个字符映射器(character mappers
)组成。
tokenizer
用来把文本拆分成一个个的Token
。Token
包含了比较多的信息,比如Term
在文本的中的位置及Term
原始文本,以及Term
的长度。文本经过tokenizer
处理后的结果称为token stream
。token stream
其实就是一个个Token
的顺序排列。token stream
将等待着filter
来处理。
filter
链将用来处理Token Stream
中的每一个token
。这些处理方式包括删除Token
,改变Token
,甚至添加新的Token。比如变小写,去掉里面的HTML标记, 这些处理的算法被称为Character Filter
(字符过滤器),Elasticsearch中内置了许多filter,读者也可以轻松地自己实现一个filter
。
参考文章:
使用profile查看es执行细节
在操作es时,它的内部是如何执行的呢?可以设置profile:true来查看操作细节:
GET /my-index-000001/_search
{
"profile": true,
"query" : {
"match" : { "message" : "GET /search" }
}
}
返回结果如下:
1、代表在es的某个分片上的信息
2、查询的详细信息
3、累计重写时间
4、Lucene收集器信息
5、聚合操作的信息
更多详细内容参考官网:https:///guide/en/elasticsearch/reference/7.9/search-profile.html
索引字段解释
就拿上边配置的索引字段simplePyTitle举例,解释下各个参数的作用:
"simplePyTitle": {
"type": "text",
"norms": false,
"analyzer": "ngramIndexAnalyzer",
"search_analyzer": "ngramSearchAnalyzer",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
type:字段类型,一般文本都是用text
norms:是否计算分值,false关闭,true会打开,开启后会增加存储等开销。一般不需要对比分值的字段建议关闭
analyzer:分词器名称,名称对应setting中配置的分词器名称。ngramIndexAnalyzer配置如下:
"ngramIndexAnalyzer": {
"type": "custom",
"tokenizer": "keyword",
"filter": [
"edge_ngram_filter",
"lowercase"
]
},
type:分词器类型,es有多种分词器类型,custom代表自定义的分词器。默认为stardard。custom分词器更多介绍参考官网:https:///guide/en/elasticsearch/reference/7.9/analysis-custom-analyzer.htmltokenizer:分词器名称keyword,keyword类型会将字段的整体内容加入到倒排索引,不会再分词。比如存储的字段simplePyTitle内容为“你好周杰伦”,那么存入倒排索引的内容就是“你好周杰伦”不会分为“你好”,“周杰伦”等内容。
filter:该字段是将分词器分完后的结果做filter处理,处理后再放入到倒排索引中,该配置中的"edge_ngram_filter"参考上边关于它的配置:
"edge_ngram_filter": {
"type": "edge_ngram",
"min_gram": 1,
"max_gram": 50
},
配置中的1,50代表会将插入到倒排索引前的数据做处理,处理为2个字段,分别为从头数的第一个字符和从头数1到50长的字符。
比如要存储的字符为abcd...........z....x,假如z为第50个字符,那么会被分为a和abcd.......z连个数据存入到倒排索引。
filter中的lowercase就是将有大写的转为小写。很好理解。
fields:当索引中的某个字段,即要满足全文检索的需要,又有排序聚合搜索等功能时,就需要fields的设置,比如上边的配置,text适合全文检索,而fields中定义的keyword更适合排序和聚合就需要配置成这样。参考官网文档:https:///guide/en/elasticsearch/reference/7.9/multi-fields.html
检索方式
首先要知道索引查询term,match,match_phase,query_string之间的区别,
参考文章:
构建各混合查询,bool、boosting、constant_score、dis_max、function_score
对于混合查询,官网写的很nice了:https:///guide/en/elasticsearch/reference/7.9/compound-queries.html
分词器无法识别的分词
一些词汇,分词器可能无法识别,就需要自定义分词字典库,es会看字典库是符合的分词。
后续还会补充。。