文章目录

  • ElasticSearch文本分析(一)
  • 概述
  • 分词
  • 归一化
  • 自定义文本分析器
  • 概念
  • 分析器的剖析
  • 字符过滤器
  • 分词器
  • 分词过滤器
  • 索引和查询分析
  • 词干提取
  • 词干提取分词过滤器
  • 算法词干提取器
  • 词典词干提取器
  • 配置文本分析
  • 测试分析器
  • 配置内部分析其
  • 内部分析器参考
  • 指纹分析器
  • 示例输出
  • 配置
  • 配置例子
  • 定义
  • `keyword`分析器
  • 例子输出
  • 配置
  • 定义
  • 语言分析器
  • 模式分析器
  • 例子输出
  • 配置
  • 配置实例
  • 驼峰分词器
  • 定义
  • 简单的分析器
  • 例子
  • 定义
  • 自定义
  • 标准分析器
  • 例子
  • 配置
  • 配置例子
  • 定义
  • 停用词分析器
  • 例子:
  • 配置
  • 配置例子:
  • 定义
  • 空格分析器
  • 例子
  • 配置
  • 定义


ElasticSearch文本分析(一)

文本分析是将非结构化文本(如电子邮件的正文或产品描述)转换为针对搜索进行优化的结构化格式的过程。

ElasticSearch在索引或者检索字段的时候执行本文分析。

但是,如果您使用文本字段或文本搜索未按预期返回结果,则配置文本分析通常会有所帮助。如果您使用 Elasticsearch 来执行以下操作,您还应该查看分析配置:

  • 构建搜索引擎
  • 挖掘非结构化数据
  • 微调特定语言的搜索
  • 进行词典或语言研究

概述

文本分析能够让ElasticSearch执行全文检索,然后返回匹配到的所以相关结果而不仅仅是完全匹配。

如果您搜索 Quick fox jumps,您可能想要包含 A quick brown fox jumps over the lazy dog 的文档,并且您可能还想要包含相关词(如 fast foxfoxes jumps)的文档。

分词

分析器通过分词使得全文检索成为可能:将文本分解成更小的块,成为标记。大多数情况下,这些标记是单独的词。

如果你将短语the quick brown fox jumps作为一个单独的字符串进行索引,那么用户通过quick fox搜索将会匹配不到任何文档。但是,如果对短语进行标记并分别为每个单词建立索引,则可以单独查找查询字符串中的词汇。这意味着可以通过搜索 quick fox、fox brown 或其他变体来匹配它们。

归一化

分词支持对单个短语进行匹配,但每个标记仍按字面匹配。这就意味着:

  • 搜索 Quick 不会匹配 quick,即使您可能希望其中一个词与另一个词匹配
  • 尽管 foxfoxes 共享同一个词根,但搜索 foxes 不会匹配 fox,反之亦然。
  • 对跳跃的jumpsleaps不匹配。虽然它们不共享一个词根,但它们是同义词并具有相似的含义。

为了解决这些问题,文本分析可以将这些标记规范化为标准格式。这允许您匹配与搜索词不完全相同但足够相似以仍然相关的标记。例如:

  • Quick可以变成小写quick
  • Foxes 可以被截断,也可以简化为它的词根:fox。
  • jump 和leap 是同义词,可以索引为一个词:jump。

为确保搜索词按预期匹配这些词,您可以对查询字符串应用相同的分词和规范化规则。例如,搜索 Foxes jump 可以标准化为搜索 fox jump。

自定义文本分析器

文本分析由分析器执行,分析器是一组管理整个过程的规则。

Elasticsearch 包含一个默认分析器,称为标准分析器,它适用于大多数开箱即用的用例。

如果您想定制您的搜索体验,您可以选择不同的内置分析器,甚至可以配置自定义分析器。自定义分析器可让您控制分析过程的每个步骤,包括:

  • 分词前对文本的更改
  • 文本如何转换为标记
  • 在索引或搜索之前对tokens 所做的规范化更改

概念

分析器的剖析

一个分析器无论是内置的还是自定义的,他只是一个包,这个包包含了三个级别的构建块,分别是:字符过滤器、分词器和分词过滤器。

内置分析器将这些构建块预先打包成适用于不同语言和文本类型的分析器。 Elasticsearch 还公开了各个构建块,以便将它们组合起来定义新的自定义分析器。

字符过滤器

符过滤器以字符流的形式接收原始文本,并可以通过添加、删除或更改字符来转换流。例如,字符过滤器可用于将印度-阿拉伯数字 (٠ ١٢٣٤٥٦٧٨ ٩ ) 转换为其阿拉伯-拉丁数字 (0123456789),或从流中去除 等 HTML 元素。

分析器可能有零个或多个字符过滤器,它们按顺序应用。

分词器

分词器接收字符流,将其分解为单独的标记(通常是单个单词),然后输出分词流。例如,空格分词器在看到任何空格时将文本分解。它会转换文本Quick brown fox!进入术语[Quick, brown, fox!]

分词器还负责记录每个术语的顺序或位置以及该术语所代表的原始单词的开始和结束字符偏移量。

一个分析器必须只有一个分词器。

分词过滤器

分词过滤器接收分词流并可以添加、删除或更改分词。例如,小写分词过滤器将所有分词转换为小写,停止标记过滤器从标分词流中删除常用词(停止词),而同义词分词过滤器将同义词引入分词流。

分词过滤器不允许更改每个分词的位置或字符偏移量。

分析器可能有零个或多个分词过滤器,它们按顺序应用。

索引和查询分析

文本分析器在以下两种情况下发生:

  • 索引的时候:当一个文档被索引的时候,任何text字段值都会被分析
  • 检索的时候:当在text字段上运行全文检索的时候,查询的字符串会被分析

每次使用的分析器或分析规则集分别称为索引分析器或搜索分析器。

词干提取

词干提取是将一个单词还原为其词根的过程。这可以确保在搜索过程中匹配不同的单词。

例如walkingwalked被词干提取相同的词根walk。一旦被词干提取,在搜索中出现任何一个单词,都将会匹配。

词干提取取决于语言,但是通常涉及到删除单词的前缀和后缀。

在大多数场景下,被词干提取到的词根可能不是一个真正的单词。例如jumpingjumpiness这两个单词提取的词根为jumpi,但是jumpi不是一个正确的单词,但是它不影响查询。如果所有的单词的词根来源于同一个单词,则都会被匹配。

词干提取分词过滤器

在ElasticSearch中,词干提取是有分词过滤器出来的。这些分词过滤器可以根据词干方式进行分类:

  • 算法词干分析器:基于规则集提取词干
  • 词典词干分析器:通过在词典中查找词干来提取词干

因为词干提取会改变分词,所以我们推荐在索引和查询分析的时候使用相同的词干提取分词过滤器。

算法词干提取器

算法词干提取对每个词应用一系列规则以将他们简化为词根的形式。例如对于英文算法词干提取器可能移除复数单词的-s-es后缀。

算法词干提取器有几个优点:

  • 他们需要很少的配置。通常可以开箱即用
  • 他们使用很少的内存
  • 他们通常比词典词干提取器更快

然后,大多数的算法词干提取器只能改变一个词现有的文本。这就意味着他们可能不适用于不包含词根的不规则形式的单词,例如:

  • be, are, and am
  • mouse and mice
  • foot and feet

以下分词过滤器使用了算法词干提取器:

  • stemmerstemmer提供了多种语言的词干提取器。
  • kstem:结合了算法词干提取和内部词典的英文词干提取器
  • porter_stem:我们推荐的算法词干提取器
  • snowball:它对多种语言使用了基于Snowball-base的词干提取规则
词典词干提取器

词典词干提取器需要在提供的词典中查看单词,用查找的单词替换为词干提取的单词。

理论上,词典词干提取器非常适合:

  • 词干提取不规则单词
  • 区分拼写相似但概念上不相关的单词,例如:
  • organ and organization
  • broker and broken

在实践中,算法词干提取性能总是优于词典词干提起。因为词典词干提起器具有以下确定:

  • 词典的质量:词典词干提取完全的好坏依赖于词典。想要工作的很好,那么这些词典就必须包含大量单词、定期更新并且跟随语言而变化。通常,当字典可用时,它是不完整的,其中的一些条目已经过时了。
  • 大小与性能:字典词干分析器必须将其字典中的所有单词、前缀和后缀加载到内存中。这可能会使用大量 RAM。去除前缀和后缀的低质量词典也可能效率较低,这会显着减慢词干提取过程。

你可以使用hunspell分词过滤器来执行词典词干提取。

提示:如果可用,我们推荐你使用hunspell之前使用算法词干提起器。

配置文本分析

默认情况下。ElasticSearch使用standard analyzer作为所有文本分析的分析器。standard分析器让你开箱即用,并且支持了很多种自然语言和示例。如果你选择使用standard分析器,将不需要任何配置。

如果standard分析器不满足你的需求,你可以查看和测试ElasticSearch中其他的内置分析器。内部分析器不需要配置,但是一些支持的可选配置可以调整他们的行为。例如你可以配置具有删除自定义停用词列表的standard分析器.

如果内部分析其也不满足你的需求,你可以测试和创建一个自定义的分析器。

测试分析器

analyzer API是查看分析器生成术语的宝贵工具。

curl -X POST "localhost:9200/_analyze?pretty" -H 'Content-Type: application/json' -d'
{
  "analyzer": "whitespace",
  "text":     "The quick brown fox."
}
'

API 返回以下响应:

{
  "tokens": [
    {
      "token": "The",
      "start_offset": 0,
      "end_offset": 3,
      "type": "word",
      "position": 0
    },
    {
      "token": "quick",
      "start_offset": 4,
      "end_offset": 9,
      "type": "word",
      "position": 1
    },
    {
      "token": "brown",
      "start_offset": 10,
      "end_offset": 15,
      "type": "word",
      "position": 2
    },
    {
      "token": "fox.",
      "start_offset": 16,
      "end_offset": 20,
      "type": "word",
      "position": 3
    }
  ]
}

你也可以用组合方式测试:

  • 分词器
  • 0个或者多个分词过滤器
  • 0个或者多个字符过滤器
curl -X POST "localhost:9200/_analyze?pretty" -H 'Content-Type: application/json' -d'
{
  "tokenizer": "standard",
  "filter":  [ "lowercase", "asciifolding" ],
  "text":      "Is this déja vu?"
}
'

以上API响应值为:

{
  "tokens": [
    {
      "token": "is",
      "start_offset": 0,
      "end_offset": 2,
      "type": "<ALPHANUM>",
      "position": 0
    },
    {
      "token": "this",
      "start_offset": 3,
      "end_offset": 7,
      "type": "<ALPHANUM>",
      "position": 1
    },
    {
      "token": "deja",
      "start_offset": 8,
      "end_offset": 12,
      "type": "<ALPHANUM>",
      "position": 2
    },
    {
      "token": "vu",
      "start_offset": 13,
      "end_offset": 15,
      "type": "<ALPHANUM>",
      "position": 3
    }
  ]
}

提示:从分析器输出的结果可以看到,分析器不仅将单词转换成了术语,并且他们还记录了每个术语的顺序和对应位置,以及在原文中术语的开始和结束字符的偏移量。

或者,在特定索引上运行分析 API 时可以引用自定义分析器:

curl -X PUT "localhost:9200/my-index-000001?pretty" -H 'Content-Type: application/json' -d'
{
  "settings": {
    "analysis": {
      "analyzer": {
        "std_folded": { 
          "type": "custom",
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "asciifolding"
          ]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "my_text": {
        "type": "text",
        "analyzer": "std_folded" 
      }
    }
  }
}
'
curl -X GET "localhost:9200/my-index-000001/_analyze?pretty" -H 'Content-Type: application/json' -d'
{
  "analyzer": "std_folded", 
  "text":     "Is this déjà vu?"
}
'
curl -X GET "localhost:9200/my-index-000001/_analyze?pretty" -H 'Content-Type: application/json' -d'
{
  "field": "my_text", 
  "text":  "Is this déjà vu?"
}
'

API 返回以下响应:

{
  "tokens": [
    {
      "token": "is",
      "start_offset": 0,
      "end_offset": 2,
      "type": "<ALPHANUM>",
      "position": 0
    },
    {
      "token": "this",
      "start_offset": 3,
      "end_offset": 7,
      "type": "<ALPHANUM>",
      "position": 1
    },
    {
      "token": "deja",
      "start_offset": 8,
      "end_offset": 12,
      "type": "<ALPHANUM>",
      "position": 2
    },
    {
      "token": "vu",
      "start_offset": 13,
      "end_offset": 15,
      "type": "<ALPHANUM>",
      "position": 3
    }
  ]
}

配置内部分析其

内部分析可以直接使用而不需要任何配置。然而他们中的一些支持可选的配置来改变他们的行为。例如,standard分析器支持配置停用词列表:

curl -X PUT "localhost:9200/my-index-000001?pretty" -H 'Content-Type: application/json' -d'
{
  "settings": {
    "analysis": {
      "analyzer": {
        "std_english": { 
          "type":      "standard",
          "stopwords": "_english_"
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "my_text": {
        "type":     "text",
        "analyzer": "standard", 
        "fields": {
          "english": {
            "type":     "text",
            "analyzer": "std_english" 
          }
        }
      }
    }
  }
}
'
curl -X POST "localhost:9200/my-index-000001/_analyze?pretty" -H 'Content-Type: application/json' -d'
{
  "field": "my_text", 
  "text": "The old brown cow"
}
'
curl -X POST "localhost:9200/my-index-000001/_analyze?pretty" -H 'Content-Type: application/json' -d'
{
  "field": "my_text.english", 
  "text": "The old brown cow"
}
'

内部分析器参考

指纹分析器

指纹分析器实现了指纹算法,OpenRefine使用这个算法来协调集群。

输入小写的文本,规范化以删除扩展字符串、排序、去重并连接成一个独立的分词,如果配置了停用词列表,停用词也将被移除。

示例输出
curl -X POST "localhost:9200/_analyze?pretty" -H 'Content-Type: application/json' -d'
{
  "analyzer": "fingerprint",
  "text": "Yes yes, Gödel said this sentence is consistent and."
}
'

上面的句子将产生以下单个术语:

[ and consistent godel is said sentence this yes ]
配置

separator

用于连接术语的字符。默认为空格。

max_output_size

最大分词大小。默认为 255。大于此大小的分词将被丢弃。

stopwords

预定义的停用词列表,如 english 或包含停用词列表的数组。默认为 none

stopwords_path

包含停用词的文件的路径。

有关停用词配置的更多信息,请参阅停止分词过滤器。

配置例子
curl -X PUT "localhost:9200/my-index-000001?pretty" -H 'Content-Type: application/json' -d'
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_fingerprint_analyzer": {
          "type": "fingerprint",
          "stopwords": "_english_"
        }
      }
    }
  }
}
'
curl -X POST "localhost:9200/my-index-000001/_analyze?pretty" -H 'Content-Type: application/json' -d'
{
  "analyzer": "my_fingerprint_analyzer",
  "text": "Yes yes, Gödel said this sentence is consistent and."
}
'

上面的例子产生以下术语:

[ consistent godel said sentence yes ]
定义

指纹分词器包括:

  • TokenizerStandard Tokenizer标准分词器
  • Token Filters (按顺序)
  • Lower Case Token Filter
  • ASCII folding
  • Stop Token Filter(默认关闭)
  • Fingerprint

如果您需要在配置参数之外自定义指纹分析器,那么您需要将其重新创建为自定义分析器并对其进行修改,通常是通过添加分词过滤器。这将重新创建内置指纹分析器,您可以将其用作进一步自定义的起点:

curl -X PUT "localhost:9200/fingerprint_example?pretty" -H 'Content-Type: application/json' -d'
{
  "settings": {
    "analysis": {
      "analyzer": {
        "rebuilt_fingerprint": {
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "asciifolding",
            "fingerprint"
          ]
        }
      }
    }
  }
}
'
keyword分析器

关键字分析器是一个“noop”分析器,它将整个输入字符串作为单个分词返回。

例子输出
curl -X POST "localhost:9200/_analyze?pretty" -H 'Content-Type: application/json' -d'
{
  "analyzer": "keyword",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog\u0027s bone."
}
'

上面的句子将产生以下单个术语:

[ The 2 QUICK Brown-Foxes jumped over the lazy dog's bone. ]
配置

keyword不需要任何配置

定义

keyword分析器包含:

  • Tokenizerkeyword tokenizer

如果您需要自定义关键字分析器,那么您需要将其重新创建为自定义分析器并对其进行修改,通常是通过添加标记过滤器。通常,当您想要不拆分为标记的字符串时,您应该更喜欢 Keyword 类型,但以防万一,这将重新创建内置关键字分析器,您可以将其用作进一步自定义的起点:

curl -X PUT "localhost:9200/keyword_example?pretty" -H 'Content-Type: application/json' -d'
{
  "settings": {
    "analysis": {
      "analyzer": {
        "rebuilt_keyword": {
          "tokenizer": "keyword",
          "filter": [         
          ]
        }
      }
    }
  }
}
'
语言分析器

一组旨在分析特定语言文本的分析器。支持以下类型:阿拉伯语、亚美尼亚语、巴斯克语、孟加拉语、巴西语、保加利亚语、加泰罗尼亚语、捷克语、捷克语、丹麦语、荷兰语、英语、爱沙尼亚语、芬兰语、法语、加利西亚语、德语、希腊语、印地语、匈牙利语、印度尼西亚语、爱尔兰语、意大利语、拉脱维亚语、立陶宛语、挪威语、波斯语、葡萄牙语、罗马尼亚语、俄语、索拉尼语、西班牙语、瑞典语、土耳其语、泰语。

模式分析器

模式分析器使用正则表达式将文本拆分为术语。正则表达式应该匹配分词分隔符而不是分词本身。正则表达式默认为 \W+(或所有非单词字符)。

提示:小心病态的正则表达式,模式分析器使用java正则表达式。一个写的不好的正则可能会拖慢性能甚至导致内存溢出。

阅读有关病态正则表达式以及如何避免它们的更多信息。

例子输出
curl -X POST "localhost:9200/_analyze?pretty" -H 'Content-Type: application/json' -d'
{
  "analyzer": "pattern",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}
'

返回响应:

[ the, 2, quick, brown, foxes, jumped, over, the, lazy, dog, s, bone ]
配置

模式分析器接收以下参数:

pattern

java正则表达式,默认为\W+.

flags

Java 正则表达式标志。标志应该用管道分隔,例如CASE_INSENSITIVE|COMMENTS

lowercase

术语是否应该小写。默认为真。

stopwords

预定义的停用词列表,如 english 或包含停用词列表的数组。默认为 none

stopwords_path

包含停用词的文件的路径。

有关停用词配置的更多信息,请参阅停止分词过滤器。

配置实例

在此示例中,我们将模式分析器配置为在非单词字符或下划线 (\W|_) 上拆分电子邮件地址,并将结果小写:

curl -X PUT "localhost:9200/my-index-000001?pretty" -H 'Content-Type: application/json' -d'
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_email_analyzer": {
          "type":      "pattern",
          "pattern":   "\\W|_", 
          "lowercase": true
        }
      }
    }
  }
}
'
curl -X POST "localhost:9200/my-index-000001/_analyze?pretty" -H 'Content-Type: application/json' -d'
{
  "analyzer": "my_email_analyzer",
  "text": "John_Smith@foo-bar.com"
}
'

上面的例子产生以下术语:

[ john, smith, foo, bar, com ]
驼峰分词器

以下更复杂的示例将 驼峰文本拆分为分词:

curl -X PUT "localhost:9200/my-index-000001?pretty" -H 'Content-Type: application/json' -d'
{
  "settings": {
    "analysis": {
      "analyzer": {
        "camel": {
          "type": "pattern",
          "pattern": "([^\\p{L}\\d]+)|(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)|(?<=[\\p{L}&&[^\\p{Lu}]])(?=\\p{Lu})|(?<=\\p{Lu})(?=\\p{Lu}[\\p{L}&&[^\\p{Lu}]])"
        }
      }
    }
  }
}
'
curl -X GET "localhost:9200/my-index-000001/_analyze?pretty" -H 'Content-Type: application/json' -d'
{
  "analyzer": "camel",
  "text": "MooseX::FTPClass2_beta"
}
'

上面的例子产生以下术语:

[ moose, x, ftp, class, 2, beta ]
定义

模式分析器包括:

  • TokenizerPattern Tokenizer
  • Token Filters
  • Lower Case Token Filter
  • Stop Token Filter (disabled by default)

如果您需要在配置参数之外自定义模式分析器,那么您需要将其重新创建为自定义分析器并对其进行修改,通常是通过添加令牌过滤器。这将重新创建内置模式分析器,您可以将其用作进一步自定义的起点:

curl -X PUT "localhost:9200/pattern_example?pretty" -H 'Content-Type: application/json' -d'
{
  "settings": {
    "analysis": {
      "tokenizer": {
        "split_on_non_word": {
          "type":       "pattern",
          "pattern":    "\\W+" 
        }
      },
      "analyzer": {
        "rebuilt_pattern": {
          "tokenizer": "split_on_non_word",
          "filter": [
            "lowercase"       
          ]
        }
      }
    }
  }
}
'
简单的分析器

简单的分析器将文本分解为任何非字母字符(如数字、空格、连字符和撇号)的分词,丢弃非字母字符,并将大写改为小写。

例子
curl -X POST "localhost:9200/_analyze?pretty" -H 'Content-Type: application/json' -d'
{
  "analyzer": "simple",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog\u0027s bone."
}
'

简单分析器解析句子并生成以下分词:

[ the, quick, brown, foxes, jumped, over, the, lazy, dog, s, bone ]
定义

简单的分析器由一个分词器定义:

TokenizerLowercase Tokenizer

自定义

要自定义简单分析器,请复制它以创建自定义分析器的基础。这个自定义分析器可以根据需要进行修改,通常是通过添加分词过滤器。

curl -X PUT "localhost:9200/my-index-000001?pretty" -H 'Content-Type: application/json' -d'
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_custom_simple_analyzer": {
          "tokenizer": "lowercase",
          "filter": [                          
          ]
        }
      }
    }
  }
}
'
标准分析器

标准分析器是默认分析器,如果未指定则使用该分析器。它提供基于语法的标记化(基于 Unicode 文本分割算法,如 Unicode 标准附件 #29 中所述)并且适用于大多数语言。

例子
curl -X POST "localhost:9200/_analyze?pretty" -H 'Content-Type: application/json' -d'
{
  "analyzer": "standard",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog`s bone."
}
'

上面的句子将产生以下术语:

[ the, 2, quick, brown, foxes, jumped, over, the, lazy, dog's, bone ]
配置

max_token_length

最大分词长度。如果看到超过此长度的分词,则以 max_token_length 间隔拆分。默认为 255。

stopwords

预定义的停用词列表,如 english 或包含停用词列表的数组。默认为 none

stopwords_path

包含停用词的文件的路径。

有关停用词配置的更多信息,请参阅停止标记过滤器。

配置例子

在此示例中,我们将标准分析器配置为 max_token_length 为 5(用于演示目的),并使用预定义的英语停用词列表:

curl -X PUT "localhost:9200/my-index-000001?pretty" -H 'Content-Type: application/json' -d'
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_english_analyzer": {
          "type": "standard",
          "max_token_length": 5,
          "stopwords": "_english_"
        }
      }
    }
  }
}
'
curl -X POST "localhost:9200/my-index-000001/_analyze?pretty" -H 'Content-Type: application/json' -d'
{
  "analyzer": "my_english_analyzer",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog\u0027s bone."
}
'

上面的例子产生以下术语:

[ 2, quick, brown, foxes, jumpe, d, over, lazy, dog's, bone ]
定义

标准分析仪包括:

  • TokenizerStandard Tokenizer
  • Token Filters
  • Lower Case Token Filter
  • Stop Token Filter (disabled by default)

如果您需要在配置参数之外自定义标准分析器,那么您需要将其重新创建为自定义分析器并对其进行修改,通常是通过添加令牌过滤器。这将重新创建内置标准分析器,您可以将其用作起点:

curl -X PUT "localhost:9200/standard_example?pretty" -H 'Content-Type: application/json' -d'
{
  "settings": {
    "analysis": {
      "analyzer": {
        "rebuilt_standard": {
          "tokenizer": "standard",
          "filter": [
            "lowercase"       
          ]
        }
      }
    }
  }
}
'
停用词分析器

停用分析器与简单分析器相同,但增加了对删除停用词的支持。它默认使用 english 停用词。

例子:
curl -X POST "localhost:9200/_analyze?pretty" -H 'Content-Type: application/json' -d'
{
  "analyzer": "stop",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog\u0027s bone."
}
'

上面的句子将产生以下术语:

[ quick, brown, foxes, jumped, over, lazy, dog, s, bone ]
配置

stopwords

A pre-defined stop words list like _english_ or an array containing a list of stop words. Defaults to _english_.

stopwords_path

包含停用词的文件的路径。此路径相对于 Elasticsearch 配置目录。

有关停用词配置的更多信息,请参阅停止标记过滤器。

配置例子:

在此示例中,我们将停止分析器配置为使用指定的单词列表作为停止词:

curl -X PUT "localhost:9200/my-index-000001?pretty" -H 'Content-Type: application/json' -d'
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_stop_analyzer": {
          "type": "stop",
          "stopwords": ["the", "over"]
        }
      }
    }
  }
}
'
curl -X POST "localhost:9200/my-index-000001/_analyze?pretty" -H 'Content-Type: application/json' -d'
{
  "analyzer": "my_stop_analyzer",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog\u0027s bone."
}
'

上面的例子产生以下术语:

[ quick, brown, foxes, jumped, lazy, dog, s, bone ]
定义
  • TokenizerLower Case Tokenizer
  • Token filtersStop Token Filter

如果您需要在配置参数之外自定义停止分析器,那么您需要将其重新创建为自定义分析器并对其进行修改,通常是通过添加令牌过滤器。这将重新创建内置停止分析器,您可以将其用作进一步自定义的起点:

curl -X PUT "localhost:9200/stop_example?pretty" -H 'Content-Type: application/json' -d'
{
  "settings": {
    "analysis": {
      "filter": {
        "english_stop": {
          "type":       "stop",
          "stopwords":  "_english_" 
        }
      },
      "analyzer": {
        "rebuilt_stop": {
          "tokenizer": "lowercase",
          "filter": [
            "english_stop"          
          ]
        }
      }
    }
  }
}
'
空格分析器

每当遇到空白字符时,空白分析器将文本分解为术语。

例子
curl -X POST "localhost:9200/_analyze?pretty" -H 'Content-Type: application/json' -d'
{
  "analyzer": "whitespace",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog\u0027s bone."
}
'

上面的句子将产生以下术语:

[ The, 2, QUICK, Brown-Foxes, jumped, over, the, lazy, dog's, bone. ]
配置

空白分析器不用配置。

定义
  • TokenizerWhitespace Tokenizer

如果您需要自定义空白分析器,那么您需要将其重新创建为自定义分析器并对其进行修改,通常是通过添加标记过滤器。这将重新创建内置的空白分析器,您可以将其用作进一步自定义的起点:

curl -X PUT "localhost:9200/whitespace_example?pretty" -H 'Content-Type: application/json' -d'
{
  "settings": {
    "analysis": {
      "analyzer": {
        "rebuilt_whitespace": {
          "tokenizer": "whitespace",
          "filter": [         
          ]
        }
      }
    }
  }
}
'