Как токенизировать текст в 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
, будут пригодны для полнотекстового поиска.
Если у вас уже есть индекс, вы можете использовать следующие подходы
- Используйте функцию copy_to и скопируйте все значения полей внутри одного поля, чтобы сделать их доступными для поиска в одном поле.
- Создайте конвейер ввода и запустите вызов 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"
}
}
}
После выполнения _update_by_query
вызова API все существующие данные обновляются. Для новых входящих данных вы можете добавить конвейер ввода как default_pipeline.
PUT my_index/_settings
{
"index.default_pipeline": "all_into_one"
}