1.Analysis和Analyzer
- Analysis:文本分析,把全文本转换成一系列单词的过程。
- Analysis是通过Analyzer(分词器)实现的
- ES具有内置分词器,不满足需求可以自定义。
- 数据写入的时候转换词条,匹配Query语句的时候也需要用相同的 分析器对语句进行查询。
2. Analyzer组成
- Character Filters
针对原始文本处理(过滤没有用的字符,比如html) - Tokenizer
按照特定的规则切分单词(比如按照空格) - Token Filter
将切分的单词加工,小写,删除停用的词,增加同义词。
分词案例:
[Mastering Elastersearch & Elastersearch in Action] =>
[Character Filters] =>[Tokenizer] => [Token Filter]
=> (master,elastersaerch,action)
3._analyzer API
可以查看分词器是如何工作的
- 直接指定Analyzer进行测试
GET /_analyze
{
"analyzer": "standard",
"text": "China is a great counrty"
}
{
"tokens" : [
{
"token" : "china",
"start_offset" : 0,
"end_offset" : 5,
"type" : "<ALPHANUM>",
"position" : 0
},
{
"token" : "is",
"start_offset" : 6,
"end_offset" : 8,
"type" : "<ALPHANUM>",
"position" : 1
},
{
"token" : "a",
"start_offset" : 9,
"end_offset" : 10,
"type" : "<ALPHANUM>",
"position" : 2
},
{
"token" : "great",
"start_offset" : 11,
"end_offset" : 16,
"type" : "<ALPHANUM>",
"position" : 3
},
{
"token" : "counrty",
"start_offset" : 17,
"end_offset" : 24,
"type" : "<ALPHANUM>",
"position" : 4
}
]
}
- 指定索引的字段进行测试
POST users/_analyze
{
"field": "account",
"text":"中国是伟大的国家"
}
- 自定义分词进行测试。
POST /_analyze
{
"tokenizer": "standard",
"filter": ["uppercase"],
"text": ["I am Chinese","Made in China"]
}
3. 常用分词器
https://www.elastic.co/guide/en/elasticsearch/reference/7.3/analysis-analyzers.html
- standard。
ES的默认分词器,以空格的方式进行分词,单词会转小写。 - simple
按照非字母的方式进行切分,非字母的会被去掉,小写处理。 - whitespace
仅仅以空格进行切分 - stop
比起simple,会把the a 等类似的单词去掉(stopword) - keyword
不做处理 - Pattern
支持正则表达式进行分词,默认是\w+,文档地址
https://www.elastic.co/guide/en/elasticsearch/reference/7.3/analysis-pattern-analyzer.html
GET /_analyze
{
"analyzer": "pattern",
"text": "China is a great counrty"
}
- Language
为一些特定语言提供的
GET /_analyze
{
"analyzer": "english",
"text": "China is a great counrty"
} - ICU analyzer
提供了更好的UNICODE支持,中文支持良好
GET /_analyze
{
"analyzer": "icu_analyzer",
"text": "她说的的确在理"
}
{
"tokens" : [
{
"token" : "她",
"start_offset" : 0,
"end_offset" : 1,
"type" : "<IDEOGRAPHIC>",
"position" : 0
},
{
"token" : "说的",
"start_offset" : 1,
"end_offset" : 3,
"type" : "<IDEOGRAPHIC>",
"position" : 1
},
{
"token" : "的确",
"start_offset" : 3,
"end_offset" : 5,
"type" : "<IDEOGRAPHIC>",
"position" : 2
},
{
"token" : "在",
"start_offset" : 5,
"end_offset" : 6,
"type" : "<IDEOGRAPHIC>",
"position" : 3
},
{
"token" : "理",
"start_offset" : 6,
"end_offset" : 7,
"type" : "<IDEOGRAPHIC>",
"position" : 4
}
]
}
- 其他分词
- IK 支持自定义词库,支持热更新分词字典
- THULAC 清华大学实验室的中文分词
- Hanlp(http://hanlp.com)