带你读《Elastic Stack 实战手册》之35:——3.4.2.17.4.Analyzers / Custom analyzers(14)

简介: 带你读《Elastic Stack 实战手册》之35:——3.4.2.17.4.Analyzers / Custom analyzers(14)

场景案例

 

车牌号分词示例


在本例中要实现一个停车场客户车辆信息查询的场景。根据客户输入停放车辆的车牌号进行模糊匹配找到该车辆停放位置信息。为了简化索引信息 parking_info 中只需要包含三个字段即可,分别是:

 

l license_plate 文本类型,车牌号,需要分词器实现模糊匹配

l spot_number 文本类型,停车位编号

l entry_time 日期类型,记录入场时间

 

在 Elasticsesarch 中实现模糊匹配的方式有很多,比如常见的前缀匹配和正则表达。今天我们换一种思路尝试直接从分词器入手,前面在 Token Filter 中提到过一个 n_gram 过滤器可以将单词按照多元语法切分,这样可以满足车牌号在写入时把拆分的结果冗余在倒排索引,例如 “京N12345” 就能得到数组 ["京",“京N”,“京N1”,“京N12”.....]。这样搜索时输入的部分字符可以直接在倒排索引直接匹配。自定义分词器 license_plate_analyzer 构成如下:

 

l Tokenizer

○ whitespace Tokenizer

l Token Filter

 

 

○ Lowercase Token Filter,单词转换为小写字母统一格式

○ Ngram Token Filter,车牌号根据多元语法拆分,长度在1-8位

 

使用 n_gram 拆分单词时如果切分间隔大于1时,需要修改索引 index.max_ngram_diff 属性默认值。在本例中,我们要把一个车牌号从首位开始依次进行切分,所以索引要设置 index.max_ngram_diff 为车牌号的整体长度8。现在我们定义好了写入阶段的分词器,想象一下,如果在搜索时也使用这个分词器将会发生什么?默认搜索条件此时也会经过 n_gram 的切分产生若干的单词,这将就会将搜索内容拆分的子部分当作条件进行匹配从而导致返回不相关的文档。为了解决这个问题就需要在搜索时指定分词器,让搜索的内容不进行拆分,其它设置和写入分词器保持一致。搜索分词器 license_plate_search 的结构如下:


l Tokenizer

○ whitespace Tokenizer

 

l Token Filter

○ Lowercase Token Filter,单词转换为小写字母统一格式

 

索引创建分词器设置和测试数据如下:


PUT parking_info
{
  "settings": {
    "index.max_ngram_diff": 8,
    "analysis": {
      "analyzer": {
        "license_plate_analyzer": {
          "type": "custom",
          "tokenizer": "whitespace",
          "filter": [
            "lowercase",
            "license_plate_filter"
          ]
        },
        "license_plate_search": {
          "type": "custom",
          "tokenizer": "whitespace",
          "filter": [
            "lowercase"
          ]
        }
      },
      "filter": {
        "license_plate_filter": {
          "type": "ngram",
          "max_gram": 8,
          "min_gram": 1
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "license_plate": {
        "type": "text",
        "analyzer": "license_plate_analyzer",
        "search_analyzer": "license_plate_search"
      },
      "spot_number": {
        "type": "keyword"
      },
      "entry_time": {
        "type": "date"
      }
    }
  }
}
POST _bulk
{"index":{"_index":"parking_info","_id": "1"}}
{"license_plate":"京YC5722", "spot_number":"A1530","entry_time":"2021-08-07T09:25:00Z"}
{"index":{"_index":"parking_info","_id": "2"}}
{"license_plate":"京B985A9", "spot_number":"A0750","entry_time":"2021-08-15T23:28:35Z"}
{"index":{"_index":"parking_info","_id": "3"}}
{"license_plate":"京AD7R535", "spot_number":"A1220","entry_time":"2021-08-15T15:19:54Z"}
{"index":{"_index":"parking_info","_id": "4"}}
{"license_plate":"京D53W72", "spot_number":"A0352","entry_time":"2021-08-15T21:33:34Z"}
{"index":{"_index":"parking_info","_id": "5"}}
{"license_plate":"京NLA911", "spot_number":"A0051","entry_time":"2021-08-15T20:15:07Z"}

接下来我们想要查询 “京D53W72” 车辆信息通过输入 "京D53W72 D53W72 W72" 都能够匹配到结果。

 

GET parking_info/_search
{
  "query": {
    "match": {
      "license_plate":"京D53W72 D53W72 W72"
    }
  }
}



《Elastic Stack 实战手册》——三、产品能力——3.4.入门篇——3.4.2.Elasticsearch基础应用——3.4.2.17.Text analysis, settings 及 mappings——3.4.2.17.4.Analyzers / Custom analyzers(15) https://developer.aliyun.com/article/1229753

相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。  
相关文章
|
负载均衡 安全 应用服务中间件
什么是正向代理和反向代理
正向代理是客户端与服务端之间的中介,用于访问受限资源,如V/P/N和动态IP代理,同时可隐藏客户端IP。反向代理则接收客户端请求并转发给后端服务器集群,隐藏真实服务器信息,常用于堡垒机和负载均衡,如nginx。正向代理焦点在客户端,反向代理关注服务端。
数据结构中公式前中后缀表达式-二叉树应用
数据结构中公式前中后缀表达式-二叉树应用
|
存储 缓存 资源调度
包管理npm、yarn、pnpm区别
包管理npm、yarn、pnpm区别
735 0
|
算法 IDE Java
Java 项目实战之实际代码实现与测试调试全过程详解
本文详细讲解了Java项目的实战开发流程,涵盖项目创建、代码实现(如计算器与汉诺塔问题)、单元测试(使用JUnit)及调试技巧(如断点调试与异常排查),帮助开发者掌握从编码到测试调试的完整技能,提升Java开发实战能力。
1076 0
|
9月前
|
JSON 安全 Java
支付宝支付实战全攻略
本文详细介绍了基于JDK17的企业级支付宝支付实现方案。首先阐述了支付宝支付的核心参与者、安全机制和支付场景区分,重点分析了RSA2签名验证流程。随后提供了完整的开发指南,包括开放平台配置、Maven环境搭建、数据库设计以及核心工具类封装。文章详细展示了基于MyBatis-Plus的持久层实现和Swagger3接口文档集成,并重点讲解了支付回调处理、退款功能等核心业务逻辑的实现。针对企业级应用场景,特别强调了幂等性设计、高可用方案和常见问题的解决方案,包括异步通知丢失兜底机制和安全加固措施。
850 2
|
9月前
|
人工智能 自然语言处理 数据可视化
从形象到资产:数字人如何在IP、虚拟偶像与电商领域重塑商业价值
数字人正从技术演示迈向规模化商用,成为IP打造、虚拟偶像、电商转化的核心引擎。依托AI驱动与成本降低,其形象生成与内容输出实现高效自动化,广泛应用于知识付费、跨境直播等场景,推动个人品牌与企业营销的数字化升级,逐步演变为可运营的“数字员工”和新型商业基础设施。
|
9月前
|
搜索推荐 数据处理 UED
1688新品上架没流量?这套“打标爬升”法则,让你的产品快速被看见的实用指南!
本文详解1688新品运营策略,通过“新品标签快速形成”与“四阶段数据爬升”,助力店铺实现新品快速曝光与转化。涵盖精准选品、老客破零、四阶段执行计划及成长积分规则,全面提升新品竞争力。
|
9月前
|
人工智能 监控 前端开发
年终汇报新思路:领导真正关心的四个关键层面
年终汇报不是罗列工作,而是证明价值。领导关注的不是你多忙,而是你创造了什么、思考如何进化、是否与团队同频、未来能担多大责任。用结果替代过程,用逻辑替代数据堆砌,讲清你解决的关键问题、带来的业务影响及未来潜力,才能从“执行者”蜕变为“价值创造者”。
|
机器学习/深度学习 测试技术 知识图谱
DeepSeek-R1:Incentivizing Reasoning Capability in LLMs via Reinforcement Learning论文解读
DeepSeek团队推出了第一代推理模型DeepSeek-R1-Zero和DeepSeek-R1。DeepSeek-R1-Zero通过大规模强化学习训练,展示了卓越的推理能力,但存在可读性和语言混合问题。为此,团队引入多阶段训练和冷启动数据,推出性能与OpenAI-o1-1217相当的DeepSeek-R1,并开源了多个密集模型。实验表明,DeepSeek-R1在多项任务上表现出色,尤其在编码任务上超越多数模型。未来研究将聚焦提升通用能力和优化提示工程等方向。
1113 16
|
11月前
|
Java 测试技术 网络安全
Burp Suite Professional 2025.10 for Windows x64 - 领先的 Web 渗透测试软件
Burp Suite Professional 2025.10 for Windows x64 - 领先的 Web 渗透测试软件
522 0
Burp Suite Professional 2025.10 for Windows x64 - 领先的 Web 渗透测试软件

热门文章

最新文章