AWS ElasticSearch - запрос на совпадение не работает - PullRequest
0 голосов
/ 23 апреля 2020

Я развернул экземпляр поиска elasti c через управляемый сервис AWS ElasticSearch (версия 7.4.2), и у меня возникли проблемы с выполнением запросов на "соответствие". Я играю с образцом набора данных о рейсах и выполняю следующий запрос:

Данные:

[
    {
        "FlightNum": "HX0WBLI",
        "DestCountry": "IT",
        "OriginWeather": "Damaging Wind",
        "OriginCityName": "Chitose / Tomakomai",
        "AvgTicketPrice": 988.8975638746068,
        "DistanceMiles": 5650.511340218511,
        "FlightDelay": false,
        "DestWeather": "Sunny",
        "Dest": "Verona Villafranca Airport"
    },
    {
        "FlightNum": "VG7H7U4",
        "DestCountry": "IT",
        "OriginWeather": "Cloudy",
        "OriginCityName": "Milan",
        "AvgTicketPrice": 223.66801608639728,
        "DistanceMiles": 78.45850223819446,
        "FlightDelay": false,
        "DestWeather": "Sunny",
        "Dest": "Verona Villafranca Airport"
    },
    {
        "FlightNum": "B3CVVO3",
        "DestCountry": "IT",
        "OriginWeather": "Cloudy",
        "OriginCityName": "Sydney",
        "AvgTicketPrice": 360.41688271717148,
        "DistanceMiles": 10207.122317757072,
        "FlightDelay": false,
        "DestWeather": "Rain",
        "Dest": "Verona Villafranca Airport"
    }
]

Запрос:

POST kibana_sample_data_flights/_search
{
   "query": {
       "match":{
           "Dest": "Verona"
       }
    }
}

Я знаю, что есть пункты с этим должно частично соответствовать, но я получаю пустой набор результатов обратно. Указание полной стоимости «Аэропорт Верона Виллафранка» дает некоторые результаты. Нужно ли что-то включить, чтобы запрос работал выше?

Также тот же запрос работает, как и ожидалось, для локального экземпляра (развернутого через docker).

Спасибо за вашу помощь!

1 Ответ

1 голос
/ 24 апреля 2020

Поскольку вы не предоставили свое отображение и рассматриваете свой вопрос, в вашем отображении, похоже, поле Dest определено как keyword, которое не анализируется. следовательно, сохранение Verona Villafranca Airport будет сохранено как есть.

Когда вы используете запрос совпадения , который анализируется, означает, что он использует тот же анализатор, который использовался для индексации поля, которое будет keyword в этом случае, следовательно, поиск Verona Villafranca Airport возвращает результат, так как этот токен присутствует в инвертированном индексе, тогда как поиск Verona не будет совпадать ни с одним токеном, следовательно, вы не получите никакого результата.

Решение: если вам нужен поиск без учета регистра и вы хотите выполнить поиск по Verona или airport, то вам нужно определить это поле Dest как text, и Elasticsearch по умолчанию использует анализатор standard, который автоматически строчными буквами и разделить текст на пустое место, что позволит включить вышеуказанные критерии поиска.

И позже вы можете использовать тот же самый запрос match, который вы используете, и он будет работать, как описано в документации.

Обратите внимание на match запрос от do c

Возвращает документы, которые соответствуют предоставленному тексту, номеру, дате или логическому значению. Предоставленный текст анализируется перед сопоставлением.

Токены, сгенерированные стандартным анализатором

POST /_analyze
{
    "text" : "Verona Villafranca Airport",
    "analyzer" : "standard"
}

{
    "tokens": [
        {
            "token": "verona",
            "start_offset": 0,
            "end_offset": 6,
            "type": "<ALPHANUM>",
            "position": 0
        },
        {
            "token": "villafranca",
            "start_offset": 7,
            "end_offset": 18,
            "type": "<ALPHANUM>",
            "position": 1
        },
        {
            "token": "airport",
            "start_offset": 19,
            "end_offset": 26,
            "type": "<ALPHANUM>",
            "position": 2
        }
    ]
}

Токены, сгенерированные по ключевому слову

POST /_analyze

{
    "text" : "Verona Villafranca Airport",
    "analyzer" : "keyword"
}

{
    "tokens": [
        {
            "token": "Verona Villafranca Airport",
            "start_offset": 0,
            "end_offset": 26,
            "type": "word",
            "position": 0
        }
    ]
}
...