带你读《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并实现搜索。  
相关文章
|
6月前
|
人工智能 自然语言处理 供应链
跨境电商代购代采系统:驱动全球贸易高效运转的引擎
跨境电商代购代采系统是基于互联网技术的智能采购平台,整合中国主流电商平台资源,为海外客户提供全流程解决方案。它通过简化采购流程、优化供应链管理、提升用户体验和拓展市场边界,赋能跨境电商发展。系统支持多语言服务、实时物流追踪与安全支付,降低运营成本和库存压力,助力企业挖掘新增长点。未来,系统将向智能化、绿色化和生态化方向升级,成为全球贸易新生态的重要推动力量。
|
9月前
|
数据可视化 数据挖掘 BI
强大的Quick BI体验
作为一名Python开发工程师,我日常涉及数据分析工作。近期体验了阿里云的Quick BI——一款全场景数据消费式BI平台。它支持拖拽操作、实时分析海量数据,并提供丰富的可视化组件,如柱状图、地图等,助力高效决策。本文分享了从申请账号到使用测试数据进行可视化的全过程,肯定其便捷性与强大功能的同时,也建议加强与Python的集成、扩展高级分析模型及用户自定义功能。适合对数据分析感兴趣的读者了解与尝试。
295 84
|
存储 SQL 算法
ClickHouse(13)ClickHouse合并树MergeTree家族表引擎之CollapsingMergeTree详细解析
CollapsingMergeTree是ClickHouse的一种表引擎,它扩展了`MergeTree`,通过折叠行来优化存储和查询效率。当`Sign`列值为1和-1的成对行存在时,该引擎会异步删除除`Sign`外其他字段相同的行,只保留最新状态。建表语法中,`sign`列必须为`Int8`类型,用来标记状态(1)和撤销(-1)。写入时,应确保状态和撤销行的对应关系以保证正确折叠。查询时,可能需要使用聚合函数如`sum(Sign * x)`配合`GROUP BY`来处理折叠后的数据。使用`FINAL`修饰符可强制折叠,但效率较低。系列文章提供了更多关于ClickHouse及其表引擎的详细解析。
552 1
|
机器学习/深度学习 Web App开发 人工智能
Amurex:开源AI会议助手,提供实时建议、智能摘要、快速回顾关键信息
Amurex是一款开源的AI会议助手,提供实时建议、智能摘要、快速回顾关键信息等功能,帮助用户提升会议效率。本文将详细介绍Amurex的功能、技术原理以及如何运行和使用该工具。
546 18
Amurex:开源AI会议助手,提供实时建议、智能摘要、快速回顾关键信息
|
JavaScript Java 关系型数据库
springboot+vue小区物业管理系统(源码+文档)
使用小区物业管理系统分为管理员和用户、员工三个权限子模块。 管理员所能使用的功能主要有:首页、个人中心、用户管理、员工管理、业主信息管理、费用信息管理、楼房信息管理、报修信息管理、车位信息管理、停车信息管理、投诉编号管理、公告信息管理、部门信息管理等。 用户可以实现:首页、个人中心、业主信息管理、费用信息管理、楼房信息管理、报修信息管理、车位信息管理、停车信息管理、投诉编号管理、公告信息管理等。 员工可以实现:首页、个人中心、楼房信息管理、报修信息管理、投诉编号管理、公告信息管理、部门信息管理等。
|
移动开发 JavaScript 网络协议
SpringBoot:Netty-SocketIO + VUE:SocketIO实现前后端实时双向通信
SpringBoot:Netty-SocketIO + VUE:SocketIO实现前后端实时双向通信
1010 0
|
机器学习/深度学习 人工智能 自然语言处理
NLP的原理是什么?
【10月更文挑战第8天】NLP的原理是什么?
500 0
|
数据采集 SQL 数据库
小说爬虫-01爬取总排行榜 分页翻页 Scrapy SQLite SQL 简单上手!
小说爬虫-01爬取总排行榜 分页翻页 Scrapy SQLite SQL 简单上手!
394 0
|
缓存 JavaScript
Vue中的keep-alive是什么意思?以及如何使用
Vue中的keep-alive是什么意思?以及如何使用
564 0
|
自然语言处理 JavaScript 前端开发
如何解决前端多语言选型和实现难题?
多语言(i18n)支持 是企业项目走向国际化的必经之路,也是前端工程师最佳实践的内容之一。不过,多语言框架众多,会带来一系列选型问题,相信大家在平时对项目进行多语言支持时,也往往会遇到如下几个问题:
1484 0

热门文章

最新文章