带你读《Elastic Stack 实战手册》之32:——3.4.2.17.1.Multi-field(上)

简介: 带你读《Elastic Stack 实战手册》之32:——3.4.2.17.1.Multi-field(上)

3.4.2.17.Text analysis, settings 及 mappings

3.4.2.17.1.Multi-field


创作人:金端

审稿人:欧阳楚才

 

同一个字段可以使用不同的索引方式,实现不同的查询用途。比如,字符串类型字段可以设置成 text 字段用于全文检索,同时作为 keyword 字段用于排序或聚合。

 

Multi-field 主要通过 mapping 中的 fields 参数实现。

 

主要实现方法如下:


PUT test-000001
{
  "mappings": {
    "properties": {
      "city": {
        "type": "text",
        "fields": {
          "keyword": { 
            "type":  "keyword"
          }
        }
      }
    }
  }
}

ES 默认一个字符串字段会被设置成 text 和 keyword 两种字段格式,text 可以支持全文搜索,而 keyword 用于精确搜索和聚合排序。以上面定义的 city 字段作为案例,向 test-000001 索引添加数据:

 利用 text 字段类型进行全文检索,利用 keyword 字段类型进行聚合和精确搜索:


GET test-000001/_search
{
  "query": {
    "term": {
      "city": "york" 
    }
  },
  "sort": {
    "city.keyword": "asc" 
  },
  "aggs": {
    "Cities": {
      "terms": {
        "field": "city.keyword" 
      }
}
  }
}

返回结果如下:


{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [
    // 根据全文搜索 york 并按照 asc 排序返回两个结果
      {
        "_index" : "test-000001",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : null,
        "_source" : {
          "city" : "New York"
        },
        "sort" : [
          "New York"
        ]
      },
      {
        "_index" : "test-000001",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : null,
        "_source" : {
          "city" : "York"
        },
        "sort" : [
          "York"
        ]
      }
    ]
  },
  "aggregations" : {
  // 根据 city.keyword 聚合的结果
    "Cities" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "New York",
          "doc_count" : 1
        },
        {
          "key" : "York",
          "doc_count" : 1
        }
      ]
    }
  }
}

当然在特殊的生产场景下,可能会有同一个字段需要分词器甚至多个字段类型的使用需求,这个 fields 也可以可以满足的。比如:title 字段实现 standard 和 english 两种分词器且有

keyword 字段类型。


PUT test-000002
{
  "mappings": {
    "properties": {
      "title": {
        "type": "keyword",
        "fields": {
        // 实现 standard 和 english 两种不同分词的子字段
          "standard": {
            "type": "text",
            "analyzer": "standard"
          },
          "english": {
            "type": "text",
            "analyzer": "english"
          }
        }
      }
    }
  }
}
由于不同的分词器产生的词根并不完全一致,面对不同的搜索场景,这种方式可以很好的优化搜索体验。比如,下面这种情况:
PUT test-000002/_doc/1
{ "title": "quick brown fox" } 
PUT test-000002/_doc/2
{ "title": "quick brown foxes" } 
通过 _analyze API 查看一下这两个文档的具体解析。
standard 分词器。
POST _analyze
{
  "analyzer": "standard",
  "text": "quick brown foxes"
}

结果:


{
  "tokens" : [
    {
      "token" : "quick",
      "start_offset" : 0,
      "end_offset" : 5,
      "type" : "<ALPHANUM>",
      "position" : 0
    },
    {
      "token" : "brown",
      "start_offset" : 6,
      "end_offset" : 11,
      "type" : "<ALPHANUM>",
      "position" : 1
},
    {
      "token" : "foxes",
      "start_offset" : 12,
      "end_offset" : 17,
      "type" : "<ALPHANUM>",
      "position" : 2
    }
  ]
}



《Elastic Stack 实战手册》——三、产品能力——3.4.入门篇——3.4.2.Elasticsearch基础应用——3.4.2.17.Text analysis, settings 及 mappings——3.4.2.17.1.Multi-field(下) https://developer.aliyun.com/article/1230162

相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。 &nbsp;
相关文章
|
canal 消息中间件 关系型数据库
详解 canal 同步 MySQL 增量数据到 ES
canal 是阿里知名的开源项目,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费。 这篇文章,我们手把手向同学们展示**使用 canal 将 MySQL 增量数据同步到 ES**
详解 canal 同步 MySQL 增量数据到 ES
|
数据库 OceanBase 索引
在OceanBase数据库中,REPLACE INTO和insert update在效率上可能有所不同
【2月更文挑战第30天】在OceanBase数据库中,REPLACE INTO和insert update在效率上可能有所不同
1099 1
|
4月前
|
SQL API 数据库
【LangGraph新手村系列】(4)人机协作中断:让 Agent 在关键节点停下来等你
解决"全自动Agent无法审查"的问题。在tools节点前插入interrupt_before中断点,改用stream流式运行实现暂停,通过get_state().next判断中断位置,审查工具调用后用Command(resume=True)恢复执行,实现人机协作的三重干预:审查放行、修改参数、拒绝执行。
596 0
|
1月前
|
JSON 供应链 小程序
商品条形码api-国内条码信息查询-食品条码查询接口
条码查询API是面向全行业的标准化接口服务,支持13/14位国标条码(如69开头),秒级返回商品名称、品牌、规格、厂家、图片等结构化数据,覆盖食品、日化、药品等2000万+条目,提供免费试用、多语言示例、在线调试及私有化部署,广泛适用于电商建档、零售收银、医药合规与ERP集成等场景。
823 0
商品条形码api-国内条码信息查询-食品条码查询接口
|
3月前
|
人工智能 自然语言处理 搜索推荐
蚂蚁百宝箱正式发布AI构建能力:自然语言一键生成企业级智能体,助力业务创新提效
5月21日,蚂蚁百宝箱上线全新AI构建能力,支持自然语言一键生成智能体、营销活动与场景化Skill,深度融合行业资产与工程化能力,零代码、高可用、可交付。新用户注册即赠海量tokens,速体验!
714 2
|
3月前
|
人工智能 搜索推荐 知识图谱
中国文旅产业的下一个十年:由生成式引擎优化与知识图谱驱动
当AI搜索成为游客的第一入口,文旅产业的竞争从“流量战”转向“认知战”。本文从技术角度解析GEO(生成式引擎优化)与文旅知识图谱如何重塑产业格局,并提供面向不同主体的行动建议。
|
4月前
|
人工智能 自然语言处理 运维
生成式引擎优化技术深水区:拆解四层自研GEO架构的LLM收录适配逻辑
本文从中立技术视角,拆解一类典型的四层自研GEO(生成式引擎优化)架构,聚焦语义结构化、平台规则适配与垂直知识治理三大核心能力。直击通用大模型在商业化落地中的工程短板——非结构化输入、平台适配弱、合规缺失、效果难量化。通过L1-L4分层设计,实现业务资料标准化重构、LLM友好资产沉淀与全链路可观测优化,为GEO工程化提供可复用架构范式。(239字)
485 0
|
8月前
|
人工智能 监控 数据可视化
拒绝“开盲盒”!RAG应用评估全攻略:从Ragas原理到可视化实战
本文深入解析RAG系统评估方法,以Ragas框架为核心,从技术原理到代码实践,教你如何通过“合成真值”与多维指标(如上下文精度、忠诚度等)量化检索与生成质量,定位性能瓶颈,并实现持续优化,让AI应用从“玄学”走向“科学”。
2108 0
|
缓存 NoSQL Java
RedisTemplate操作Redis,这一篇文章就够了
redis是一款开源的Key-Value数据库,运行在内存中,由C语言编写。企业开发通常采用Redis来实现缓存。同类的产品还有memcache 、memcached 等。
3762 1
|
安全 网络安全 文件存储
思科设备巡检命令Python脚本大集合
【10月更文挑战第18天】
1053 1
思科设备巡检命令Python脚本大集合

热门文章

最新文章