Elasticsearch 的 NGram 分词器使用技巧

NGram分词器是Elasticsearch中用于实现前缀匹配搜索的工具,它通过对文本进行不同长度的切分来创建倒排索引。用户可配置min_gram和max_gram参数以调整分词粒度。较小的值会产生更多匹配但质量较低,较大的值则提供更精确的匹配。文章还提供了配置示例和分词结果展示。

一、什么是NGram 分词器?

NGram分词器是ES自带的具有前缀匹配搜索功能的一个文本分词器。它能根据文本的步长逐步对写入的文本内容进行约束切割;

二、NGram和index-time搜索推荐原理

搜索的时候,不用再根据一个前缀,然后扫描整个倒排索引了,而是简单的拿前缀去倒排索引中匹配即可,如果匹配上了,那么就好了,就和match query全文检索一样。

官方文档:NGram Tokenizer | Elasticsearch Guide [6.8] | Elastic

官方介绍如下:

默认设置下,ngram标记器将初始文本视为单个标记,并生成最小长度为1、最大长度为2的N个字符串,这个最大最小长度我们是可以配置的。

例如:

POST _analyze
{
  "tokenizer": "ngram",
  "text": "Quick Fox"
}

上述句子将产生以下术语:

空格也会进行分词

[ Q, Qu, u, ui, i, ic, c, ck, k, "k ", " ", " F", F, Fo, o, ox, x ]

三 配置参数

The ngram tokenizer accepts the following parameters:

min_gram

Minimum length of characters in a gram. Defaults to 1.

max_gram

Maximum length of characters in a gram. Defaults to 2.

token_chars

Character classes that should be included in a token. Elasticsearch will split on characters that don’t belong to the classes specified. Defaults to [] (keep all characters).

应包含在令牌中的字符类。Elasticsearch将对不属于指定类的字符进行拆分。默认值为[](保留所有字符)。也就是遇到这些字符会进行分词。

Character classes may be any of the following:

  • letter —  for example abï or 
  • digit —  for example 3 or 7
  • whitespace —  for example " " or "\n"
  • punctuation — for example ! or "
  • symbol —  for example $ or 

TIP:将min_gram和max_gram设置为相同的值通常是有意义的。长度越小,匹配的文档越多,但匹配的质量越低。长度越长,匹配的内容就越具体。三克(长度3)是一个很好的起点。

例子:

PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer"
        }
      },
      "tokenizer": {
        "my_tokenizer": {
          "type": "ngram",
          "min_gram": 3,
          "max_gram": 3,
          "token_chars": [
            "letter",
            "digit"
          ]
        }
      }
    }
  }
}

POST my_index/_analyze
{
  "analyzer": "my_analyzer",
  "text": "2 Quick Foxes."
}

分词:

[ Qui, uic, ick, Fox, oxe, xes ]

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值