Эластичный поиск с точным соответствием - PullRequest
0 голосов
/ 27 августа 2018

У меня возникла проблема при запросе эластичного поиска.Ниже мой запрос

GET _search {
"query": {
    "bool": {
        "must": [{
                "match": {
                    "name": "SomeName"
                }
            },
            {
                "match": {
                    "type": "SomeType"
                }
            },
            {
                "match": {
                    "productId": "ff134be8-10fc-4461-b620-79s51199c7qb"
                }
            },
            {
                "range": {
                    "request_date": {
                        "from": "2018-08-22T12:16:37,392",
                        "to": "2018-08-28T12:17:41,137",
                        "format": "YYYY-MM-dd'T'HH:mm:ss,SSS"
                    }
                }
            }

        ]
    }
}
}

Я использую три запроса на совпадение и запрос диапазона в запросе bool.Я собираюсь получить документы с этими точными совпадениями и с этим диапазоном дат.Здесь, если я изменю имя и значение типа, я не получу результаты.Но для productId, если я поставлю только ff134be8, я получу результаты.Кто-нибудь знает, почему это?,Точное совпадение работает по имени и типу, но не для productId

1 Ответ

0 голосов
/ 27 августа 2018

Вам нужно установить отображение вашего productId на keyword, чтобы избежать токенизации. Со стандартным токенизатором "ff134be8-10fc-4461-b620-79s51199c7qb" создаст ["ff134be8", "10fc", "4461", "b620", "79s51199c7qb"] как токены.

У вас есть разные варианты:

1 / используйте термин запроса для проверки без анализа содержимого поля

...
    {
        "term": {
            "productId": "ff134be8-10fc-4461-b620-79s51199c7qb"
        }
    },
    ...

2 / если вы находитесь в Elasticsearch 6.X, вы можете изменить свой запрос на

...
{
    "match": {
        "productId.keyword": "ff134be8-10fc-4461-b620-79s51199c7qb"
    }
},
...

По мере того, какasticsearch создаст подполе keyword с типом keyword для всех строковых полей

Лучший вариант, конечно, первый. Всегда используйте term query, если вы пытаетесь сопоставить точное содержание.

...