То, что вы ищете, невозможно. Вы не можете иметь несколько анализаторов в одном поле.
И, учитывая ваши требования, вы можете просто добавить два фильтра, фильтр остановки и снежный ком и добавить их, как показано в разделе Solution 1
. Я также упомянул еще два подхода только для вашей информации, однако я считаю, что они не будут иметь большого смысла для вашего варианта использования.
Решение 1. При рассмотрении ваших требований используйте два фильтра (один для снежного кома и другой для стоп-слов)
Mapping
PUT <your_index_name>
{
"settings": {
"analysis" : {
"analyzer" : {
"my_analyzer" : {
"tokenizer" : "standard",
"filter" : ["standard", "lowercase", "my_snow", "my_stop"]
}
},
"filter" : {
"my_snow" : {
"type" : "snowball",
"language": "English"
},
"my_stop": {
"type": "stop",
"stopwords": "_english_"
}
}
}
},
"mappings": {
"doc": {
"_source": {
"enabled": true
},
"properties": {
"title": {
"type": "text",
"index": "true",
"store": true,
"analyzer": "my_analyzer"
}
}
}
}
}
Запрос анализа образца
POST <your_index_name>/_analyze
{
"analyzer": "my_analyzer",
"text": "This is the thing, perfection is not worth it"
}
Ответ на запрос
{
"tokens": [
{
"token": "thing",
"start_offset": 12,
"end_offset": 17,
"type": "<ALPHANUM>",
"position": 3
},
{
"token": "perfect",
"start_offset": 19,
"end_offset": 29,
"type": "<ALPHANUM>",
"position": 4
},
{
"token": "worth",
"start_offset": 37,
"end_offset": 42,
"type": "<ALPHANUM>",
"position": 7
}
]
}
Решение 2. Использование нескольких полей
Однако, если вы действительно настаиваете на том, чтобы вместо этого вы хотели иметь несколько анализаторов, вы можете создать multi-field и использовать оба анализатора.
Ниже показано, как будет выглядеть ваше отображение в этом случае. Я использую только приведенный ниже пример для поля title
, и вы можете применить изменения для других полей. Примечание, приведенное ниже, предназначено только для демонстрации, я бы предложил solution 1
для вашего требования
PUT <your_index_name>
{
"settings":{
//same as the one you've posted in the question.
},
"mappings":{
"doc":{
"_source":{
"enabled":true
},
"properties":{
"title":{
"type":"text",
"index":"true",
"store":true,
"analyzer":"my_analyzer",
"fields":{
"withstopwords":{
"type":"text",
"analyzer":"stop_analyzer"
}
}
}
}
}
}
}
Обратите внимание, что вам нужно убедиться, что вы используете правильное имя поля при запросе.
В основном используйте поле title
для my_analyzer
и используйте title.stopwords
для stop_analyzer
.
Решение 3. Несколько индексов, один и тот же псевдоним
Для этого у вас в конечном итоге будет
some_index1:analyzer_type_1
some_index2:analyzer_type_2
Add alias "some_index" for both some_index1 & some_index2
Query using this alias "some_index"
И затем вы можете запросить, используя псевдоним, следующим образом. Обратите внимание, что при запросе с использованием some_index
поиск в обоих индексах some_index1
& some_index2
будет внутренним.
POST some_index/_search
{
"query": {
"match": {
"title": "perfection"
}
}
}
Надеюсь, это поможет!