У меня есть запрос, который должен искать слова в нижнем регистре.
На самом деле у меня был index_analyzer с фильтром нижнего регистра, но я хотел добавить также search_analyzer, чтобы выполнять поиск без учета регистра.
"analysis": {
"analyzer" : {
"DefaultAnalyzer": {
"type": "custom",
"tokenizer": "whitespace",
"filter": [
"lowercase"
],
"char_filter": ["punctuation"]
},
"MyAnalyzer": {
"type": "custom",
"tokenizer": "first_letter",
"filter": [
"lowercase"
]
},
Так что я просто подумал добавить тот же анализатор, что и search_analyzer в сопоставление
"index_analyzer": "DefaultAnalyzer",
"search_analyzer": "DefaultAnalyzer",
"dynamic" : false,
"_source": { "enabled": true },
"properties" : {
"name": {
"type": "multi_field",
"fields": {
"name": {
"type": "string",
"store": true
},
"startletter": {
"type": "string",
"index_analyzer": "MyAnalyzer",
"search_analyzer": "MyAnalyzer",
"store": true
}
}
},
Делая это, если я вручную запрашиваю Elastic Search с помощью
curl -XGET host:9200/my-index/_analyze -d 'Test'
Я вижу, что термин запроса правильно написан в нижнем регистре
{
"tokens": [
{
"token": "test",
"start_offset": 0,
"end_offset": 4,
"type": "<ALPHANUM>",
"position": 1
}
]
}
Но выполнение из кода
- если я использую поисковый термин в верхнем регистре, ES возвращает ноль совпадений (даже если мы видели, что применяется search_analyzer)
- если я использую поисковый запрос в нижнем регистре, ES возвращает мне правильное количество результатов (сотни)
Хотя я хотел бы иметь такой же результат независимо от случая.
В коде я просто создаю запрос с фильтром терминов, вот так
{
"filter": {
"term": {
"name.startletter": "O"
}
},
"size": 10000,
"query": {
"match_all": {}
}
}
Что я делаю неправильно? Почему я не получаю никакого результата?