Skip to content
📖0 阅读·🤍0 点赞

ES常用Keywords类型故事版

  • keyword:keyword类型适用于索引结构化的字段,可以用于过滤、排序和聚合。该类型的字段只能通过精确值搜索到,不会进行分词或变换。适合存储一些不需要分词处理的字段,比如ID、姓名等。
  • constant_keyword:constant_keyword类型是一种常量关键字字段,始终包含相同的值。这种类型的字段通常用于表示固定不变的值或标识符,可以在查询中作为常量使用。
  • wildcard:wildcard类型是一种通配符查询类型,类似于grep命令的通配符匹配。使用通配符可以进行模糊匹配和搜索,支持使用*和?等通配符符号进行匹配。适合在需要进行模糊搜索或匹配的场景中使用。

好的,咱们继续数字村的故事!这次村里要处理一些需要“精确匹配”、“统一标识”和“模糊查找”的特殊信息,于是又开了三家神奇的店铺:


故事:数字村的精确与模糊搜索专家

数字村的居民们发现,有些信息需要精确查找(比如身份证号),有些信息则希望全村统一(比如村规标识),还有些信息记不清全名只能模糊匹配(比如找名字里有“明”的人)。于是,村里诞生了三位新专家:

  1. 精确身份证登记处 (keyword) - 索引结构化字段,用于过滤、排序、聚合

    • 店主: 精叔
    • 招牌: “一字不差,精准定位!” (精确值搜索)
    • 做什么:
      • 精叔负责登记那些需要原封不动、一字不差存储和查找的信息。
      • 他有一个强大的精确索引本。任何交给他登记的信息,他都会完整地、原样地记录在这个本子里,不会拆分、不会修改、不会转换大小写
      • 他的登记处是村里进行精确筛选(filter)、严格排序(sort)、分类统计(aggregation) 的核心部门。
    • 存什么:
      • 村民身份证号 (id)510106199001011234,必须精确匹配。
      • 产品型号 (model_number)ABC-123-XYZ,必须完全一致。
      • 订单状态 (status)已支付已发货已完成,用于精确筛选订单。
      • 颜色名称 (color)中国红深海蓝,用于按颜色分类统计销量。
      • 标签 (tags)[“促销”, “新品”, “电子产品”],每个标签都是一个独立的精确值。
    • 特点:
      • 不分词“张三丰”不会被拆成“张”“三”“丰”,它就是完整的“张三丰”
      • 精确匹配:搜索“abc”找不到“ABC”(大小写敏感),搜索“张三”也找不到“张三丰”
      • 高效筛选/排序/聚合:因为值是完整且独立的,所以做=比较、按字母排序、分组计数非常快。
  2. 统一制服发放处 (constant_keyword) - 常量关键字字段

    • 店主: 统姨
    • 招牌: “全村一致,永不改变!” (所有文档该字段值相同)
    • 做什么:
      • 统姨负责管理那些在整个村子(索引)里,所有村民(文档)都拥有且值完全一样的信息。
      • 她只发一种“制服”,并且强制要求全村所有人都必须穿同一款、同一种颜色的制服。这个制服上的标识就是常量值。
    • 存什么:
      • 环境标识 (env):如果整个索引里的数据都来自“生产环境”,那么这个字段的值永远是“production”
      • 数据来源 (source):如果所有数据都来自“移动端App”,那么这个字段的值永远是“mobile_app”
      • 数据版本 (data_version):如果这批数据都遵循“v2.0”的格式规范,那么这个字段的值永远是“v2.0”
    • 特点:
      • 全局唯一值:这个字段在索引的所有文档中,值都完全相同
      • 节省空间 & 优化查询:因为值只有一个,Elasticsearch 在存储和索引时可以极大地优化,查询时如果需要按这个字段过滤,速度会非常快。
      • 简化映射:定义一次,全村通用,不用每个文档都存一遍(虽然存了,但系统知道它们都一样)。
  3. 模糊寻人启事栏 (wildcard) - 通配符查询类型

    • 店主: 糊大爷
    • 招牌: “记不清?没关系!*和?来帮你!” (通配符匹配)
    • 做什么:
      • 糊大爷负责处理那些记不清完整信息,只能记住一部分模式的查找请求。
      • 他有两件法宝:* (星号) 和 ? (问号)。
      • * 代表 任意数量(0个或多个)的任意字符
      • ? 代表 恰好一个任意字符
      • 糊大爷会根据你提供的包含*?的模式,在他的“模糊索引本”里翻找匹配的信息。这个索引本是为这种模糊查找特殊优化的(虽然比精叔的精确索引本效率低一些)。
    • 怎么用:
      • 想找所有姓“张”的人:张*
      • 想找名字是三个字,且第二个字是“小”的人:?小?
      • 想找所有以“日志”结尾的文件名:*日志
      • 想找所有包含“error”或“err”的日志消息:*err* (匹配error, errors, server_error, err_code等)
      • 想找类似 log2023, log2024 的文件:log202?
    • 存什么:
      • 不太规范但需要模糊搜索的文本:比如用户输入的错误码片段 (ERR123*)、部分序列号 (SN-???-456)、日志消息中的关键字片段 (*Timeout*)。
      • 需要支持通配符查询的字段:尤其是那些不适合分词(不能用text类型做全文检索),但又需要部分匹配的场景。
    • 特点:
      • 强大的模式匹配*?提供了灵活的模糊查找能力。
      • 性能代价:相比于精确匹配(keyword)或分词匹配(text),通配符查询(尤其是开头带*的查询)可能比较慢,消耗资源多。只适合在必要时使用
      • 不分词:和keyword一样,它处理的是完整的字符串值,不会进行分词。

故事总结:

数字村的搜索需求越来越精细:

  • 需要一字不差、精确匹配、高效筛选排序的信息(ID、状态码、标签)?交给精确身份证登记处 (keyword)!它是结构化数据处理的核心。
  • 全村统一、永不改变的标识信息(环境、数据源、版本)?交给统一制服发放处 (constant_keyword)!省心省力又高效。
  • 只记得部分信息,想用*?进行模糊查找(错误码片段、模糊文件名)?去找模糊寻人启事栏 (wildcard)!它能解决“记不清”的烦恼,但记得别滥用,它有点“慢热”(性能开销)。

记住这三位专家和他们擅长的领域,你在数字村处理各种搜索需求时就能游刃有余啦!