创建自定义分析器
当内置分析器无法满足您的需求时,您可以创建一个 custom 分析器,它使用了以下组件的适当组合:
custom 分析器接受以下参数:
类型- 分析器类型。接受 内置分析器类型。对于自定义分析器,请使用
custom或省略此参数。 tokenizer- 一个内置或自定义的 分词器。(必填)
char_filter- 一个可选的内置或自定义 字符过滤器 数组。
filter- 一个可选的内置或自定义 词元过滤器 数组。
position_increment_gap- 在索引文本值数组时,Elasticsearch 会在某个值的最后一个词项与下一个值的第一个词项之间插入一个伪“间隙”,以确保短语查询不会匹配来自不同数组元素的两个词项。默认为
100。有关更多信息,请参阅position_increment_gap。
这是一个结合了以下组件的示例:
- 字符过滤器
- 分词器
- 标记过滤器
PUT my-index-000001
{
"settings": {
"analysis": {
"analyzer": {
"my_custom_analyzer": {
"type": "custom",
"tokenizer": "standard",
"char_filter": [
"html_strip"
],
"filter": [
"lowercase",
"asciifolding"
]
}
}
}
}
}
POST my-index-000001/_analyze
{
"analyzer": "my_custom_analyzer",
"text": "Is this <b>déjà vu</b>?"
}
- 对于
custom分析器,请将type设置为custom或省略type参数。
上面的示例会产生以下词条
[ is, this, deja, vu ]
前面的示例使用了采用默认配置的分词器、词元过滤器和字符过滤器,但也可以创建它们各自的配置版本,并在自定义分析器中使用它们。
这是一个结合了以下组件的更复杂的示例:
- 字符过滤器
-
- Mapping 字符过滤器,配置为将
:)替换为_happy_,并将:(替换为_sad_
- Mapping 字符过滤器,配置为将
- 分词器
-
- Pattern 分词器,配置为根据标点符号进行拆分
- 标记过滤器
-
- 小写词元过滤器
- Stop 词元过滤器,配置为使用预定义的英语停用词列表
这是一个示例
PUT my-index-000001
{
"settings": {
"analysis": {
"analyzer": {
"my_custom_analyzer": {
"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?"
}
- 为索引分配一个默认的自定义分析器
my_custom_analyzer。该分析器使用了在请求稍后定义的自定义分词器、字符过滤器和词元过滤器。此分析器也省略了type参数。 - 定义自定义
punctuation分词器。 - 定义自定义
emoticons字符过滤器。 - 定义自定义
english_stop词元过滤器。
上面的示例会产生以下词条
[ i'm, _happy_, person, you ]