PUT test_index
Когда elasticsearch возвращает true, это означает, что мы успешно создали индекс с именем test_index в elasticsearch, и при его создании для индекса не были указаны поля.
Затем мы просматриваем детали этого индекса:
GET test_index
{
"test_index": {
"aliases": {},
"mappings": {
"dynamic_templates": [
{
"message_full": {
"match": "message_full",
"mapping": {
"fields": {
"keyword": {
"ignore_above": 2048,
"type": "keyword"
}
},
"type": "match_only_text"
}
}
},
{
"message": {
"match": "message",
"mapping": {
"type": "match_only_text"
}
}
},
{
"strings": {
"match_mapping_type": "string",
"mapping": {
"type": "keyword"
}
}
}
]
},
"settings": {
"index": {
"refresh_interval": "10s",
"indexing": {
"slowlog": {
"threshold": {
"index": {
"warn": "200ms",
"trace": "20ms",
"debug": "50ms",
"info": "100ms"
}
},
"source": "1000"
}
},
"translog": {
"sync_interval": "5s",
"durability": "async"
},
"provided_name": "test_index",
"max_result_window": "65536",
"creation_date": "1700017444301",
"unassigned": {
"node_left": {
"delayed_timeout": "5m"
}
},
"number_of_replicas": "1",
"uuid": "YAIUJ64oTYuQpEjMvQK_Rg",
"version": {
"created": "8080199"
},
"routing": {
"allocation": {
"include": {
"_tier_preference": "data_hot,data_warm,data_cold"
}
}
},
"search": {
"slowlog": {
"threshold": {
"fetch": {
"warn": "200ms",
"trace": "50ms",
"debug": "80ms",
"info": "100ms"
},
"query": {
"warn": "500ms",
"trace": "50ms",
"debug": "100ms",
"info": "200ms"
}
}
}
},
"number_of_shards": "1"
}
}
}
}
Мы видим, что в сопоставлениях индексов, за исключением конфигурации сопоставления, поставляемой с динамическим шаблоном, нет других сопоставлений индексов. В то же время параметры индекса шаблона default@template также адаптируются.
Теперь мы вручную вставляем в индекс фрагмент данных.
PUT /test_index/_doc/1?pretty
{
"name":"Чжан Сан",
"age":23,
"remark":"Люблю учиться, люблю читать, люблю жизнь"
}
В это время elasticsearch возвращает следующую информацию, сообщающую нам, что часть данных с «_id», равным 1, была успешно создана в индексе test_index. «_version» данных также равна 1. Выполнение было успешным на 2 сегментах. и не удалось на 0 осколках.
Теперь мы повторно выполняемGET test_index
,Мы обнаружили, что при отображении индекса,Есть дополнительный раздел свойств.,В свойствах уже есть «имя», «возраст», «от рекомендаций». три поля. В то же время elasticsearch автоматически сопоставляет типы полей с этими тремя полями.
{
"test_index": {
"aliases": {},
"mappings": {
"dynamic_templates": [
{
"message_full": {
"match": "message_full",
"mapping": {
"fields": {
"keyword": {
"ignore_above": 2048,
"type": "keyword"
}
},
"type": "match_only_text"
}
}
},
{
"message": {
"match": "message",
"mapping": {
"type": "match_only_text"
}
}
},
{
"strings": {
"match_mapping_type": "string",
"mapping": {
"type": "keyword"
}
}
}
],
"properties": {
"age": {
"type": "long"
},
"name": {
"type": "keyword"
},
"remark": {
"type": "keyword"
}
}
}
}
На этом этапе мы можем получить данные, которые мы вставили с помощью запросов. Вы можете видеть, что elasticsearch вернул нам совпадающие данные.
GET test_index/_search
{
"query": {
"term": {
"age": {
"value": "23"
}
}
}
}
Когда мы использовали другой запрос, используя match для запроса текущих данных, мы обнаружили, что elasticsearch не возвращает нам данные.
GET test_index/_search
{
"query": {
"match": {
"remark": "читать"
}
}
}
Проверив сопоставление индекса, мы обнаружили, что тип поля примечания, определяемый elasticsearch, — ключевое слово. Из предыдущей статьи мы знаем, что ключевое слово не может быть сегментировано. Поэтому мы не можем найти данные с помощью запроса на совпадение. Так как же нам действовать при создании индекса?
"properties": {
"age": {
"type": "long"
},
"name": {
"type": "keyword"
},
"remark": {
"type": "keyword"
}
}
Когда мы создаем индекс, мы вручную ограничиваем типы полей индекса.
PUT /test_index_new
{
"mappings": {
"properties": {
"name": { "type": "text" },
"age": { "type": "integer" },
"remark": { "type": "text" }
}
}
}
После PUT того же фрагмента данных мы выполнили запрос на совпадение по индексу test_index_new и обнаружили, что данные можно найти нормально.
GET test_index_new/_search
{
"query": {
"match": {
"remark": "читать"
}
}
}
преимущество:
недостаток:
думать:
В конкретных бизнес-сценариях создание индексов вручную может лучше удовлетворить потребности нашего бизнеса. Когда бизнес растет, необходимо создавать все больше и больше индексов вручную. Есть ли более удобный способ создания индексов?
Мы можем заранее определить параметры индекса и сопоставление для различных бизнес-индексов, определив шаблоны индексов. Когда индекс будет создан, он будет адаптирован к соответствующему шаблону путем чтения «index_patterns» в шаблоне. Для удовлетворения различных потребностей в индексировании в разных бизнес-сценариях.
В следующем коде мы создаем шаблон с именем test_template. Приоритет шаблона равен 1, что в основном адаптируется к индексу, начинающемуся с «test». В настройках индекса мы устанавливаем количество первичных шардов индекса на 3 и количество реплик на 1. В сопоставлениях индексов мы ограничили типы трех полей: «имя», «возраст» и «примечание». Когда elasticsearch возвращает true, это означает, что создание шаблона завершено.
PUT _template/test_template
{
"order": 1,
"index_patterns": ["test*"],
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1
},
"mappings": {
"_source": {
"enabled": false
},
"properties": {
"name": { "type": "text" },
"age": { "type": "integer" },
"remark": { "type": "text" }
}
}
}
Теперь мы заново создаем индекс с именем test_template_index, ничего не указывая. Давайте посмотрим на отображение индекса.
PUT test_template_index
В это время мы обнаружили при сопоставлении индекса, что этот индекс автоматически адаптировал параметры индекса, которые мы ранее указали в шаблоне для имени индекса, начинающегося с «теста», при сопоставлении. Это значительно облегчает создание индексов и управление ими.
{
"test_template_index": {
"aliases": {},
"mappings": {
"_source": {
"enabled": false
},
"dynamic_templates": [
{
"message_full": {
"match": "message_full",
"mapping": {
"fields": {
"keyword": {
"ignore_above": 2048,
"type": "keyword"
}
},
"type": "match_only_text"
}
}
},
{
"message": {
"match": "message",
"mapping": {
"type": "match_only_text"
}
}
},
{
"strings": {
"match_mapping_type": "string",
"mapping": {
"type": "keyword"
}
}
}
],
"properties": {
"age": {
"type": "integer"
},
"name": {
"type": "text"
},
"remark": {
"type": "text"
}
}
},
"settings": {
"index": {
"refresh_interval": "10s",
"indexing": {
"slowlog": {
"threshold": {
"index": {
"warn": "200ms",
"trace": "20ms",
"debug": "50ms",
"info": "100ms"
}
},
"source": "1000"
}
},
"translog": {
"sync_interval": "5s",
"durability": "async"
},
"provided_name": "test_template_index",
"max_result_window": "65536",
"creation_date": "1700030711762",
"unassigned": {
"node_left": {
"delayed_timeout": "5m"
}
},
"number_of_replicas": "1",
"uuid": "cTiJp67xThSwpavbV3Hlog",
"version": {
"created": "8080199"
},
"routing": {
"allocation": {
"include": {
"_tier_preference": "data_hot,data_warm,data_cold"
}
}
},
"search": {
"slowlog": {
"threshold": {
"fetch": {
"warn": "200ms",
"trace": "50ms",
"debug": "80ms",
"info": "100ms"
},
"query": {
"warn": "500ms",
"trace": "50ms",
"debug": "100ms",
"info": "200ms"
}
}
}
},
"number_of_shards": "3"
}
}
}
}
преимущество:
недостаток:
Причины и идеи по устранению неполадок:
ЯсуществоватьучаствоватьНа третьем этапе специального тренировочного лагеря Tencent Technology Creation 2023 года будет проводиться конкурс сочинений. Сформируйте команду и примите участие, чтобы разделить приз!