前言:
es中的分词器由三部分组成
1、character filter:作用:先对要进行分析的文本进行一下过滤,比如html文档,去除其中的标签,比如<p>、<html>等等;
2、tokenizer:作用:对文本进行分词,把要进行分析的文本根据所指定的规则,按照其规则把文本拆分为单词,,只可以指定一个;
3、tokenizer filter:作用:把分好的词条(也即将tokenizer分好的词)进一步进行过滤,根据指定的filter把其识别的没用的词条给删除,或者增加(比如增加某些词的同义词)、修改(比如将testing、tested这种词同意为test)词条,可以指定多个。
[分词使用场景]:
- 创建或者更新文档时候,会对相应的文档进行分词处理
- 查询时,会对查询语句进行分词
- 注意,index时所用的分词器和查询时所用的分词器可不一样,可通过"analyzer"指定index时分词器,通过"search_analyzer"指定查询时分词器,但建议是设置成一样的,不然不利于查询(”put test_index{"mappings":{"doc":{"properties":{"title":{"type":"text","analyzer":"whitespace","search_analyzer":"standard"}}}}})
es提供有测试分词的接口,endpoint是_analyze,
如下三种方式:
1)可以直接指定analyzer进行测试
post _analyze
{
"analyzer":"stardard", #指定的分词器
"text":"hello world" #要进行分析的文本
}
2)可以直接指定索引中的字段进行测试
post index_name/_analyze
{
"field":"firtname", #要进行分析的索引中的字段
"text":"ni cai" #要进行分析的文本
}
3)可以自定义分词器进行测试
post _analyze
{
"tokenizer":"standard", #指定的分词器
"filter":["lowercase"], #对分析后的词最后进行小写转换
"text":"hello world" #要进行分析的文本
}
自定义分词:
character filter的测试:
post _analyze
{
"tokenizer":"keyword",#指定的分词器,keyword分词不对要进行分析的文本划分为多个词条
"char_filter":["html_strip"], #指定的字符过滤器,这个html_strip过滤器会把文本中的html相关标签给去掉
"text":"<p>I'm so <b>happy</b>!</p> #要进行分析的文本
}
tokenizer的测试:
post _analyze
{
"tokenizer":"path_hierarchy", #指定的规则
"text":"/one/two/three" #要进行分析的文本
}
tokenizer filter的测试:
post _analyze
{
"text":"The hello world!", #要进行分析的文本
"tokenizer":"standard", #使用的分词规则
"filter":[ #使用的tokenizer filter
"stop",
"lowercase",
{
"type":"ngram",
"min_gram":4,
"max_gram":4
}
]
}
自定义分词需要在索引的配置中设定,如下:
put test_index
{
"settings":{
"analysis":{
"char_filter":{},
"tokenizer":{},
"filter":{},
"analyzer":{} #这里边引用以上三行定义的规则,从而构成分词器
}
}
}
具体的自定义分词器的使用
PUT test_index
{
"settings":{
"analysis":{
"analyzer":{
"my_custom_analyzer":{
"type":"custom",
"tokenizer":"standard",
"char_filter"[
"html_strip
],
"filter":[
"lowercase",
"asciifolding"
]
}
}
}
}
}
使用上述自定义的分词进行验证如下:
POST test_index/_analyze
{
"analyzer":"my_custom_alanyzer",
"text":"Is this <b>a box</b>?"
}
再来一个例子:
首先在索引中设置:
PUT test_index2
{
"settings":{
"analysis":{
"analyzer":{
"my_custom_analyzer":{
"type":"custom",
"char_filter":[
"emotions"
],
"tokenizer":"punctuation",
"filter":[
"lowercase",
"english_stop"
]
}
},
"tokenizer":{
"punctuation":{
"type":"pattern",
"pattern":"[.,!?]"
}
},
"char_filter":{
"emotions":{
"type":"mapping",
"mappings":[
":) => _happy_",
":( => _sad_"
]
}
},
"filter":{
"english_stop":{
"type":"stop",
"stopwords":"_english_"
}
}
}
}
}
实例测试:
POST test_index2/_analyze
{
"analyzer":"my_custom_analyzer",
"text":"I'm a :) person, and you?"
}