📣 极限科技诚招搜索运维工程师(Elasticsearch/Easysearch)- 全职/北京 👉 : 立即申请加入

一、字段类型核心差异(新手最易踩坑点) #

对比维度text 字段keyword 字段
分词处理索引时通过分析器(如 IK、标准分词)拆分文本,支持中文 / 多语种分词 📝"Apple iPhone 15 Pro" → [“apple”, “iphone”, “15”, “pro”]不分词,原样存储为完整字符串 🔒例:“Apple iPhone 15 Pro” → 仅保留原始值
索引结构构建倒排索引,支持全文检索和相关性评分存储原始值,支持精确匹配和聚合分析
查询方式需用 match/match_phrase 查询(分词匹配)需用 term/terms 查询(精确匹配)
功能支持❌ 不支持聚合(如分组统计)、排序 支持模糊匹配、拼写容错(fuzziness✅ 支持聚合、排序、过滤❌ 不支持分词匹配
大小写处理默认转为小写(依分析器配置)严格区分大小写(原样匹配)

关键原理:Easysearch 基于 Lucene 内核,text 字段为「全文检索优化」,keyword 为「精确查询优化」,字段类型直接决定查询逻辑与性能。

二、典型使用场景(新手快速选型指南) #

1. text 字段:适合「全文搜索场景」 #

  • 核心场景:用户输入自然语言、需模糊匹配的内容
    • 商品标题 / 描述(如电商搜索 “无线耳机” 匹配 “Bluetooth headphones”)
    • 文章正文、用户评论(需分词检索关键词)
    • 日志详情(需检索具体报错信息)
  • 实战示例
// 正确查询:text字段用match分词匹配
{ "query": { "match": { "product_desc": "无线蓝牙耳机" } } }
  • Easysearch 优势:支持本地优化的中文分词(IK 企业版、拼音 / 简繁体转换),比原生 Elasticsearch 更适配中文场景。

2. keyword 字段:适合「精确匹配场景」 #

  • 核心场景:需严格匹配、排序或统计的结构化数据
    • 状态码(如 “ERROR”/“SUCCESS”)、IP 地址、邮箱
    • 分类标签(如商品类目、文章标签)
    • 聚合分析(如统计各品牌商品数量)
  • 实战示例
// 正确查询:keyword字段用term精确匹配
{ "query": { "term": { "brand.keyword": "Apple" } } }
// 正确用法:聚合统计各状态日志数量
{ "aggs": { "status_count": { "terms": { "field": "status.keyword" } } } }
  • 关键提醒:动态映射下,text 字段会自动生成 .keyword 子字段(如 name.keyword),可直接用于精确查询。

三、新手 3 大高频误区(避坑指南) #

误区 1:对 text 字段用 term 查询(如用 term: "Apple" 查 text 类型的商品名)

→ 后果:因 text 已分词为小写,无法匹配原始字符串,返回空结果

✅ 修正:用 match 查询,或改用 .keyword 子字段

误区 2:对 keyword 字段用 match 查询(如用 match: "error" 查日志状态)

→ 后果:多此一举且性能差(match 会先分词再匹配,而 keyword 未分词)

✅ 修正:直接用 term: { "status.keyword": "ERROR" }

误区 3:用 text 字段做聚合 / 排序(如统计 text 类型的 “分类” 字段)

→ 后果:报错或结果混乱(text 未开启 fielddata 时不支持聚合)

✅ 修正:改用 keyword 字段或 .keyword 子字段

四、特殊场景解决方案 #

若需同时支持「全文搜索 + 精确匹配」(如商品名既需模糊检索,又需精确排序),可使用 多字段(multi-fields) 配置:

{
  "mappings": {
    "properties": {
      "product_name": {
        "type": "text", // 全文搜索用
        "fields": {
          "keyword": {
            // 精确匹配/聚合用
            "type": "keyword",
            "ignore_above": 256 // 忽略超长字符串
          }
        }
      }
    }
  }
}