本文共 5964 字,大约阅读时间需要 19 分钟。
官网:
在ES中一个Analyzer 由下面三种组件组合而成:
POST _analyze{ "analyzer": "whitespace", "text": "The quick brown fox."}返回结果如下:
{ "tokens": [ { "token": "The", "start_offset": 0, "end_offset": 3, "type": "word", "position": 0 }, { "token": "quick", "start_offset": 4, "end_offset": 9, "type": "word", "position": 1 }, { "token": "brown", "start_offset": 10, "end_offset": 15, "type": "word", "position": 2 }, { "token": "fox.", "start_offset": 16, "end_offset": 20, "type": "word", "position": 3 } ]}
POST _analyze{ "tokenizer": "standard", "filter": [ "lowercase", "asciifolding" ], "text": "Is this deja vu?"}返回结果:
{ "tokens": [ { "token": "is", "start_offset": 0, "end_offset": 2, "type": "", "position": 0 }, { "token": "this", "start_offset": 3, "end_offset": 7, "type": " ", "position": 1 }, { "token": "deja", "start_offset": 8, "end_offset": 12, "type": " ", "position": 2 }, { "token": "vu", "start_offset": 13, "end_offset": 15, "type": " ", "position": 3 } ]}
官网:
当一段内容提交时,字符过滤器会按照规则过滤一些特殊字符,ES提供了几种常用的字符过滤器,如下:
HTML Strip Character Filter
用来过滤html标签
测试:
POST _analyze{ "tokenizer": "keyword", "char_filter": [ "html_strip" ], "text": "I'm so happy!
"}
返回结果:
I'm so happy!
在索引中配置如下:
PUT my_index{ "settings": { "analysis": { "analyzer": { "my_analyzer": { "tokenizer": "keyword", "char_filter": ["my_char_filter"] } }, "char_filter": { "my_char_filter": { "type": "html_strip", "escaped_tags": ["b"] } } } }}
- char_filter中定义自己的字符过滤器
- escaped_tags用来指定例外的标签。如果没有例外标签需配置,则不需要在此进行定义
- analyzer中定义自己的分析器,分析器有一系列的分词器或过滤器构成,在这里引用了my_char_filter过滤器
Mapping Character Filter
用指定的字符串替换文本中的某字符串
Pattern Replace Character Filter
进行正则表达式替换
官网地址:
ES内部提供了很多分词器,基本可以满足日常使用。
但是ES中没有提供中文分词器,集成中文分词器请跳转:集成的中文分词器IKAnalyzer中提供的tokenizer名称为:ik_smart、ik_max_word
测试tokenizer:
POST _analyze{ "tokenizer": "standard", "text": "张三说的确实在理"}POST _analyze{ "tokenizer": "ik_smart", "text": "张三说的确实在理"}
官网:
ES内部提供了很多Token分词过滤器,主要用于分词或查询过后,如何进行后续的处理和过滤,如转小写过滤器、停用词过滤器、同义词过滤器等等。
IKAnalyzer中文分词器中自带有停用词过滤功能。
这里举个例子说明同义词过滤器如何工作的。
定义一个带有同义词过滤器功能的索引:
PUT /test_index{ "settings": { "index" : { "analysis" : { "analyzer" : { "my_ik_synonym" : { "tokenizer" : "ik_smart", "filter" : ["synonym"] } }, "filter" : { "synonym" : { "type" : "synonym", "synonyms_path" : "analysis/synonym.txt" } } } } }}
在analysis/synonym.txt文件中定义同义词:
张三,李四电饭煲,电饭锅 => 电饭煲电脑 => 计算机,computer
- 文件一定要UTF-8编码
- 一行一类同义词,=>表示标准化为后面的词
紧接着测试如下:
POST test_index/_analyze{ "analyzer": "my_ik_synonym", "text": "张三说的确实在理"}POST test_index/_analyze{ "analyzer": "my_ik_synonym", "text": "我想买个电饭锅和一个电脑"}
官网:
Analyzer是字符过滤器、分词器、词项过滤器的集合,ES内建的和集成的analyzer都可以直接使用,如果不能满足我们的需求,则我们可以自己组合字符过滤器、分词器、词项过滤器来定义自定义的analyzer。
ES内部提供的analyzer:
自定义analyzer需要遵守以下规则:
- 字符过滤器:0或多个
- 分词器:必须有且只有一个
- 词项过滤器:0或多个
PUT my_index8{ "settings": { "analysis": { "analyzer": { "my_ik_analyzer": { "type": "custom", "tokenizer": "ik_smart", "char_filter": [ "html_strip" ], "filter": [ "synonym" ] } }, "filter": { "synonym": { "type": "synonym", "synonyms_path": "analysis/synonym.txt" } } } }}
- tokenizer:指定分词器
- char_filter:指定字符过滤器
- filter:指定词项过滤器
PUT /my_index10{ "settings": { "analysis": { "analyzer": { "default": { "tokenizer": "ik_smart", "filter": [ "synonym" ] } }, "filter": { "synonym": { "type": "synonym", "synonyms_path": "analysis/synonym.txt" } } } }, "mappings": { "_doc": { "properties": { "title": { "type": "text" } } } }}
测试一下:
PUT my_index10/_doc/1{ "title": "张三说的确实在理"}GET /my_index10/_search{ "query": { "term": { "title": "张三" } }}
很多时候,希望指定字段使用不同的分析器,而不是这个索引,因此可以按照如下定义:
PUT my_index8/_mapping/_doc{ "properties": { "title": { "type": "text", "analyzer": "my_ik_analyzer" } }}
如果指定该字段在查询的时候使用不同的分析器,则可以这样定义:
PUT my_index8/_mapping/_doc{ "properties": { "title": { "type": "text", "analyzer": "my_ik_analyzer", "search_analyzer": "other_analyzer" } }}
测试:
PUT my_index8/_doc/1{ "title": "张三说的确实在理"}GET /my_index8/_search{ "query": { "term": { "title": "张三" } }}
可以为每个查询、每个字段、每个索引指定分词器。
在索引阶段ES按照如下顺序选用分词:
- 首先选用字段mapping定义中指定的analyzer
- 字段定义中没有指定analyzer,则选用 index settings中定义的名字为default 的analyzer
- 如index setting中没有定义default分词器,则使用 standard analyzer
在查询阶段ES按照如下顺序需用分词
- 在查询语句中指定的analyzer
- 在字段mapping的search_analyzer中定义的analyzer
- 在字段mapping中定义的analyzer
- 在index settings中名为default_search的analyzer
- 在index settings中名为default的analyzer
- standard analyzer
转载地址:http://hgsxi.baihongyu.com/