Как токенизировать текст в elk?

Я хочу токенизировать поле(текст) во всех документах(60k) индекса(post) какой лучший подход?

GET /_analyze
{
"analyzer" : "standard",
"text" : ["this is a test"]
}

Нужен токенизированный текст для облака тегов в моем приложении Django

По умолчанию все строковые данные индексируются как text и keyword с стандартным анализатором. Для явного создания отображения индекса можно использовать следующий вызов API.

PUT my_index
{
  "mappings": {
    "properties": {
      "my_field_1": {
        "type": "text",
        "analyzer": "standard"
      },
      "my_field_2": {
        "type": "text",
        "analyzer": "standard"
      }
    }
  }
}

В этом случае все данные, проиндексированные в my_field_1 and my_field_2, будут пригодны для полнотекстового поиска.

Если у вас уже есть индекс, вы можете использовать следующие подходы

  1. Используйте функцию copy_to и скопируйте все значения полей внутри одного поля, чтобы сделать их доступными для поиска в одном поле.
  2. Создайте конвейер ввода и запустите вызов API update by query. Я привожу пример ниже.

PUT my_index2/_doc/1
{
  "my_field_1": "musab dogan",
  "my_field_2": "elasticsearch opensearch"
}

PUT _ingest/pipeline/all_into_one
{
  "description": "Copy selected fields to a single new field",
  "processors": [
    {
      "script": {
        "source": """
          def newField = [];
          for (entry in ctx.entrySet()) {
            // Exclude fields starting with underscore
            if (!entry.getKey().startsWith("_")) {
              newField.add(entry.getKey() + ": " + entry.getValue());
            }
          }
          ctx['new_field'] = newField;
        """
      }
    }
  ]
}

POST my_index2/_update_by_query?pipeline=all_into_one

GET my_index2/_search
{
  "query": {
    "match": {
      "new_field": "musab"
    }
  }
}

enter image description here

После выполнения _update_by_query вызова API все существующие данные обновляются. Для новых входящих данных вы можете добавить конвейер ввода как default_pipeline.

PUT my_index/_settings
{
  "index.default_pipeline": "all_into_one"
}
Вернуться на верх