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" #要进行分析的文本
}
自定义分词需要在索引的配置中设定,如下:
使用上述自定义的分词进行验证如下:
POST test_index/_analyze
{
"analyzer":"my_custom_alanyzer",
"text":"Is this <b>a box</b>?"
}