跳到主要内容

Custom Analyzer

当内置分析器不能满足您的需求时,您可以创建一个自定义分析器,采用适当的组合来构建:

  • 零个或多个 character filters
  • 1个 tokenizer
  • 零个或多个 token filters.

配置

自定义分析器接受以下参数:

  • tokenizer 内置或自定义标记器。(必需)
  • char_filter 内置或自定义字符过滤器的可选阵列。
  • filter 内置或自定义令牌过滤器的可选阵列。
  • position_increment_gap 在对文本值数组进行索引时,Elasticsearch在一个值的最后一个项和下一个值中的第一个项之间插入一个假“间隙”,以确保短语查询不匹配来自不同数组元素的两个项。默认值为100。

参数示例

  • Character Filter
    • HTML Strip Character Filter
  • Tokenizer
    • Standard Tokenizer
  • Token Filters
    • Lowercase Token Filter
    • ASCII-Folding Token Filter
PUT my_index
{
"settings": {
"analysis": {
"analyzer": {
"my_custom_analyzer": {
"type": "custom", (1)
"tokenizer": "standard",
"char_filter": [
"html_strip"
],
"filter": [
"lowercase",
"asciifolding"
]
}
}
}
}
}

POST my_index/_analyze
{
"analyzer": "my_custom_analyzer",
"text": "Is this <b>déjà vu</b>?"
}

分词结果

[ is, this, deja, vu ]

前面的示例使用了具有默认配置的标记化器、标记过滤器和字符过滤器,但可以创建每个的配置版本并在自定义分析器中使用它们。

下面是一个更复杂的示例,结合了以下内容:

  • Character Filter
    • Mapping Character Filter, configured to replace :) with happy and :( with sad
  • Tokenizer
    • Pattern Tokenizer, 配置为在标点符号上拆分
  • Token Filters
    • Lowercase Token Filter
    • Stop Token Filter, 配置为使用预定义的英文停止词列表
PUT my_index
{
"settings": {
"analysis": {
"analyzer": {
"my_custom_analyzer": { (1)
"type": "custom",
"char_filter": [
"emoticons"
],
"tokenizer": "punctuation",
"filter": [
"lowercase",
"english_stop"
]
}
},
"tokenizer": {
"punctuation": { (2)
"type": "pattern",
"pattern": "[ .,!?]"
}
},
"char_filter": {
"emoticons": { (3)
"type": "mapping",
"mappings": [
":) => _happy_",
":( => _sad_"
]
}
},
"filter": {
"english_stop": { (4)
"type": "stop",
"stopwords": "_english_"
}
}
}
}
}

POST my_index/_analyze
{
"analyzer": "my_custom_analyzer",
"text": "I'm a :) person, and you?"
}
  1. 为索引分配默认自定义分析器my_custom_analysis。此分析器使用自定义标记器、字符过滤器和稍后在请求中定义的标记过滤器。
  2. 定义自定义标点符号化器。
  3. 定义自定义表情符号字符筛选器。
  4. 定义自定义english_stop标记筛选器。