Согласно документации эластичного поиска,
В анализаторе должен быть ровно один токенизатор.
Однако в настройках можно определить несколько анализаторов, и вы можетенастроить отдельный анализатор для каждого поля.
Если вы хотите, чтобы само отдельное поле использовалось с использованием другого анализатора, один из вариантов - сделать это поле многопольным согласно этой ссылке
PUT my_index
{
"mappings": {
"_doc": {
"properties": {
"title": {
"type": "text",
"analyzer": "whitespace"
"fields": {
"ngram": {
"type": "text",
"analyzer": "my_analyzer"
}
}
}
}
}
}
}
Так что, если вы настроили как указано выше, ваш запрос должен использовать поля title
и title.ngram
.
GET my_index/_search
{
"query": {
"multi_match": {
"query": "search @#$ whatever",
"fields": [
"title",
"title.ngram"
],
"type": "most_fields"
}
}
}
В качестве другого варианта вы можете сделать следующее:
- Создать два индекса.
- Первый индекс имеет поле
title
с анализатором my_analyzer
- Второй индекс имеет поле
title
с анализатором whitespace
- Имеется такой же
alias
, созданный дляоба из них, как показано ниже
Выполните следующее:
POST _aliases
{
"actions":[
{
"add":{
"index":"index A",
"alias":"index"
}
},
{
"add":{
"index":"index B",
"alias":"index"
}
}
]
}
Поэтому, когда вы в конечном итоге напишите запрос, он должен указывать на этот псевдоним, который, в свою очередь, будет запрашивать несколько индексов,
Надеюсь, это поможет!