Hunspell 分词过滤器

编辑

基于提供的 Hunspell 词典 提供 字典词干提取hunspell 过滤器需要 配置 一个或多个特定语言的 Hunspell 词典。

此过滤器使用 Lucene 的 HunspellStemFilter

如果可用,我们建议在使用 hunspell 分词过滤器之前尝试使用您语言的算法词干提取器。在实践中,算法词干提取器通常优于字典词干提取器。请参阅 字典词干提取

配置 Hunspell 词典

编辑

Hunspell 词典存储在文件系统上的专用 hunspell 目录中并从该目录检测:<$ES_PATH_CONF>/hunspell。每个词典都应该有自己的目录,并以其关联的语言和区域设置命名(例如,pt_BRen_GB)。此词典目录应包含单个 .aff 文件和一个或多个 .dic 文件,所有这些文件都将自动加载。例如,以下目录布局将定义 en_US 词典

- config
    |-- hunspell
    |    |-- en_US
    |    |    |-- en_US.dic
    |    |    |-- en_US.aff

每个词典可以使用一个设置进行配置

ignore_case

(静态,布尔值) 如果为 true,则词典匹配将不区分大小写。默认为 false

此设置可以在 elasticsearch.yml 中使用 indices.analysis.hunspell.dictionary.ignore_case 全局配置。

要为特定区域设置配置此设置,请使用 indices.analysis.hunspell.dictionary.<locale>.ignore_case 设置(例如,对于 en_US(美国英语)区域设置,设置是 indices.analysis.hunspell.dictionary.en_US.ignore_case)。

您还可以将一个 settings.yml 文件添加到词典目录中,其中包含这些设置。这将覆盖在 elasticsearch.yml 中定义的任何其他 ignore_case 设置。

示例

编辑

以下分析 API 请求使用 hunspell 过滤器将 the foxes jumping quickly 词干提取为 the fox jump quick

请求指定了 en_US 区域设置,这意味着 <$ES_PATH_CONF>/hunspell/en_US 目录中的 .aff.dic 文件将用于 Hunspell 词典。

resp = client.indices.analyze(
    tokenizer="standard",
    filter=[
        {
            "type": "hunspell",
            "locale": "en_US"
        }
    ],
    text="the foxes jumping quickly",
)
print(resp)
const response = await client.indices.analyze({
  tokenizer: "standard",
  filter: [
    {
      type: "hunspell",
      locale: "en_US",
    },
  ],
  text: "the foxes jumping quickly",
});
console.log(response);
GET /_analyze
{
  "tokenizer": "standard",
  "filter": [
    {
      "type": "hunspell",
      "locale": "en_US"
    }
  ],
  "text": "the foxes jumping quickly"
}

过滤器生成以下标记

[ the, fox, jump, quick ]

可配置参数

编辑
dictionary

(可选,字符串或字符串数组) 一个或多个 .dic 文件(例如,en_US.dic, my_custom.dic),用于 Hunspell 词典。

默认情况下,hunspell 过滤器使用使用 langlanguagelocale 参数指定的 <$ES_PATH_CONF>/hunspell/<locale> 目录中的所有 .dic 文件。

dedup
(可选,布尔值) 如果为 true,则从过滤器的输出中删除重复的标记。默认为 true
lang

(必填*,字符串) locale 参数 的别名。

如果未指定此参数,则需要 languagelocale 参数。

language

(必填*,字符串) locale 参数 的别名。

如果未指定此参数,则需要 langlocale 参数。

locale

(必填*,字符串) 用于指定 Hunspell 词典的 .aff.dic 文件的区域设置目录。请参阅 配置 Hunspell 词典

如果未指定此参数,则需要 langlanguage 参数。

longest_only
(可选,布尔值) 如果为 true,则仅将每个标记的最长词干提取版本包含在输出中。如果为 false,则包含标记的所有词干提取版本。默认为 false

自定义并添加到分析器中

编辑

要自定义 hunspell 过滤器,请复制它以创建新自定义分词过滤器的基础。您可以使用其可配置参数修改过滤器。

例如,以下 创建索引 API 请求使用自定义 hunspell 过滤器 my_en_US_dict_stemmer 来配置新的 自定义分析器

my_en_US_dict_stemmer 过滤器使用 en_USlocale,这意味着 <$ES_PATH_CONF>/hunspell/en_US 目录中的 .aff.dic 文件将被使用。过滤器还包含 dedup 参数,其值为 false,这意味着不会从过滤器的输出中删除从词典添加的重复标记。

resp = client.indices.create(
    index="my-index-000001",
    settings={
        "analysis": {
            "analyzer": {
                "en": {
                    "tokenizer": "standard",
                    "filter": [
                        "my_en_US_dict_stemmer"
                    ]
                }
            },
            "filter": {
                "my_en_US_dict_stemmer": {
                    "type": "hunspell",
                    "locale": "en_US",
                    "dedup": False
                }
            }
        }
    },
)
print(resp)
response = client.indices.create(
  index: 'my-index-000001',
  body: {
    settings: {
      analysis: {
        analyzer: {
          en: {
            tokenizer: 'standard',
            filter: [
              'my_en_US_dict_stemmer'
            ]
          }
        },
        filter: {
          "my_en_US_dict_stemmer": {
            type: 'hunspell',
            locale: 'en_US',
            dedup: false
          }
        }
      }
    }
  }
)
puts response
const response = await client.indices.create({
  index: "my-index-000001",
  settings: {
    analysis: {
      analyzer: {
        en: {
          tokenizer: "standard",
          filter: ["my_en_US_dict_stemmer"],
        },
      },
      filter: {
        my_en_US_dict_stemmer: {
          type: "hunspell",
          locale: "en_US",
          dedup: false,
        },
      },
    },
  },
});
console.log(response);
PUT /my-index-000001
{
  "settings": {
    "analysis": {
      "analyzer": {
        "en": {
          "tokenizer": "standard",
          "filter": [ "my_en_US_dict_stemmer" ]
        }
      },
      "filter": {
        "my_en_US_dict_stemmer": {
          "type": "hunspell",
          "locale": "en_US",
          "dedup": false
        }
      }
    }
  }
}

设置

编辑

除了 ignore_case 设置 之外,您还可以使用 elasticsearch.ymlhunspell 过滤器配置以下全局设置

indices.analysis.hunspell.dictionary.lazy
(静态,布尔值) 如果为 true,则 Hunspell 词典的加载将延迟到使用词典时。如果为 false,则节点启动时会检查词典目录中的词典,并且会自动加载所有词典。默认为 false