Подтвердить что ты не робот

Поиск фильтра нижнего регистра 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"
            }
        }
    }
}
4b9b3361

Ответ 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