参考文档
https://www.elastic.co/guide/en/elasticsearch/reference/7.11/analysis.html
一、简介
文本分析发生在以下两个时机
索引时 当文档被索引时,任何文本字段值都会被分析。
搜索时 在文本字段上运行全文搜索时,会分析查询字符串
二、索引时设置分词器
在大多数情况下,应在索引和搜索时使用相同的分析器。 这可确保字段的值和查询字符串更改为相同形式的标记。 反过来,这可以确保令牌在搜索期间按预期匹配。
在索引上设置并使用自定义分析器
PUT my-index-000001
{
"settings": {
"analysis": {
"analyzer": {
"std_folded": {
"type": "custom",
#定义一个名为 std_folded 的自定义分析器。
"tokenizer": "standard",
"filter": [
"lowercase",
"asciifolding"
]
}
}
}
},
"mappings": {
"properties": {
#字段 my_text 使用 std_folded 分析器。
"my_text": {
"type": "text",
"analyzer": "std_folded"
}
}
}
}
GET my-index-000001/_analyze
{
"analyzer": "std_folded",
"text": "Is this déjà vu?"
}
GET my-index-000001/_analyze
{
"field": "my_text",
"text": "Is this déjà vu?"
}
自定义分析器
当内置分析器不能满足您的需求时,您可以创建一个自定义分析器,它使用以下适当组合:
- 零个或多个字符过滤器
- 分词器
- 零个或多个令牌过滤器。
自定义分词器接收以下参数
tokenizer |
内置或定制的分词器。 |
必需 |
char_filter |
可选的内置或自定义字符过滤器数组。 |
非必需 |
filter |
可选的内置或自定义令牌过滤器数组。 |
非必需 |
以下是自定分词器的一个例子
PUT my-index-000001
{
"settings": {
"analysis": {
"analyzer": {
"my_custom_analyzer": {
"type": "custom",
"char_filter": [
"emoticons"
],
"tokenizer": "punctuation",
"filter": [
"lowercase",
"english_stop"
]
}
},
"tokenizer": {
"punctuation": {
"type": "pattern",
"pattern": "[ .,!?]"
}
},
"char_filter": {
"emoticons": {
"type": "mapping",
"mappings": [
":) => _happy_",
":( => _sad_"
]
}
},
"filter": {
"english_stop": {
"type": "stop",
"stopwords": "_english_"
}
}
}
}
}
POST my-index-000001/_analyze
{
"analyzer": "my_custom_analyzer",
"text": "I'm a :) person, and you?"
}
Elasticsearch 通过依次检查以下参数来确定要使用的索引分析器:
- 字段的分析器映射参数。
- analysis.analyzer.default 索引设置。
- 如果没有指定这些参数,则使用标准分析器。
以下创建索引 API 请求将空白分析器设置为标题字段的分析器。
PUT my-index-000001
{
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "whitespace"
}
}
}
}
除了字段级分析器之外,您还可以设置备用分析器以使用 analysis.analyzer.default 设置。
PUT my-index-000001
{
"settings": {
"analysis": {
"analyzer": {
"default": {
"type": "simple"
}
}
}
}
}
二、搜索时设置分词器
在搜索时,Elasticsearch 通过依次检查以下参数来确定要使用的分析器:
- 搜索查询中的分析器参数。
- 字段的 search_analyzer 映射参数。
- analysis.analyzer.default_search 索引设置。
- 字段的分析器映射参数。
- 如果没有指定这些参数,则使用标准分析器。
编写全文查询时,可以使用 analyzer 参数指定搜索分析器。 如果提供,它将覆盖任何其他搜索分析器。比如以下例子
GET my-index-000001/_search
{
"query": {
"match": {
"message": {
"query": "Quick foxes",
"analyzer": "stop"
}
}
}
}
创建索引时设置默认的搜索分析器
# 以下创建索引 API 请求将空白分析器设置为 my-index-000001 索引的默认搜索分析器
PUT my-index-000001
{
"settings": {
"analysis": {
"analyzer": {
"default": {
"type": "simple"
},
"default_search": {
"type": "whitespace"
}
}
}
}
}