Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >使用 Elasticsearch 的 NGram 分词器处理模糊匹配

使用 Elasticsearch 的 NGram 分词器处理模糊匹配

作者头像
Venyo
发布于 2018-03-15 05:29:07
发布于 2018-03-15 05:29:07
2.7K00
代码可运行
举报
文章被收录于专栏:Venyo 的专栏Venyo 的专栏
运行总次数:0
代码可运行

接到一个任务:用 Elasticsearch 实现搜索银行支行名称的功能。大概就是用户输入一截支行名称或拼音首字母,返回相应的支行名称。比如,用户输入"工行"或者"gh",我需要返回"工行XXX分行"类似这样的结果。

我心里嘀咕着:数据库不是支持通配符查询吗?为什么不直接用数据库查询?

说归说,但是任务还是要完成的。之前有在网上看过一篇文章,主要就是说用 Elasticsearch 处理通配符查询不太适合,然后我在评论中看到作者推荐了一个分词器 NGram

这个分词器可以让通配符查询和普通的查询一样迅速,因为该分词器在数据索引阶段就把所有工作做完了:

An n-gram can be best thought of as a moving window on a word. The n stands for a length. If we were to n-gram the word quick, the results would depend on the length we have chosen:

  • Length 1 (unigram): [ q, u, i, c, k ]
  • Length 2 (bigram): [ qu, ui, ic, ck ]
  • Length 3 (trigram): [ qui, uic, ick ]
  • Length 4 (four-gram): [ quic, uick ]
  • Length 5 (five-gram): [ quick ]

若要使用 NGram 分词器作为某个字段的分词器,可在索引创建时指定,也可以更新映射关系,以下展示如何在索引创建时指定 NGram 分词器。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "settings": {
    "analysis": {
      "analyzer": {
        "ngram_analyzer": {
          "tokenizer": "ngram_tokenizer"
        }
      },
      "tokenizer": {
        "ngram_tokenizer": {
          "type": "ngram",
          "min_gram": 1,
          "max_gram": 30,
          "token_chars": [
            "letter",
            "digit"
          ]
        }
      }
    }
  },
  "mappings": {
        "_default_": {
            "properties": {
                "Name": {
                    "type": "string",
                    "analyzer": "ngram_analyzer"
                }
            }
        }
    }
}

当某个字段的 analyzer 被指定为 ngram_analyzer,这个字段的查询就都会变成通配符查询,无论是 term 还是 match。

比如,POST /index/type

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "query": {
        "term": {"Name": "工商"}
    }
}

会得到"中国工商银行XXX分行"。

比如,POST /index/type

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "query": {
        "match": {"Name": "工商"}
    }
}

会得到"中国工商银行XXX分行"、"工行XXX分行"、"中国招商银行XXX分行"。

match 查询会对关键词进行分词,而 Lucene 的默认中文分词就是把每个中文字拆开,这样会变成对"工"、"商"两个字做通配符查询。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Elasticsearch 查询革新:探索 Wildcard 类型的高效模糊匹配策略
在生产使用中,Elasticsearch 除了精确匹配的要求,也会有模糊查询的场景。
铭毅天下
2023/12/13
3.8K0
Elasticsearch 查询革新:探索 Wildcard 类型的高效模糊匹配策略
一起学Elasticsearch系列-模糊搜索
在 Elasticsearch 中,模糊搜索是一种近似匹配的搜索方式。它允许找到与搜索词项相似但不完全相等的文档。
BookSea
2023/12/13
8000
一起学Elasticsearch系列-模糊搜索
Elasticsearch 的 NGram 分词器使用技巧
NGram分词器是ES自带的具有前缀匹配搜索功能的一个文本分词器。它能根据文本的步长逐步对写入的文本内容进行约束切割;
南非骆驼说大数据
2021/02/01
15K2
【腾讯云ES】基于NGram分词ES搜索性能优化实践
在商品搜索场景中,需要根据用户输入关键字严格匹配商品数据,而普通的全文检索方式,诸如:match 或者match_pharse,不一定能达到搜索效果。
子非鱼i
2022/12/05
3.4K0
Elasticsearch分词:自定义分词器
虽然Elasticsearch带有一些现成的分析器,然而在分析器上Elasticsearch真正的强大之处在于,你可以通过在一个适合你的特定数据的设置之中组合字符过滤器、分词器、词汇单元过滤器来创建自定义的分析器。
HLee
2021/07/20
7.9K1
Elasticsearch分词:自定义分词器
Elasticsearch实战(五)-倒排索引与分词
将文本转换成一系列单词的过程,也称文本分析,在 ES 里称为 Analysis。 比如文本【JavaEdge 是最硬核的公众号】,分词结果是【JavaEdge、硬核、公众号】
JavaEdge
2021/02/23
1.3K0
Elasticsearch实战(五)-倒排索引与分词
由 Elasticsearch 空间换时间的线上问题说开去......
2、现况:搜索商品A的SPUCodeText编码:OWBB050,slop设置为49-54无法查询出该商品;slop设置为55及其以上的值,才可以查询出商品A;
铭毅天下
2022/12/22
6070
由 Elasticsearch 空间换时间的线上问题说开去......
总结一些ES不常用的filter
ES内置的token filter很多,大部分实际工作中都用不到。这段时间准备ES认证工程师的考试,备考的时候需要熟悉这些不常用的filter。ES官方对一些filter只是一笔带过,我就想着把备考的笔记整理成博客备忘,也希望能帮助到有这方面需求的人。
用户7634691
2020/10/10
7840
Elasticsearch分词:内置分词器
"Set the shape to semi-transparent by calling set_trans(5)" 标准分词器(默认使用) 分词结果: set, the, shape, to, semi, transparent, by, calling, set_trans, 5 POST _analyze { "analyzer": "standard", "text": "Like X 国庆放假的" } { "tokens" : [ { "token"
HLee
2020/12/18
2.2K0
Elasticsearch分词:内置分词器
Elasticsearch搜索特性
方案一、可以是用wildcard通配符,但是要设置不分词,这种方案性能不好 方案二、可以使用ngram分词器 “min_gram”: 2,”max_gram”: 3 单词假设是 abcde0001 ab bc cd abc cde 001.。。。等等 被分词2个字母一组和3个字符一组。。、。
丁D
2022/08/12
7910
ElasticSearch最全详细使用教程:入门、索引管理、映射详解、索引别名、分词器、文档管理、路由、搜索详解
墨墨导读:之前我们分享了ElasticSearch最全详细使用教程:入门、索引管理、映射详解,本文详细介绍ElasticSearch的索引别名、分词器、文档管理、路由、搜索详解。
数据和云
2019/08/16
4.1K0
分词器ngram,edge-ngram,shingle分析
1、多元分词器Ngram,edge-ngram为单词字符级分词器,通常在索引时间指定,在搜索时间不指定。
周银辉
2024/09/23
2440
Elasticsearch 电商场景:明明有这个关键词,但是搜不出来,怎么办?
content是一个text类型,用的 ik_max_word 分的词,需要根据关键词做精准匹配,并且按照发布时间倒序。
铭毅天下
2024/05/17
3880
Elasticsearch 电商场景:明明有这个关键词,但是搜不出来,怎么办?
Elasticsearch(五)
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
张凝可
2019/08/21
5060
Elasticsearch探索:Suggester API(一)
现代的搜索引擎,一般都会提供 Suggest as you type 的功能,帮助用户在输入搜索的过程中,进行自动补全或者纠错。通过协助用户输入更加精准的关键词,提高后续搜索阶段文档匹配的程度。在 google 上搜索,一开始会自动补全。当输入到一定长度,如因为单词拼写错误无法补全,就会开始提示相似的词或者句子。
HLee
2020/12/17
5.8K1
Elasticsearch探索:Suggester API(一)
Elasticsearch自定义分词
实现单个字符分词(ngram) 注 -u elastic:uates12345 为权限验证,没有设置权限验证的直接去掉即可. 初始化 开始操作之前先确定数据库是否已经创建测试template和index,如有直接删除. 删除template 1curl -XDELETE -u elastic:uates12345 'http://localhost:9200/_template/trade_test_0' 删除index 1curl -XDELETE -u el
XING辋
2020/02/14
4710
白话Elasticsearch23-深度探秘搜索技术之通过ngram分词机制实现index-time搜索推荐
NGram Tokenizer: https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-ngram-tokenizer.html
小小工匠
2021/08/17
6720
elasticsearch倒排索引与分词
单词词典的实现一般用B+树,B+树构造的可视化过程网址: B+ Tree Visualization
小旋锋
2019/01/21
1.6K0
Elasticsearch 警惕使用 wildcard 检索!然后呢?
全局认知非常重要,检索核心类型大致(非严谨、精确)分为:精准匹配检索(Term-level queries)和基于分词的全文匹配检索(Full text queries)。
铭毅天下
2021/04/12
6.3K0
Elasticsearch从入门到放弃:分词器初印象
Elasticsearch 系列回来了,先给因为这个系列关注我的同学说声抱歉,拖了这么久才回来,这个系列虽然叫「Elasticsearch 从入门到放弃」,但只有三篇就放弃还是有点过分的,所以还是回来继续更新。
Jackeyzhe
2020/07/03
5600
推荐阅读
相关推荐
Elasticsearch 查询革新:探索 Wildcard 类型的高效模糊匹配策略
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验