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这种同义词)
自定义分析器
格式
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" //使用自定义的分析器 } } } } }
控制分析器 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分词器 } } } } }
ElasticSearch - 自定义分析器
最新推荐文章于 2024-07-05 15:19:18 发布