• Elasticsearch语法知多少之Template


    目录

    目标

    ES版本信息

    官方文档

    相关概念

    索引模板实战

    创建索引模板

    比较索引模板和静态映射的优先级

    删除索引模板

    查询索引模板

    修改模板

    动态模板实战

    转换字段类型(根据字段名称匹配)

    对多级字段的支持(根据字段名称和路径匹配)

    对copy_to的支持

    对对象的支持


    目标

    • 熟悉模板的使用方法,包括索引模板和动态模板。
    • 熟悉索引模板匹配顺序、索引模板匹配规则、配置数据类型自动探测功能,通过索引模板或动态模板实现字段类型转换等操作。

    ES版本信息

    7.17.5


    官方文档

    Index templateshttps://www.elastic.co/guide/en/elasticsearch/reference/7.17/index-templates.html#index-templates

    Dynamic mappinghttps://www.elastic.co/guide/en/elasticsearch/reference/7.17/dynamic-mapping.html


    相关概念

    索引模板和动态模板的区别

    1. 匹配粒度不同:索引模板匹配粒度是索引,动态模板匹配的是某一个索引下面文档的字段。
    2. 创建方法不同:索引模板需要创建索引模板来实现,动态模板需要创建索引实现。
    3. 功能不同:索引模板针对索引进行通用配置,动态模板针对某一个索引下文档的字段进行通用配置。

    索引模板优先级

    可以建立多个索引模板,为了明确模板匹配的顺序,ES通过order字段实现索引顺序匹配。order越小匹配顺序优先级越高,也就是说,如果索引模板配置了相同的属性,order大的索引模板会覆盖order小的索引模板。

    数据类型自动探测

    ES的动态映射机制使得索引文档时字段能被自动识别出类型,比如"2022-01-02"自动识别为date类型。

    索引模板和静态映射的优先级

    如果索引模板和静态映射匹配了相同的属性,则以静态映射为准。比如索引模板设置日期类型不被自动探测,而静态映射设置日期类型能被自动探测。

    避免索引模式冲突
    Elasticsearch 具有内置索引模板,以下索引的优先级为100:

    • logs-*-*
    • metrics-*-*
    • synthetics-*-*

    Elastic Agent使用这些模板来创建数据流。由 Fleet 集成创建的索引模板使用类似的重叠索引模式,并且优先级高达200。如果使用 Fleet或Elastic Agent,要将索引模板优先级设置低于100以避免覆盖这些模板。否则的话还要进行其他配置,而在生产环境中往往不会大规模建立模板。


    索引模板实战

    创建索引模板

    需求:创建两个索引模板,观察两个索引模板是否生效,以及索引模板匹配的优先级。

    第一步:创建两个模板。

    • main_template的index_patterns为*表示匹配所有索引;my_template_1的index_patterns为books*表示匹配books开头的索引。
    • order越小匹配顺序优先级越高,也就是说,如果索引模板配置了相同的属性,order大的索引模板会覆盖order小的索引模板。
    • main_template开启日期数据类型自动探测,my_template_1关闭了日期数据类型自动探测。
    1. PUT /_template/main_template
    2. {
    3. "index_patterns": [
    4. "*"
    5. ],
    6. "order": 0,
    7. "settings": {
    8. "number_of_replicas": 1,
    9. "number_of_shards": 1
    10. },
    11. "mappings": {
    12. "date_detection": true
    13. }
    14. }
    15. PUT /_template/my_template_1
    16. {
    17. "index_patterns": [
    18. "books*"
    19. ],
    20. "order": 1,
    21. "mappings": {
    22. "date_detection": false
    23. }
    24. }

    第二步:创建索引并索引文档。

    1. PUT /books_db
    2. PUT /books_db/_doc/1
    3. {
    4. "book_no": 100001,
    5. "book_name": "凡人修仙传",
    6. "price":19.9,
    7. "create_time": "2022-01-01"
    8. }

    第三步:查看索引的映射情况。发现create_time为text类型,说明:

    • 索引生效了,因为根据动态映射规则,"2022-01-01"会被映射为date类型。
    • main_template先于my_template_1匹配到索引,my_template_1的配置覆盖了main_template的配置。
    GET /books_db/_mapping

    比较索引模板和静态映射的优先级

    方案:根据上面两个模板的配置,创建一个模板,将date_detection设置为true,如果日期类型的字符串可以被映射为date类型就可以证明静态映射的优先级>索引模板的优先级。

    第一步:创建索引。开启日期类型自动探测。

    1. PUT /books_db_2
    2. {
    3. "mappings": {
    4. "date_detection" : true
    5. }
    6. }

    第二步:索引文档。发现日期类型的字符串可以被映射为date类型,即证明了静态映射的优先级>索引模板的优先级。

    GET /books_db_2/_mapping

    删除索引模板

    DELETE /_template/my_template_1

    查询索引模板

    1. #查询单个模板
    2. GET /_template/main_template
    3. #模糊查询
    4. GET /_template/my*

    修改模板

    1. POST /_template/main_template
    2. {
    3. "index_patterns": [
    4. "*"
    5. ],
    6. "order": 0,
    7. "mappings": {
    8. "date_detection": false
    9. }
    10. }

    动态模板实战

    转换字段类型(根据字段名称匹配)

    第一步:创建索引。说明:

    • dynamic_templates下可以创建多个模板对象。
    • 一共创建了两个模板,模板名称分别是string_to_boolean和string_to_keyword。
    • string_to_boolean功能:类型为string类型且以is_开头且不以_text结尾,就将这个字段映射为boolean类型。
    • string_to_keyword功能:将所以string类型映射为keyword类型。
    1. PUT /movies_db
    2. {
    3. "mappings": {
    4. "dynamic_templates": [
    5. {
    6. "string_to_boolean": {
    7. "match_mapping_type": "string",
    8. "match": "is_*",
    9. "unmatch": "*_text",
    10. "mapping": {
    11. "type": "boolean"
    12. }
    13. }
    14. },
    15. {
    16. "string_to_keyword": {
    17. "match_mapping_type": "string",
    18. "mapping": {
    19. "type": "keyword"
    20. }
    21. }
    22. }
    23. ]
    24. }
    25. }

    第二步:索引文档。

    1. PUT /movies_db/_doc/1
    2. {
    3. "user_name": "张三",
    4. "is_adult": "true",
    5. "is_adult_text": "未成年人",
    6. "age":12
    7. }

    第三步:查看文档和映射情况,发现字段确实转换成了动态模板所设置的类型。

    1. GET /movies_db/_doc/1
    2. GET /movies_db/_mapping

    对多级字段的支持(根据字段名称和路径匹配)

    对copy_to的支持

    需求:使用动态模板,通过字段名称和路径实现copy_to功能。

    第一步:创建索引。说明:

    • full_address_template设定address_list字段下除了county这个叶子字段外,其他字段都匹配,这些字段会复制到full_address字段上;
    • 设定ik分词器
    1. PUT my-index-000001
    2. {
    3. "mappings": {
    4. "dynamic_templates": [
    5. {
    6. "full_address_template": {
    7. "path_match": "address_list.*",
    8. "path_unmatch": "*.county",
    9. "mapping": {
    10. "type": "text",
    11. "copy_to": "full_address"
    12. }
    13. }
    14. }
    15. ]
    16. },
    17. "settings": {
    18. "index": {
    19. "analysis.analyzer.default.type": "ik_max_word"
    20. }
    21. }
    22. }

    第二步:索引文档。

    1. PUT my-index-000001/_doc/1
    2. {
    3. "address_list": {
    4. "province": "湖南省",
    5. "city": "长沙市",
    6. "county": "天心区"
    7. }
    8. }
    9. PUT my-index-000001/_doc/2
    10. {
    11. "address_list": {
    12. "province": "湖南省",
    13. "city": "长沙市",
    14. "county": "芙蓉区"
    15. }
    16. }
    17. PUT my-index-000001/_doc/3
    18. {
    19. "address_list": {
    20. "province": "广东省",
    21. "city": "广州市",
    22. "county": "白云区"
    23. }
    24. }
    25. PUT my-index-000001/_doc/4
    26. {
    27. "address_list": {
    28. "province": "湖北省",
    29. "city": "武汉市",
    30. "county": "江夏区"
    31. }
    32. }

    第三步:精确搜索文档,发现以县级作为条件查不到数据,由此可见匹配规则生效了。

    1. GET my-index-000001/_search
    2. {
    3. "query": {
    4. "term": {
    5. "full_address": "江夏"
    6. }
    7. }
    8. }
    9. GET my-index-000001/_search
    10. {
    11. "query": {
    12. "term": {
    13. "full_address": "湖南"
    14. }
    15. }
    16. }

    对对象的支持

    需求:使用动态模板,通过字段名称和路径转换对象的字段类型。

    第一步:创建索引。说明:string_as_keyword模板将stu_files下的name字段设置为keyword类型。

    1. PUT student_db
    2. {
    3. "mappings": {
    4. "dynamic_templates": [
    5. {
    6. "string_as_keyword": {
    7. "match_mapping_type": "string",
    8. "path_match": "stu_files.name",
    9. "mapping": {
    10. "type": "keyword"
    11. }
    12. }
    13. }
    14. ]
    15. }
    16. }

    第二步:索引文档。

    1. PUT /student_db/_doc/1
    2. {
    3. "stu_files": {
    4. "id_card": "499924199012124356",
    5. "long_id": "5645767567",
    6. "long_address_text": "湖南省长沙市天心区",
    7. "name": "张三"
    8. }
    9. }

    第三步:查看映射情况,发现stu_files下的name字段为keyword类型,测试通过。

    GET /student_db/_mapping
  • 相关阅读:
    三、飞行和射击
    【校招VIP】java开源框架之redis
    智能技术上的“是”并不代表具体领域的“应该”
    快速绘制流程图「GitHub 热点速览 v.22.47」
    torch.optim.Adam
    自动化测试—web自动化—selenium初识
    Threejs_08 纹理颜色的调整(颜色空间的设置)
    数据结构之二叉树
    40个高质量软件工程毕设项目分享【源码+论文】(四)
    C/C++家族族谱管理系统
  • 原文地址:https://blog.csdn.net/qq_39706570/article/details/125881842