Запрос Elasticsearch 6.3 с пробелом в поле ключевого слова и не возвращением всех документов - PullRequest
0 голосов
/ 17 октября 2018

У меня есть следующая часть отображения:

"name": {
    "store": "true",
    "type": "keyword"
}

и этот запрос:

{
    "query":{
        "query_string":{
            "query":"+(name:John Doe)",
            "fields":[

            ]
        }
    },
    "aggregations":{

        "name":{
            "terms":{
                "field":"name",
                "size":10
            }
        }
    }
}

Запрос должен вернуть более 100 результатов, однако он возвращает только несколько.Если я добавлю цитаты к Джону Доу так: \ "Джон Доу \", тогда он вернет все желаемые результаты.

Мне интересно, почему это происходит.Разве недостаточно того, что поле отображается как ключевое слово, чтобы Джон Доу был проанализирован как единое целое, и не следует добавлять кавычки?Кроме того, зачем возвращать меньше элементов без кавычек?

Примечание. В ES 1.4 тот же запрос работает нормально (хотя, честно говоря, это не те же данные, и вместо агрегаций используются фасеты).

1 Ответ

0 голосов
/ 17 октября 2018

Документация для запроса query string четко гласит:

Если поле является полем keyword, анализатор создаст термин single ...

Так что вам не нужно добавлять кавычки в строку поиска.Вместо этого вам нужно правильно написать свой запрос.В настоящее время ваш запрос пытается найти термин John в поле name, а термин Doe в во всех других полях !Поэтому вы должны переписать свой запрос одним из следующих способов:

  1. Добавьте скобки к поисковому запросу, чтобы анализатор запросов мог «понять», что все слова должны быть найдены в поле name:

    {
        "query": {
            "query_string": {
                "query": "+(name:(John Doe))",
                "fields": [
    
                ]
            }
        },
        "aggregations": {
            "name": {
                "terms": {
                    "field": "name",
                    "size": 10
                }
            }
        }
    }
    
  2. Укажите имя поля в массиве fields, а не в строке запроса:

    {
        "query": {
            "query_string": {
                "query": "+(John Doe)",
                "fields": [
                    "name"
                ]
            }
        },
        "aggregations": {
            "name": {
                "terms": {
                    "field": "name",
                    "size": 10
                }
            }
        }
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...