Elasticsearch стал чувствительным к регистру после добавления анализатора синонимов

После того, как я добавил анализатор синонимов в my_index, индекс стал чувствительным к регистру.

У меня есть одно свойство под названием nationality, которое имеет synonym analyzer. Но кажется, что это свойство стало case sensitive из-за анализатора синонимов.

Вот мой /my_index/_mappings

{
  "my_index": {
    "mappings": {
      "items": {
        "properties": {
          .
          .
          .
          "nationality": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            },
            "analyzer": "synonym"
          },
          .
          .
          .
        }
      }
    }
  }
}

Внутри индекса у меня есть слово India COUNTRY. Когда я попытаюсь найти India nation с помощью приведенной ниже команды, я получу результат.

POST /my_index/_search
{
  "query": {
    "match": {
      "nationality": "India nation"
    }
  }
}

Но когда я ищу india (обратите внимание, что буква i в нижнем регистре), я ничего не получу. Я предполагаю, что это произошло потому, что я поставил фильтр uppercase перед synonym. Я сделал это, потому что синонимы в верхнем регистре. Таким образом, после прохождения этого фильтра запрос India будет INDIA.

Вот мой /my_index/_settings

{
  "my_index": {
    "settings": {
      "index": {
        "number_of_shards": "1",
        "provided_name": "my_index",
        "similarity": {
          "default": {
            "type": "BM25",
            "b": "0.9",
            "k1": "1.8"
          }
        },
        "creation_date": "1647924292297",
        "analysis": {
          "filter": {
            "synonym": {
              "type": "synonym",
              "lenient": "true",
              "synonyms": [
                "NATION, COUNTRY, FLAG"
              ]
            }
          },
          "analyzer": {
            "synonym": {
              "filter": [
                "uppercase",
                "synonym"
              ],
              "tokenizer": "whitespace"
            }
          }
        },
        "number_of_replicas": "1",
        "version": {
          "created": "6080099"
        }
      }
    }
  }
}

Есть ли способ сделать это свойство нечувствительным к регистру? Все решения, которые я нашел, показывают только то, что я должен либо установить весь текст внутри nationality в строчные, либо в прописные буквы. Но что, если у меня есть прописные и строчные буквы внутри индекса?

1
0
32
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Применяли ли вы фильтр синонимов после добавления ваших данных в индекс?

Если так, возможно, фраза "Страна Индии" была проиндексирована точно так же, как "СТРАНА Индии". Когда вы отправили запрос на сопоставление в индекс, ваш запрос был проанализирован и отправлен как «СТРАНА ИНДИИ», потому что у вас больше нет фильтра верхнего регистра, он сопоставляется, потому что вы используете запрос на сопоставление, достаточно совпадения одного из слов. Слово "СТРАНА" обеспечивает это.

Но когда вы отправляете однословный запрос «Индия», он анализируется и преобразуется в «ИНДИЯ» из-за вашего фильтра верхнего регистра, но в вашем индексе нет подходящего слова. У вас просто в документе есть "Индия СТРАНА".

В моем ответе есть небольшое предположение. Я надеюсь, что это будет полезно для понимания вашей проблемы.

Да, я также предполагаю, что это происходит здесь. Поэтому я думаю, что другой подход - установить все документы в моем индексе в верхнем регистре. Но у вас есть другое решение для этого? Спасибо

Muhammad Fhadli 23.03.2022 01:08

Я уже пытался указать на вашу проблему первым предложением. Сначала вам нужно создать сопоставление, включающее фильтр, анализатор и т. д., Затем вы поместите свои данные в индекс. Таким образом, и ваши данные, и запрос будут проанализированы с одинаковым подходом.

Alper Derya 23.03.2022 07:37

А, понятно, спасибо. Я не осознавал, что это влияет на данные внутри индекса. Спасибо

Muhammad Fhadli 24.03.2022 02:07

Я нашел решение!

Я не осознавал, что фильтр, который я применил в settings, применим при обновлении и поиске данных. Сначала я сделал этот шаг:

  1. Создать индекс с фильтром синонимов
  2. Вставить данные
  3. Добавьте uppercase перед фильтром синонимов

При этом фильтр uppercase не применяется к моим данным. Что я должен был сделать:

  1. Создайте индекс с фильтром uppercase и synonym (обратите внимание на порядок)
  2. Вставить данные Затем фильтр будет применен к моим данным.

Другие вопросы по теме