1. 前言
ElasticSearch的分析器实际上是将三个功能封装在一起,这三个功能按照顺序执行,而这三个功能都是能自定义的
字符过滤器 (char_filter
)
首先,字符串按顺序通过每个字符过滤器,他们的任务是在分词前整理字符串,
一个字符过滤器可以用来去掉HTML
,或者将&
转化成and
。
分词器 (tokenizer
)
其次,字符串被分词器分爲单个的词条,一个简单的分词器遇到空格和标点的时候,可能会将文本拆分成词条。
Hello how are you?
会被ES预设的分词器standard
分成hello
、how
、are
、you
Token 过滤器 (filter
)
最后,词条按顺序通过每个 token
过滤器,这个过程可能会改变词条(Quick -> quick
)、删除词条(a、an、and、the.
…)、增加词条(jump
和leap
这种同义词)
2. 自定义分析器
格式:
PUT 127.0.0.1:9200/mytest
{
"setting": {
"analysis": {
"char_filter": { 自定义的字符过滤器 },
"tokenizer": { 自定义的分词器 },
"filter": { 自定义的token过滤器 },
"analyzer": { 自定义的分析器,可以将上面的char_filter、tokenizer、filter用不同的组合拼起来,形成不同的分析器 }
}
}
}
具体实例:
PUT 127.0.0.1:9200/mytest
{
"settings": {
"analysis": {
"char_filter": {
"&_to_and": {
"type": "mapping",
"mappings": ["&=> and "]
},
"xxx": {....},
"yyy": {....}
},
"filter": {
"my_stopwords": {
"type": "stop",
"stopwords": ["the", "a"]
}
},
"analyzer": {
//自定义分析器,将想要的char_filter、tokenizer、filter给加载进来
"my_analyzer": {
"type": "custom",
"char_filter": ["htmp_strip", "&_to_and"], //数组顺序很重要,因为是照顺序执行,先执行htmp_strip,再执行&_to_and,然后才去执行tokenizer
"tokenizer": "standard",
"filter": ["lowercase", "my_stopwords"]
}
}
}
},
"mappings": {
"doc": {
"properties": {
"nickname": {
"type": "text",
"analyzer": "my_analyzer" //使用自定义的分析器
}
}
}
}
}
3. 控制分析器 search_analyzer
、analyzer
分析器主要有两种情况会被使用,一种是插入文档时,将text
类型的字段做分词然后插入倒排索引,第二种就是在查询时,先对要查询的text
类型的输入做分词,再去倒排索引搜索
如果想要让 索引 和 查询 时使用不同的分词器,ElasticSearch也是能支持的,只需要在字段上加上search_analyzer
参数
在索引时,只会去看字段有没有定义analyzer
,有定义的话就用定义的,没定义就用ES预设的
在查询时,会先去看字段有没有定义search_analyzer
,如果没有定义,就去看有没有analyzer
,再没有定义,才会去使用ES预设的
具体实例:
PUT 127.0.0.1:9200/mytest
{
"mappings": {
"doc": {
"properties": {
"nickname": {
"type": "text",
"analyzer": "standard", //索引时使用standard分词器
"search_analyzer": "simple" //查询时使用simple分词器
},
"name": {
"type": "text",
"analyzer": "standard" //索引和查询都使用standard分词器
}
}
}
}
}