Поиск фильтра нижнего регистра Elasticsearch
Я пытаюсь выполнить поиск в моей базе данных и использовать термины фильтра верхнего/нижнего регистра, но я заметил, что в то время как query
применять анализаторы, я не могу понять, как применять анализатор нижнего регистра в отфильтрованном поиске, Здесь запрос:
{
"query": {
"filtered": {
"filter": {
"bool": {
"should": [
{
"term": {
"language": "mandarin" // Returns a doc
}
},
{
"term": {
"language": "Italian" // Does NOT return a doc, but will if lowercased
}
}
]
}
}
}
}
}
У меня есть тип languages
, который у меня есть внизу, используя:
"analyzer": {
"lower_keyword": {
"type": "custom",
"tokenizer": "keyword",
"filter": "lowercase"
}
}
и соответствующее отображение:
"mappings": {
"languages": {
"_id": {
"path": "languageID"
},
"properties": {
"languageID": {
"type": "integer"
},
"language": {
"type": "string",
"analyzer": "lower_keyword"
},
"native": {
"type": "string",
"analyzer": "keyword"
},
"meta": {
"type": "nested"
},
"language_suggest": {
"type": "completion"
}
}
}
}
Ответы
Ответ 1
Проблема заключается в том, что у вас есть поле, которое вы проанализировали во время индекса, чтобы ввести его в нижний регистр, но вы используете фильтр терминов для запроса, который не анализируется:
Фильтр терминов
Фильтрует документы, у которых есть поля, содержащие термин (не анализируется). Подобно термину query, за исключением того, что он действует как фильтр.
http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-term-filter.html
Вместо этого я попытаюсь использовать фильтр запросов:
Фильтр запросов
Обертывает любой запрос, который будет использоваться в качестве фильтра. Может быть размещен в запросах которые принимают фильтр.
Пример:
{
"constantScore" : {
"filter" : {
"query" : {
"query_string" : {
"query" : "this AND that OR thus"
}
}
}
} }
http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-query-filter.html#query-dsl-query-filter