Тип поиска, который вы ищете, может быть достигнут при использовании фильтра маркеров stemmer во время индексации.
Давайте посмотрим, как это работает, используя пример сопоставления, как показано ниже:
PUT test
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"type": "custom",
"filter": [
"lowercase",
"my_stemmer"
],
"tokenizer": "whitespace"
}
},
"filter": {
"my_stemmer": {
"type": "stemmer",
"name": "english"
}
}
}
},
"mappings": {
"doc": {
"properties": {
"description": {
"type": "text",
"analyzer": "my_analyzer",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
}
}
}
}
Для поля description
в приведенном выше отображении мы использовали анализатор как my_analyzer
.Этот анализатор будет применять фильтры токенов lowercase
и my_stemmer
.my_stemmer
будет применяться english
к входному значению.
Например, если мы проиндексируем документ, как показано ниже:
{
"description": "JBL speakers build with perfection"
}
Индексируемые токены:
jbl
speaker
build
with
perfect
Обратите внимание: speakers
индексируется как speaker
, а perfection
как perfect
.
Теперь, если вы ищете speakers
или speaker
, оба совпадут.Точно так же, если вы ищете perfect
, приведенный выше документ будет совпадать.
Почему speakers
или perfection
будут совпадать, возможно, у вас возник вопрос.Причина этого заключается в том, что по умолчанию для эластичного поиска применяется тот же анализатор, который использовался при индексации также во время поиска.Так что, если вы ищете perfection
, он будет фактически искать perfect
и, следовательно, совпадение.
Подробнее о stemming .