分析器
一个 分析器 就是在一个包里面组合了三种函数的一个包装器, 三种函数按照++顺序++被执行:
- 字符过滤器 例如去掉html标签,或者将"&"转"and"。一个分析器可能有0个或者多个字符过滤器。
- 分词器 分词器把字符串分解成单个词条或者词汇单元。一个分析器++必须有一个唯一++的分词器。
- 词单元过滤器 经过分词,作为结果的词单元流会按照++指定的顺序++通过指定的词单元过滤器 。例如执行小写化、删除"a","then"等无用词、或增加像jump和leap这种同义词。
自定义分析器
- 语法结构
PUT /my_index
{
"settings": {
"analysis": {
"char_filter": { ... custom character filters ... },
"tokenizer": { ... custom tokenizers ... },
"filter": { ... custom token filters ... },
"analyzer": { ... custom analyzers ... }
}
}
}
char_fiter 字符过滤器
tokenizer 分词器
filter 词单元过滤器
analyzer 分析器
- 示例如下
PUT /my_index
{
"settings": {
"analysis": {
"char_filter": {
"&_to_and": {
"type": "mapping",
"mappings": [ "&=> and "]
}},
"filter": {
"my_stopwords": {
"type": "stop",
"stopwords": [ "the", "a" ]
}},
"analyzer": {
"my_analyzer": {
"type": "custom",
"char_filter": [ "html_strip", "&_to_and" ],
"tokenizer": "standard",
"filter": [ "lowercase", "my_stopwords" ]
}}
}}}
IK分析器
因为elasticsearch默认的分词器standard不太适用于中文,例如默认分析器会把"幸福家园3期"分解为["幸","福","家","园","3","期"],所以在实际应用时,大部分都是用一些中文分析器。IK分析器就是其中之一。
ik分析器地址 https://github.com/medcl/elasticsearch-analysis-ik
下载安装IK
- 方式一 下载zip文件后解压到elasticsearch的plugin文件夹。https://github.com/medcl/elasticsearch-analysis-ik/releases
- 方式二 命令方式安装(version > v5.5.1) ==本地未成功==
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.0.0/elasticsearch-analysis-ik-6.0.0.zip
下载完成后,重启elasticsearch。
测试分析器
GET /employee/_analyze
{
"analyzer": "ik_max_word",
"text": "幸福家园3期"
}
响应的结果
{
"tokens": [
{
"token": "幸福",
"start_offset": 0,
"end_offset": 2,
"type": "CN_WORD",
"position": 0
},
{
"token": "家园",
"start_offset": 2,
"end_offset": 4,
"type": "CN_WORD",
"position": 1
},
{
"token": "3",
"start_offset": 4,
"end_offset": 5,
"type": "ARABIC",
"position": 2
},
{
"token": "期",
"start_offset": 5,
"end_offset": 6,
"type": "COUNT",
"position": 3
}
]
}
使用ik分析器
测试安装ik成功后,就可以在新建索引时,指定某字段的分析器为ik。
PUT /test
{
"mappings": {
"doc": {
"properties": {
"chinese_txt": {
"type": "text",
"analyzer": "ik_max_word",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
}
}
ik分析器可以让用户自定义本地或远程的字典库、停止词库,还支持热更新。更详细的说明请查看ik官方说明。
如同 match 查询这样的高层查询知道字段映射的关系,能为每个被查询的字段应用正确的分析器。 可以使用 validate-query API 查看这个行为, 其中在索引时指定了english_title的分析器为english:
GET /my_index/my_type/_validate/query?explain
{
"query": {
"bool": {
"should": [
{ "match": { "title": "Foxes"}},
{ "match": { "english_title": "Foxes"}}
]
}
}
}
返回语句的 explanation 结果:(title:foxes english_title:fox)
在搜索时和索引时可以使用不同的分析器
Elasticsearch支持一个可选的 search_analyzer 映射,它仅会应用于搜索时。