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

本文介绍了如何使用 Elasticsearch 的 NGram 分词器来处理模糊匹配,以解决用户输入部分支行名称或拼音首字母时,快速返回相应银行支行的搜索需求。虽然数据库支持通配符查询,但作者发现 Elasticsearch 结合 NGram 分词器能更高效地完成任务,避免了通配符查询的性能问题。通过设置字段 analyzer 为 ngram_analyzer,实现了类似通配符查询的效果,提高了搜索效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

接到一个任务:用 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 分词器。

{
"settings": {

"analysis": {
  "analyzer": {
    "ngram_analyzer": {
      "tokenizer": "ngram_tokenizer"
    }
  },
  "tokeni
### Ngram分词算法及其实现方法 Ngram 分词器是一种基于 n-gram 算法的分词工具,广泛应用于自然语言处理(NLP)领域。它通过将文本拆分为一系列连续的子字符串(n-gram 词项),从而实现对文本的分解和分析[^1]。与标准分词器不同的是,ngram 分词器能够生成部分单词,而无需依赖完整的词汇表。 #### Ngram 分词器的工作原理 Ngram 分词的核心思想是将输入文本按照指定长度(n)划分为连续的子序列。例如,对于单词 "hello",当 n=2 时,会生成以下 n-gram 词项:["he", "el", "ll", "lo"]。这种机制使得 ngram 分词器处理不完整单词或短语时表现出色,特别适合用于模糊匹配、拼写校正等场景。 #### Ngram 分词器的应用 Ngram 分词器不仅在 Elasticsearch 中有广泛应用,还在其他领域如信息检索、机器翻译以及文本分类中发挥重要作用。例如,在 TF-IDF 算法中,ngram 分词可以提高模型对短语和上下文的理解能力,从而提升特征提取的效果[^3]。 #### Ngram 分词的实现方法 以下是使用 Python 实现一个简单的 Ngram 分词器的代码示例: ```python def generate_ngrams(text, n): # 将文本转换为小写并移除非字母字符 text = ''.join([char.lower() for char in text if char.isalpha() or char.isspace()]) # 生成 n-gram 列表 ngrams = [text[i:i+n] for i in range(len(text)-n+1)] return ngrams # 示例 input_text = "natural language processing" n = 2 ngrams = generate_ngrams(input_text, n) print(ngrams) ``` 上述代码定义了一个函数 `generate_ngrams`,该函数接受两个参数:`text` 表示输入文本,`n` 表示 n-gram 的长度。函数首先对文本进行预处理,然后生成所有可能的 n-gram 词项[^2]。 #### Ngram 分词器的优势与局限性 Ngram 分词器的优点在于其灵活性和强大的模式匹配能力。然而,它也存在一些不足之处,例如生成的 n-gram 数量可能非常庞大,导致存储和计算成本增加。此外,ngram 分词器无法捕捉到长距离依赖关系,因此在某些复杂任务中可能需要结合其他技术共同使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值