ELASTICSEARCH: список через запятую, дающий противоречивые результаты со стандартным анализатором - PullRequest
0 голосов
/ 27 марта 2019

Выполнение базового запроса к моей базе данных эластичного поиска дает противоречивые результаты.

Я могу сопоставить запрос к БД по идентификатору напрямую

{
    "query": {
        "bool": {
          "must": [
            {
              "term": {
                "id": {
                  "value": "84e042ce-74e3-4c51-a1d9-db2f1c3d57ef"
                }
              }
            }
          ]
        }
    }
}

Возвращает одну запись, как и ожидалось (2показанные поля)

"id": "84e042ce-74e3-4c51-a1d9-db2f1c3d57ef",
"usersNotified": "e721a8d9-8001-4003-9af9-1c7397fd7079,fc18bbc4-f7f1-4151-bf88-390597da9510,061c9195-cb97-4777-8577-a8e555b95c7f,8e4e7641-b135-46e5-b9b4-c42393450108,601785e7-1c18-43b4-924e-cf52a15e3204,ec132f25-3d1d-41d8-ab16-e60a53ee9483"

Когда я добавляю match_phrase в запрос, ищущий Guid, который присутствует в поле "usersNotified", он возвращается пустым.

{
    "query": {
        "bool": {
          "must": [
            {
              "term": {
                "id": {
                  "value": "84e042ce-74e3-4c51-a1d9-db2f1c3d57ef"
                }
              }
            },
            {
              "match_phrase": {
                "usersNotified": {
                  "query": "601785e7-1c18-43b4-924e-cf52a15e3204"
                }
              }
            }
          ]
        }
    }
}

{
    "took": 4,
    "timed_out": false,
    "_shards": {
        "total": 20,
        "successful": 20,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 0,
        "max_score": null,
        "hits": []
    }
}

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

{
    "query": {
        "bool": {
          "must": [
            {
              "term": {
                "id": {
                  "value": "d48e6ccc-f343-4840-af29-317fef829da1"
                }
              }
            },
            {
              "match_phrase": {
                "usersNotified": {
                  "query": "601785e7-1c18-43b4-924e-cf52a15e3204"
                }
              }
            }
          ]
        }
    }
}

Как показано:

"id": "d48e6ccc-f343-4840-af29-317fef829da1",
"usersNotified": "e721a8d9-8001-4003-9af9-1c7397fd7079,fdc40427-9db0-44d8-8ce3-45c90489dc19,061c9195-cb97-4777-8577-a8e555b95c7f,601785e7-1c18-43b4-924e-cf52a15e3204,ec132f25-3d1d-41d8-ab16-e60a53ee9483"

Так что я не понимаю, почему работает тот же запросв одном сценарии, но не в другом.Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 03 апреля 2019

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

Я думаю, что причина, по которой я не сопоставил UID в моем поле, заключалась в том, что стандартный анализатор, определенный для этого поля, анализировал с использованием языкового алгоритма и рассматривал дефисы в GUID как дефис и исключал их из рассмотрения.

Я до сих пор не понимаю, почему это может совпадать несколько раз, а не с другим, но после этой статьи ТА Мне удалось отсканировать небольшое подмножество и получить желаемые результаты.

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

{
"query": {
    "bool": {
      "must": [
        {
          "term": {
            "id": {
              "value": "d48e6ccc-f343-4840-af29-317fef829da1"
            }
          }
        },
        {
          "match_phrase": {
            "usersNotified": {
              "query": "601785e7-1c18-43b4-924e-cf52a15e3204"
            }
          }
        }
      ]
    }
}

с

{
"query": {
    "bool": {
      "must": [
        {
          "term": {
            "id": {
              "value": "d48e6ccc-f343-4840-af29-317fef829da1"
            }
          }
        },
        {
           "term": {
               "userssNotified": {
                   "value": "601785e7-1c18-43b4-924e-cf52a15e3204"
               }
           }
        }
      ]
    }
}

И это сработало. Позже я получу шанс попробовать с полным набором данных (требуется полное повторное сканирование), чтобы убедиться, что он работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...