Фильтр токенов синонимов
Фильтр токенов synonym позволяет легко обрабатывать синонимы во время процесса анализа. Синонимы настраиваются с помощью файла конфигурации. Вот пример:
PUT /test_index
{
"settings": {
"index": {
"analysis": {
"analyzer": {
"synonym": {
"tokenizer": "whitespace",
"filter": [ "synonym" ]
}
},
"filter": {
"synonym": {
"type": "synonym",
"synonyms_path": "analysis/synonym.txt"
}
}
}
}
}
} Выше показана настройка фильтра synonym с путём analysis/synonym.txt (относительно расположения config). Затем анализатор synonym настраивается с указанием фильтра.
Этот фильтр токенизирует синонимы с помощью любого токенизатора и фильтров токенов, которые предшествуют ему в цепочке.
Дополнительные настройки:
-
expand(по умолчаниюtrue). -
lenient(по умолчаниюfalse). Еслиtrueигнорирует исключения при парсинге конфигурации синонимов. Важно отметить, что игнорируются только те правила синонимов, которые не могут быть обработаны. Например, рассмотрим следующий запрос:
PUT /test_index
{
"settings": {
"index": {
"analysis": {
"analyzer": {
"synonym": {
"tokenizer": "standard",
"filter": [ "my_stop", "synonym" ]
}
},
"filter": {
"my_stop": {
"type": "stop",
"stopwords": [ "bar" ]
},
"synonym": {
"type": "synonym",
"lenient": true,
"synonyms": [ "foo, bar => baz" ]
}
}
}
}
}
} В данном запросе слово bar пропускается, но отображение foo => baz всё равно добавляется. Однако, если добавляемое отображение было foo, baz => bar, ничего не добавлялось бы в список синонимов. Это происходит потому, что целевое слово для отображения само исключается, поскольку это стоп-слово. Аналогично, если отображение было «bar, foo, baz» и expand было установлено на false, отображение не добавлялось бы, так как при expand=false целевое отображение является первым словом. Однако, если expand=true, то добавленные отображения были бы эквивалентны foo, baz => foo, baz, т.е. все отображения, кроме стоп-слов.
tokenizer и ignore_case устарели
Параметр tokenizer управляет токенизаторами, которые будут использоваться для токенизации синонима, этот параметр предназначен для обратной совместимости для индексов, созданных до версии 6.0. Параметр ignore_case работает только с параметром tokenizer.
Поддерживаются два формата синонимов: Solr, WordNet.
Синонимы Solr
Следующий пример формата файла:
# Blank lines and lines starting with pound are comments. # Explicit mappings match any token sequence on the LHS of "=>" # and replace with all alternatives on the RHS. These types of mappings # ignore the expand parameter in the schema. # Examples: i-pod, i pod => ipod sea biscuit, sea biscit => seabiscuit # Equivalent synonyms may be separated with commas and give # no explicit mapping. In this case the mapping behavior will # be taken from the expand parameter in the schema. This allows # the same synonym file to be used in different synonym handling strategies. # Examples: ipod, i-pod, i pod foozball , foosball universe , cosmos lol, laughing out loud # If expand==true, "ipod, i-pod, i pod" is equivalent # to the explicit mapping: ipod, i-pod, i pod => ipod, i-pod, i pod # If expand==false, "ipod, i-pod, i pod" is equivalent # to the explicit mapping: ipod, i-pod, i pod => ipod # Multiple synonym mapping entries are merged. foo => foo bar foo => baz # is equivalent to foo => foo bar, baz
Также можно определить синонимы для фильтра непосредственно в файле конфигурации (обратите внимание на использование synonyms вместо synonyms_path):
PUT /test_index
{
"settings": {
"index": {
"analysis": {
"filter": {
"synonym": {
"type": "synonym",
"synonyms": [
"i-pod, i pod => ipod",
"universe, cosmos"
]
}
}
}
}
}
} Однако рекомендуется определять большие наборы синонимов в файле с использованием synonyms_path, поскольку указание их в строке излишне увеличивает размер кластера.
Синонимы WordNet
Синонимы на основе формата WordNet можно объявить, используя format:
PUT /test_index
{
"settings": {
"index": {
"analysis": {
"filter": {
"synonym": {
"type": "synonym",
"format": "wordnet",
"synonyms": [
"s(100000001,1,'abstain',v,1,0).",
"s(100000001,2,'refrain',v,1,0).",
"s(100000001,3,'desist',v,1,0)."
]
}
}
}
}
}
} Поддерживается также использование synonyms_path для определения синонимов WordNet в файле.
Парсинг файлов синонимов
Elasticsearch будет использовать фильтры токенов, предшествующие фильтру синонимов в цепочке токенизатора, для парсинга записей в файле синонимов. Например, если фильтр синонимов размещён после стеммера, то стеммер также будет применяться к записям синонимов. Поскольку записи в карте синонимов не могут иметь наложенные позиции, некоторые фильтры токенов могут вызвать проблемы. Фильтры токенов, которые производят несколько версий токена, могут выбирать, какую версию токена выводить при парсинге синонимов, например, asciifolding будет производить только сложенную версию токена. Другие, например, multiplexer, word_delimiter_graph или ngram, вызовут ошибку.
Если вам необходимо создать анализатор, который включает в себя как фильтры многотокенов, так и фильтры синонимов, рассмотрите использование фильтра мультиплексора, с фильтрами многотокенов в одной ветви и фильтром синонимов в другой.
© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/7.17/analysis-synonym-tokenfilter.html