Spec-Zone.ru › Elasticsearch 8
›Elasticsearch Руководство [8.17] ›Отображение ›Типы данных полей

Семейство типов text

Семейство типов text включает следующие типы полей:

  • text, традиционный тип поля для полнотекстового содержимого, например, тела электронного письма или описания продукта.
  • match_only_text, оптимизированная по памяти версия text, которая отключает вычисление релевантности и работает медленнее с запросами, требующими позиций. Она лучше всего подходит для индексации журнальных сообщений.

Тип поля text

Поле для индексирования значений полного текста, таких как тело электронного письма или описание продукта. Эти поля являются analyzed, то есть они проходят через анализатор, чтобы преобразовать строку в список отдельных терминов перед индексированием. Этот процесс анализа позволяет Elasticsearch искать отдельные слова внутри каждого поля полного текста. Поля text не используются для сортировки и редко используются для агрегаций (хотя значимая агрегация текстов является заметным исключением).

Поля типа text наилучшим образом подходят для неструктурированного, но удобочитаемого содержимого. Если вам нужно индексировать неструктурированное содержимое, сгенерированное машиной, см. Отображение неструктурированного содержимого.

Если вам нужно индексировать структурированное содержимое, такое как адреса электронной почты, имена хостов, коды состояния или теги, скорее всего, вам следует использовать поле keyword.

Ниже приведен пример отображения для поля text:

resp = client.indices.create(
    index="my-index-000001",
    mappings={
        "properties": {
            "full_name": {
                "type": "text"
            }
        }
    },
)
print(resp)
response = client.indices.create(
  index: 'my-index-000001',
  body: {
    mappings: {
      properties: {
        full_name: {
          type: 'text'
        }
      }
    }
  }
)
puts response
const response = await client.indices.create({
  index: "my-index-000001",
  mappings: {
    properties: {
      full_name: {
        type: "text",
      },
    },
  },
});
console.log(response);
PUT my-index-000001
{
  "mappings": {
    "properties": {
      "full_name": {
        "type":  "text"
      }
    }
  }
}

Использование поля как text и keyword

Иногда полезно иметь как полнотекстовую (text), так и ключевую (keyword) версию одного и того же поля: одну для полнотекстового поиска и другую для агрегаций и сортировки. Это можно сделать с помощью multi-fields.

Параметры для полей text

Следующие параметры принимаются полями типа text:

analyzer

Анализатор, который должен использоваться для поля text, как при индексировании, так и при поиске (если не переопределено параметром search_analyzer). По умолчанию используется анализатор по умолчанию для индекса, или standard анализатор.

eager_global_ordinals

Нужно ли загружать глобальные ординалы при обновлении? Принимает true или false (по умолчанию). Включение этого параметра рекомендуется для полей, которые часто используются для агрегаций (значимых) терминов.

fielddata

Может ли поле использовать полевые данные в памяти для сортировки, агрегаций или скриптов? Принимает true или false (по умолчанию).

fielddata_frequency_filter

Специальные настройки, которые позволяют определить, какие значения загружать в память, когда fielddata включено. По умолчанию загружаются все значения.

fields

Multi-fields позволяют индексировать одно и то же строковое значение несколькими способами для разных целей, например, одно поле для поиска и multi-поле для сортировки и агрегаций, или одно строковое значение, проанализированное разными анализаторами.

index

Должно ли поле быть доступным для поиска? Принимает true (по умолчанию) или false.

index_options

Какая информация должна храниться в индексе для поиска и выделения. По умолчанию positions.

index_prefixes

Если включено, префиксы терминов длиной от 2 до 5 символов индексируются в отдельное поле. Это позволяет более эффективно выполнять поиски по префиксам, но увеличивает размер индекса.

index_phrases

Если включено, двухсловные словосочетания (шинглы) индексируются в отдельное поле. Это позволяет более эффективно выполнять точные запросы по фразам (без отклонений), но увеличивает размер индекса. Обратите внимание, что это работает лучше, когда стоп-слова не удаляются, так как фразы, содержащие стоп-слова, не будут использовать вспомогательное поле и вернутся к стандартному запросу по фразе. Принимает true или false (по умолчанию).

norms

Следует ли учитывать длину поля при оценке результатов поиска. Принимает true (по умолчанию) или false.

position_increment_gap

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

store

Должны ли значения поля храниться и быть доступными отдельно от поля _source. Принимает true или false (по умолчанию).

search_analyzer

Анализатор, который должен использоваться при поиске в поле text. По умолчанию используется значение analyzer.

search_quote_analyzer

Анализатор, который должен использоваться при поиске по фразе. По умолчанию используется значение search_analyzer.

similarity

Какой алгоритм оценки или подобия следует использовать. По умолчанию BM25.

term_vector

Необходимо ли сохранять векторы терминов для поля. По умолчанию no.

meta

Метаданные о поле.

Синтетический _source

Синтетический _source доступен только для индексов TSDB (индексы, для которых index.mode установлено в значение time_series). Для других индексов синтетический _source находится в техническом превью. Функции в техническом превью могут быть изменены или удалены в будущих выпусках. Elastic будет работать над устранением любых проблем, но функции в техническом превью не подпадают под SLA поддержки официальных функций GA.

Поля text поддерживают синтетический _source, если они имеют подполе keyword, которое поддерживает синтетический _source, или если поле text устанавливает store в значение true. В любом случае, он может не иметь copy_to.

Если используется подполе keyword, то значения сортируются так же, как и значения поля keyword. По умолчанию это означает сортировку с удалением дубликатов. Таким образом:

resp = client.indices.create(
    index="idx",
    settings={
        "index": {
            "mapping": {
                "source": {
                    "mode": "synthetic"
                }
            }
        }
    },
    mappings={
        "properties": {
            "text": {
                "type": "text",
                "fields": {
                    "raw": {
                        "type": "keyword"
                    }
                }
            }
        }
    },
)
print(resp)

resp1 = client.index(
    index="idx",
    id="1",
    document={
        "text": [
            "the quick brown fox",
            "the quick brown fox",
            "jumped over the lazy dog"
        ]
    },
)
print(resp1)
const response = await client.indices.create({
  index: "idx",
  settings: {
    index: {
      mapping: {
        source: {
          mode: "synthetic",
        },
      },
    },
  },
  mappings: {
    properties: {
      text: {
        type: "text",
        fields: {
          raw: {
            type: "keyword",
          },
        },
      },
    },
  },
});
console.log(response);

const response1 = await client.index({
  index: "idx",
  id: 1,
  document: {
    text: [
      "the quick brown fox",
      "the quick brown fox",
      "jumped over the lazy dog",
    ],
  },
});
console.log(response1);
PUT idx
{
  "settings": {
    "index": {
      "mapping": {
        "source": {
          "mode": "synthetic"
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "text": {
        "type": "text",
        "fields": {
          "raw": {
            "type": "keyword"
          }
        }
      }
    }
  }
}
PUT idx/_doc/1
{
  "text": [
    "the quick brown fox",
    "the quick brown fox",
    "jumped over the lazy dog"
  ]
}

Преобразуется в:

{
  "text": [
    "jumped over the lazy dog",
    "the quick brown fox"
  ]
}

Переупорядочение текстовых полей может повлиять на запросы фразы и запросы span. Подробнее см. обсуждение position_increment_gap. Этого можно избежать, убедившись, что параметр slop в запросах фразы меньше, чем position_increment_gap. Это значение по умолчанию.

Если поле text устанавливает store в значение true, то порядок и дубликаты сохраняются.

resp = client.indices.create(
    index="idx",
    settings={
        "index": {
            "mapping": {
                "source": {
                    "mode": "synthetic"
                }
            }
        }
    },
    mappings={
        "properties": {
            "text": {
                "type": "text",
                "store": True
            }
        }
    },
)
print(resp)

resp1 = client.index(
    index="idx",
    id="1",
    document={
        "text": [
            "the quick brown fox",
            "the quick brown fox",
            "jumped over the lazy dog"
        ]
    },
)
print(resp1)
const response = await client.indices.create({
  index: "idx",
  settings: {
    index: {
      mapping: {
        source: {
          mode: "synthetic",
        },
      },
    },
  },
  mappings: {
    properties: {
      text: {
        type: "text",
        store: true,
      },
    },
  },
});
console.log(response);

const response1 = await client.index({
  index: "idx",
  id: 1,
  document: {
    text: [
      "the quick brown fox",
      "the quick brown fox",
      "jumped over the lazy dog",
    ],
  },
});
console.log(response1);
PUT idx
{
  "settings": {
    "index": {
      "mapping": {
        "source": {
          "mode": "synthetic"
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "text": { "type": "text", "store": true }
    }
  }
}
PUT idx/_doc/1
{
  "text": [
    "the quick brown fox",
    "the quick brown fox",
    "jumped over the lazy dog"
  ]
}

Преобразуется в:

{
  "text": [
    "the quick brown fox",
    "the quick brown fox",
    "jumped over the lazy dog"
  ]
}

fielddata параметр сопоставления

Поля text по умолчанию доступны для поиска, но по умолчанию недоступны для агрегаций, сортировки или скриптов. Если вы попытаетесь отсортировать, агрегировать или получить доступ к значениям из поля text с помощью скрипта, вы увидите исключение, указывающее на то, что данные поля по умолчанию отключены для текстовых полей. Для загрузки данных поля в память установите параметр fielddata=true для вашего поля.

Загрузка данных поля в память может значительно увеличить потребление памяти.

Данные поля — единственный способ доступа к обработанным токенам из поля полного текста в агрегациях, сортировке или скриптах. Например, поле полного текста, такое как New York, будет обработано как new и york. Для агрегации по этим токенам необходимы данные поля.

Перед включением fielddata

Обычно не имеет смысла включать fielddata для текстовых полей. Данные поля хранятся в куче с кэшем данных поля, потому что их вычисление дорогостоящее. Вычисление данных поля может привести к всплескам задержек, а увеличение использования кучи является причиной проблем с производительностью кластера.

Большинство пользователей, которые хотят работать с текстовыми полями больше, используют сопоставления нескольких полей, имея как поле text для полнотекстового поиска, так и необработанное поле keyword для агрегаций, как показано ниже:

resp = client.indices.create(
    index="my-index-000001",
    mappings={
        "properties": {
            "my_field": {
                "type": "text",
                "fields": {
                    "keyword": {
                        "type": "keyword"
                    }
                }
            }
        }
    },
)
print(resp)
response = client.indices.create(
  index: 'my-index-000001',
  body: {
    mappings: {
      properties: {
        my_field: {
          type: 'text',
          fields: {
            keyword: {
              type: 'keyword'
            }
          }
        }
      }
    }
  }
)
puts response
res, err := es.Indices.Create(
	"my-index-000001",
	es.Indices.Create.WithBody(strings.NewReader(`{
	  "mappings": {
	    "properties": {
	      "my_field": {
	        "type": "text",
	        "fields": {
	          "keyword": {
	            "type": "keyword"
	          }
	        }
	      }
	    }
	  }
	}`)),
)
fmt.Println(res, err)
const response = await client.indices.create({
  index: "my-index-000001",
  mappings: {
    properties: {
      my_field: {
        type: "text",
        fields: {
          keyword: {
            type: "keyword",
          },
        },
      },
    },
  },
});
console.log(response);
PUT my-index-000001
{
  "mappings": {
    "properties": {
      "my_field": { 
        "type": "text",
        "fields": {
          "keyword": { 
            "type": "keyword"
          }
        }
      }
    }
  }
}

Используйте поле my_field для поиска.

Используйте поле my_field.keyword для агрегаций, сортировки или в скриптах.

Включение fielddata для полей text

Вы можете включить fielddata для существующего поля text с помощью API обновления сопоставления следующим образом:

resp = client.indices.put_mapping(
    index="my-index-000001",
    properties={
        "my_field": {
            "type": "text",
            "fielddata": True
        }
    },
)
print(resp)
response = client.indices.put_mapping(
  index: 'my-index-000001',
  body: {
    properties: {
      my_field: {
        type: 'text',
        fielddata: true
      }
    }
  }
)
puts response
res, err := es.Indices.PutMapping(
	[]string{"my-index-000001"},
	strings.NewReader(`{
	  "properties": {
	    "my_field": {
	      "type": "text",
	      "fielddata": true
	    }
	  }
	}`),
)
fmt.Println(res, err)
const response = await client.indices.putMapping({
  index: "my-index-000001",
  properties: {
    my_field: {
      type: "text",
      fielddata: true,
    },
  },
});
console.log(response);
PUT my-index-000001/_mapping
{
  "properties": {
    "my_field": { 
      "type":     "text",
      "fielddata": true
    }
  }
}

Сопоставление, которое вы указываете для my_field, должно содержать существующее сопоставление для этого поля плюс параметр fielddata.

fielddata_frequency_filter параметр сопоставления

Фильтр данных поля может быть использован для уменьшения количества терминов, загружаемых в память, а следовательно, для уменьшения потребления памяти. Термины могут быть отфильтрованы по частоте:

Фильтр частоты позволяет загружать только термины, частота документов которых находится между min и max значениями, которые могут быть выражены как абсолютное число (когда число больше 1,0) или как процент (например, 0.01 — это 1%, а 1.0 — это 100%). Частота рассчитывается по сегменту. Проценты основаны на количестве документов, имеющих значение для поля, а не на всех документах в сегменте.

Маленькие сегменты могут быть полностью исключены путем указания минимального количества документов, которые сегмент должен содержать с параметром min_segment_size:

resp = client.indices.create(
    index="my-index-000001",
    mappings={
        "properties": {
            "tag": {
                "type": "text",
                "fielddata": True,
                "fielddata_frequency_filter": {
                    "min": 0.001,
                    "max": 0.1,
                    "min_segment_size": 500
                }
            }
        }
    },
)
print(resp)
response = client.indices.create(
  index: 'my-index-000001',
  body: {
    mappings: {
      properties: {
        tag: {
          type: 'text',
          fielddata: true,
          fielddata_frequency_filter: {
            min: 0.001,
            max: 0.1,
            min_segment_size: 500
          }
        }
      }
    }
  }
)
puts response
res, err := es.Indices.Create(
	"my-index-000001",
	es.Indices.Create.WithBody(strings.NewReader(`{
	  "mappings": {
	    "properties": {
	      "tag": {
	        "type": "text",
	        "fielddata": true,
	        "fielddata_frequency_filter": {
	          "min": 0.001,
	          "max": 0.1,
	          "min_segment_size": 500
	        }
	      }
	    }
	  }
	}`)),
)
fmt.Println(res, err)
const response = await client.indices.create({
  index: "my-index-000001",
  mappings: {
    properties: {
      tag: {
        type: "text",
        fielddata: true,
        fielddata_frequency_filter: {
          min: 0.001,
          max: 0.1,
          min_segment_size: 500,
        },
      },
    },
  },
});
console.log(response);
PUT my-index-000001
{
  "mappings": {
    "properties": {
      "tag": {
        "type": "text",
        "fielddata": true,
        "fielddata_frequency_filter": {
          "min": 0.001,
          "max": 0.1,
          "min_segment_size": 500
        }
      }
    }
  }
}

Тип текстового поля только для сопоставления

Вариант text, который жертвует оценкой и эффективностью запросов с позициями ради эффективности использования пространства. Это поле фактически хранит данные так же, как и поле text, которое индексирует только документы (index_options: docs) и отключает нормы (norms: false). Запросы по терминам выполняются так же быстро, если не быстрее, чем для полей text, однако запросы, которым необходимы позиции, такие как match_phrase запрос, выполняются медленнее, так как им нужно просмотреть документ _source, чтобы проверить, соответствует ли фраза. Все запросы возвращают постоянные оценки, равные 1,0.

Обработка не настраивается: текст всегда обрабатывается с помощью анализатора по умолчанию (standard по умолчанию).

Запросы span не поддерживаются с этим полем, используйте запросы интервалов вместо этого, или тип поля text, если вам абсолютно необходимы запросы span.

В остальном, match_only_text поддерживает те же запросы, что и text. И, как и text, он не поддерживает сортировку и имеет только ограниченную поддержку агрегаций.

resp = client.indices.create(
    index="logs",
    mappings={
        "properties": {
            "@timestamp": {
                "type": "date"
            },
            "message": {
                "type": "match_only_text"
            }
        }
    },
)
print(resp)
response = client.indices.create(
  index: 'logs',
  body: {
    mappings: {
      properties: {
        "@timestamp": {
          type: 'date'
        },
        message: {
          type: 'match_only_text'
        }
      }
    }
  }
)
puts response
const response = await client.indices.create({
  index: "logs",
  mappings: {
    properties: {
      "@timestamp": {
        type: "date",
      },
      message: {
        type: "match_only_text",
      },
    },
  },
});
console.log(response);
PUT logs
{
  "mappings": {
    "properties": {
      "@timestamp": {
        "type": "date"
      },
      "message": {
        "type": "match_only_text"
      }
    }
  }
}

Параметры для текстовых полей только для сопоставления

Принимаются следующие параметры сопоставления:

fields

Множественные поля позволяют индексировать одно и то же строковое значение различными способами для разных целей, например, одно поле для поиска и многопольное для сортировки и агрегаций, или одно и то же строковое значение, обработанное различными анализаторами.

meta

Метаданные о поле.

© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/8.17/text.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API