关于后端:Elasticsearch-字段别名-fieldalias

44次阅读

共计 3725 个字符,预计需要花费 10 分钟才能阅读完成。

环境

  • Elasticsearch 8.1
  • Kibana 8.1
  • MacOS 10.14.6

简介

首先咱们还是先理解一下,什么是字段别名?大家可能据说过 索引别名 ,通过索引的别名能够轻松的切换所需的数据起源与哪一个索引,那么什么是字段别名呢?所谓字段别名,就是索引 mapping 定义时的备用字段,通过字段别名能够替换搜寻申请中的指标字段,字段别名能够用于 搜寻 排序 聚合 高亮docvalue_fieldsstored_fieldssuggestions,上面咱们一起来看一下字段别名的具体应用过程

应用

定义字段别名标准

  • 必须是一个明确的字段,不能是一个对象或者指向另一个字段别名
  • 在创立字段别名时,字段别名指向的指标字段必须曾经存在
  • 如果定义了嵌套的对象,则字段别名必须具备同样的嵌套范畴

字段别名只能指向一个字段,不能同时指向多个字段;

然而能够通过批改 mapping 中的字段别名设置指向另一个新字段

不反对应用字段别名的 API

  • 首先是不能在写入数据的时候应用字段别名,因为自身字段别名是虚构的,不存在的,所以不反对写入,同样也不能用于copy_to
  • 因为字段的别名是不存在 _source 中的,所以搜寻申请时的过滤字段也是不会失效的

测试

  • 创立索引,定义字段别名

    其中创立了索引 blog1blog2, 各自定义了两个字段别名 public_countpublic_content, 在 blog1 索引中,public_count指向 doc.count,public_content 指向 doc.content; 在blog2 索引中,public_count指向 doc_count,public_content 指向doc_content;

    PUT blog1
    {
      "mappings": {
        "properties": {
          "doc": {
            "properties": {
              "count": {"type": "long"},
              "content": {
                "type": "text",
                "fields": {
                  "keyword": {"type": "keyword"}
                }
              }
            }
          },
          "creater": {"type": "keyword"},
          "public_count": {
            "type": "alias",
            "path": "doc.count"
          },
          "public_content": {
            "type": "alias",
            "path": "doc.content"
          }
        }
      }
    }
    
    
    PUT blog2
    {
      "mappings": {
        "properties": {
          "doc_count": {"type": "long"},
          "doc_content": {
            "type": "text",
            "fields": {
              "keyword": {"type": "keyword"}
            }
          },
          "creater": {"type": "keyword"},
          "public_count": {
            "type": "alias",
            "path": "doc_count"
          },
          "public_content": {
            "type": "alias",
            "path": "doc_content"
          }
        }
      }
    }
  • 插入测试数据

    POST _bulk
    {"index":{"_index":"blog1","_id":"1"}}
    {"creater":"zuiyu1","doc.count":"100","doc.content":"zuiyu elasticsearch"}
    {"index":{"_index":"blog1","_id":"2"}}
    {"creater":"zuiyu2","doc.count":"200","doc.content":"zuiyu vue"}
    {"index":{"_index":"blog1","_id":"3"}}
    {"creater":"zuiyu3","doc.count":"300","doc.content":"java demo"}
    {"index":{"_index":"blog1","_id":"4"}}
    {"creater":"zuiyu4","doc.count":"300","doc.content":"java demo plus"}
    {"index":{"_index":"blog1","_id":"5"}}
    {"creater":"zuiyu5","doc.count":"300","doc.content":"java pro and elasticsearch"}
    {"index":{"_index":"blog2","_id":"1"}}
    {"creater":"zuiyu1","doc_count":"10","doc_content":"醉鱼 ES 小白入门课"}
    {"index":{"_index":"blog2","_id":"2"}}
    {"creater":"zuiyu2","doc_count":"550","doc_content":"醉鱼前端 vue 小白入门课"}
    {"index":{"_index":"blog2","_id":"3"}}
    {"creater":"zuiyu3","doc_count":"60","doc_content":"醉鱼 java 小白入门课"}
    {"index":{"_index":"blog2","_id":"4"}}
    {"creater":"zuiyu4","doc_count":"60","doc_content":"醉鱼 MySQL8.0 小白入门课"}
    {"index":{"_index":"blog2","_id":"5"}}
    {"creater":"zuiyu5","doc_count":"60","doc_content":"醉鱼 Redis 小白入门课"}
    
  • 搜寻测试、聚合、排序、高亮、倡议

    指标是实现搜寻索引 blog1blog2content 内容中蕴含 java 的文档, 因为两个索引的 mapping 构造齐全不一样,所以应用定义的雷同名称的 public_countpublic_content

    • 聚合

      应用 public_count 字段搜寻索引 blog1blog2public_count 大于 100 的文档,对public_count 进行聚合分桶

      GET blog*/_search?size=0
      {
        "query": {
          "range": {
            "public_count": {"gte": 100}
          }
        },
        "aggs": {
          "all_agg": {
            "terms": {"field": "public_count"}
          }
        }
      }
    • 排序

      应用 public_count 字段搜寻索引 blog1blog2public_count 后果大于 100 的文档, 对 public_count 进行降序输入

      GET blog*/_search
      {
        "query": {
          "range": {
            "public_count": {"gte": 100}
          }
        },
        "sort": [
          {
            "public_count": {"order": "desc"}
          }
        ]
      }
    • 高亮

      应用 public_content 字段搜寻索引 blog1blog2中蕴含 java 的,高亮输入,后果前后加上 em 标签

      GET blog*/_search
      {
        "query": {
          "wildcard": {
            "public_content": {"value": "*java*"}
          }
        },
        "highlight": {
          "fields": {
            "public_content": {
              "pre_tags": ["<em>"],
              "post_tags": ["</em>"]
            }
          }
        }
      }
  • 倡议

    应用 public_count 字段搜寻索引 blog1blog2中搜寻 public_content 中蕴含 java 的文档,输出一个谬误单词jave, 倡议返回java

    GET blog*/_search
    {
      "query": {
        "wildcard": {
          "public_content": {"value": "*java*"}
        }
      },
      "suggest": {
        "YOUR_SUGGESTION": {
          "text": "jave",
          "term": {"field": "public_content"}
        }
      }
    }
  • _source测试

    应用 _source 测试返回字段public_countpublic_content,因为字段别名是虚构的,所以此时是没有返回后果的

    GET blog*/_search
    {
      "query": {
        "wildcard": {
          "public_content": {"value": "*java*"}
        }
      },
      "_source": [
        "public_count",
        "public_content"
      ]
    }
  • 应用 docvalue_fields 申请字段获取

    GET blog*/_search
    {
      "query": {
        "wildcard": {
          "public_content": {"value": "*java*"}
        }
      },
       "docvalue_fields": ["public_count"]
    }

应用场景

简略总结一下字段别名的应用场景:

  • 文中的例子,能够对同一个人在不同博客网站上写的内容进行统计
  • 获取采集的日志信息,不同的数据源,索引的日志 mapping 不一样,统计时就能够应用字段别名进行对立的统计

本文由 mdnice 多平台公布

正文完
 0