ES常用Keywords类型故事版
- keyword:keyword类型适用于索引结构化的字段,可以用于过滤、排序和聚合。该类型的字段只能通过精确值搜索到,不会进行分词或变换。适合存储一些不需要分词处理的字段,比如ID、姓名等。
- constant_keyword:constant_keyword类型是一种常量关键字字段,始终包含相同的值。这种类型的字段通常用于表示固定不变的值或标识符,可以在查询中作为常量使用。
- wildcard:wildcard类型是一种通配符查询类型,类似于grep命令的通配符匹配。使用通配符可以进行模糊匹配和搜索,支持使用*和?等通配符符号进行匹配。适合在需要进行模糊搜索或匹配的场景中使用。
好的,咱们继续数字村的故事!这次村里要处理一些需要“精确匹配”、“统一标识”和“模糊查找”的特殊信息,于是又开了三家神奇的店铺:
故事:数字村的精确与模糊搜索专家
数字村的居民们发现,有些信息需要精确查找(比如身份证号),有些信息则希望全村统一(比如村规标识),还有些信息记不清全名只能模糊匹配(比如找名字里有“明”的人)。于是,村里诞生了三位新专家:
精确身份证登记处 (
keyword
) - 索引结构化字段,用于过滤、排序、聚合- 店主: 精叔
- 招牌: “一字不差,精准定位!” (精确值搜索)
- 做什么:
- 精叔负责登记那些需要原封不动、一字不差存储和查找的信息。
- 他有一个强大的精确索引本。任何交给他登记的信息,他都会完整地、原样地记录在这个本子里,不会拆分、不会修改、不会转换大小写。
- 他的登记处是村里进行精确筛选(
filter
)、严格排序(sort
)、分类统计(aggregation
) 的核心部门。
- 存什么:
- 村民身份证号 (
id
):510106199001011234
,必须精确匹配。 - 产品型号 (
model_number
):ABC-123-XYZ
,必须完全一致。 - 订单状态 (
status
):已支付
、已发货
、已完成
,用于精确筛选订单。 - 颜色名称 (
color
):中国红
、深海蓝
,用于按颜色分类统计销量。 - 标签 (
tags
):[“促销”, “新品”, “电子产品”]
,每个标签都是一个独立的精确值。
- 村民身份证号 (
- 特点:
- 不分词:
“张三丰”
不会被拆成“张”
、“三”
、“丰”
,它就是完整的“张三丰”
。 - 精确匹配:搜索
“abc”
找不到“ABC”
(大小写敏感),搜索“张三”
也找不到“张三丰”
。 - 高效筛选/排序/聚合:因为值是完整且独立的,所以做
=
比较、按字母排序、分组计数非常快。
- 不分词:
统一制服发放处 (
constant_keyword
) - 常量关键字字段- 店主: 统姨
- 招牌: “全村一致,永不改变!” (所有文档该字段值相同)
- 做什么:
- 统姨负责管理那些在整个村子(索引)里,所有村民(文档)都拥有且值完全一样的信息。
- 她只发一种“制服”,并且强制要求全村所有人都必须穿同一款、同一种颜色的制服。这个制服上的标识就是常量值。
- 存什么:
- 环境标识 (
env
):如果整个索引里的数据都来自“生产环境”
,那么这个字段的值永远是“production”
。 - 数据来源 (
source
):如果所有数据都来自“移动端App”
,那么这个字段的值永远是“mobile_app”
。 - 数据版本 (
data_version
):如果这批数据都遵循“v2.0”
的格式规范,那么这个字段的值永远是“v2.0”
。
- 环境标识 (
- 特点:
- 全局唯一值:这个字段在索引的所有文档中,值都完全相同。
- 节省空间 & 优化查询:因为值只有一个,Elasticsearch 在存储和索引时可以极大地优化,查询时如果需要按这个字段过滤,速度会非常快。
- 简化映射:定义一次,全村通用,不用每个文档都存一遍(虽然存了,但系统知道它们都一样)。
模糊寻人启事栏 (
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
)!它能解决“记不清”的烦恼,但记得别滥用,它有点“慢热”(性能开销)。
记住这三位专家和他们擅长的领域,你在数字村处理各种搜索需求时就能游刃有余啦!