前言:

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?"
}