首页 > 其他分享 >Elasticsearch N-gram分词器介绍 (7)

Elasticsearch N-gram分词器介绍 (7)

时间:2024-04-24 14:44:32浏览次数:27  
标签:index tokenizer max analyzer Elasticsearch gram 分词器 my

一.概述

  Ngram是一种基于统计语言模型的算法。Ngram基本思想是将文本里面的内容按照字节大小进行滑动窗口操作,形成长度是N的字节片段序列。此时每一个字节片段称为gram。对所有gram的出现频度进行统计,并且按照事先设定好的阈值进行过滤,形成关键gram列表,也就是这个文本的向量特征空间。列表中的每一种gram就是一个特征向量维度。

  应用场景:

    1)要分词的文本是:没有空格,没有停用词,无分隔符,或属于行业术语的文本等。

        例如:元器件行业型号:bu406, 搜索关键词 ”u40“ 希望能搜索到bu406的型号文档。

           无分隔符的手机号码13692345603,搜索关键词”9234“ 希望能搜索到13692345603的手机号文档,可提高检索效率(相较于wildcard检索和正则匹配检索来说)。

    2)要求输入搜索的关键词高亮显示。

        使用Ngram分词,结合match或者match_phrase检索实现。

    3)大数据量下,要求支持左右匹配的模糊搜索,不建议使用wildcrad匹配。

        使用Ngram分词以(存储)空间来换(检索)时间。

 

  分词示例:

    下面示例使用ngram的默认配置来分词, gram最小长度为1 ,gram最大长度为2

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

     分词结果:[ Q, Qu, u, ui, i, ic, c, ck, k, "k ", " ", " F", F, Fo, o, ox, x ]

二. Naram配置

  分词器接收以下参数:

    1)min_gram: 以gram为单位的最小字符长度,默认值为 1

    2)max_gram:以gram为单位的最大字符长度,默认值为 2

    3)token_chars:令牌(分词结果)中包含的字符类型,默认是全部类型。字符类型可以是以下几种类型:

        letter ---保留字母类型,如a,b,c, 京

        digit  ---保留数字类型,如1,2

        whitespace ---保留空格类型,如 " " or "\n"

        punctuation ---保留标点类型,如  ! or "

        symbol ---保留符号类型,如 $ or 

        custom ---保留自定义类型,使用custom_token_chars设置自定义的字符

    4)custom_token_chars:自定义的字符将视为令牌的一部分

  注意:将 min_gram 和 max_gram 设置为相同的值通常是有意义的。

      min_gram值越小,匹配的文档就越多,但匹配出来的文档相关性质量就越低。

      max_gram值越长,  匹配的文档就越少,但匹配出来的文档相关性质量就越高。

      通常:min_gram 长度为 3是一个很好的起点。

  索引级别max_ngram_diff参数控制最大允许的差异,max_gram的值不能超过。

 

三.配置示例

  示例1 

    在此示例中,将分词器配置保留letter,digit二种类型,并设置min_gram和max_gram都为 3

PUT my-index-000001
{
  "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-000001/_analyze
{
  "analyzer": "my_analyzer",
  "text": "2 Quick Foxes."
}

    分词结果:[ Qui, uic, ick, Fox, oxe, xes ]

 

  示例2

    与示例1不同的是min_gram值为1,max_gram值为3,当二种不同时,必需要设置index.max_ngram_diff 参数值

PUT my-index-000001
{
  "settings": {
    "index.max_ngram_diff":3,
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer"
        }
      },
      "tokenizer": {
        "my_tokenizer": {
          "type": "ngram",
          "min_gram": 1,
          "max_gram": 3,
          "token_chars": [
            "letter",
            "digit"
          ]
        }
      }
    }
  }
}

    分词示例

POST my-index-000001/_analyze
{
  "analyzer": "my_analyzer",
  "text": "2 Quick Foxes."
}

    分词结果:[2,Q,Qu,Qui,u,ui,uic,i,ic,ick,c,ck,k,Fo,Fox,o,ox,oxe,x,xe,xes,e,es,s]

 

  示例3

    高亮显示示例

PUT my-index-000001
{
  "settings": {
    "index.max_ngram_diff":3,
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer"
        }
      },
      "tokenizer": {
        "my_tokenizer": {
          "type": "ngram",
          "min_gram": 1,
          "max_gram": 3,
          "token_chars": [
            "letter",
            "digit"
          ]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "remark":{
        "type": "text",
        "analyzer": "my_analyzer"
      }
    }
  }
}

    插入一个文档

post my-index-000001/_doc
{
  "remark": "2 Quick Foxes."
}

    搜索关键词并高亮显示,实现了模糊搜索的功能

get my-index-000001/_search
{
  "highlight":{
    "fields": {
      "remark": {}
    }
  },
  "query":{
    "match": {
      "remark": "uic"
    }
  }
}

    搜索结果如下:

{
  "took" : 1304,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 1.7260926,
    "hits" : [
      {
        "_index" : "my-index-000001",
        "_type" : "_doc",
        "_id" : "DPs3wo4B-QCTFG8xdKKR",
        "_score" : 1.7260926,
        "_source" : {
          "remark" : "2 Quick Foxes."
        },
        "highlight" : {
          "remark" : [
            "2 Q<em>u</em><em>i</em><em>c</em>k Foxes."
          ]
        }
      }
    ]
  }
}

 

     

参考官方资料:N-gram tokenizer

     

标签:index,tokenizer,max,analyzer,Elasticsearch,gram,分词器,my
From: https://www.cnblogs.com/MrHSR/p/18121718

相关文章

  • 【Elasticsearch】在spring环境中 进行es的数据读取
    在Spring环境中进行Elasticsearch(ES)的数据读取,通常会利用SpringDataElasticsearch项目提供的功能。SpringDataElasticsearch提供了高度抽象的Repository接口,允许你以面向对象的方式操作Elasticsearch,而无需直接编写底层的HTTP请求或JSON解析代码。下面是一个简单的示例,演示如......
  • 2022 China Collegiate Programming Contest (CCPC) Mianyang | 2022 CCPC 绵阳(MAED
    搬运自本人知乎文章。https://zhuanlan.zhihu.com/p/588646549M.Rock-Paper-ScissorsPyramid题目链接Problem-M-Codeforces题意有一个长度为\(n\)的石头剪刀布序列,每个元素是RPS(石头、布、剪刀)中的一个,我们需要用这个序列构造一个三角,三角的底层为这个序列,第\(i(......
  • Elasticsearch 所有内置分词器介绍(6)
    一.概述Tokenizer分词器接收字符流(es的text类型),将其分解为单个term(通常是单个单词),然后输出标记流。分词器除了分解,还负责记录以下内容:1)记录每个单词(term)的顺序或位置(用于”phrase短语“和单词邻近性查询)2)term原始单词的开始和结束字符偏移量(使用......
  • 【视频】N-Gram、逻辑回归反欺诈模型文本分析招聘网站欺诈可视化|附数据代码
    原文链接:https://tecdat.cn/?p=36028原文出处:拓端数据部落公众号随着互联网的快速发展,招聘网站已成为求职者与雇主之间的重要桥梁。然而,随之而来的欺诈行为也日益猖獗,给求职者带来了极大的困扰和风险。因此,如何帮助客户有效地识别和防范招聘网站上的欺诈行为,已成为一个亟待解决......
  • docker-compose 安装部署ElasticSearch 和 Kibana
    项目需要搭建es环境,踩了一些坑,记录下首选还是通过docker搭建,而通过docker最佳的部署方式就是dockercompose1.docker-compose.ymlversion:"3.1"#服务配置services:elasticsearch:container_name:es01image:elasticsearch:8.12.2restart:unless-stopp......
  • English Grammar Analysis
    目录各种功能词的认识名词(Noun)冠词(Article)代词(Pronoun)动词(Verb)介词(Preposition)形容词(Adjective)副词(Adverb)量词(Quantifier)情态动词(ModalVerb)连词(Conjunction)感叹词(Interjection)数词(Numeral)句型动词不定式动名词分词名词性从句定语从句和关系代词定语从句和关系副词状语从句虚拟语......
  • docker安装elasticsearch和kibana
    来源:https://www.cnblogs.com/baoshu/p/16128127.html安装目标使用docker安装elasticsearch和kibana,版本均为7.17.1安装es1.dockerpull#去dockerhub看具体版本,这里用7.17.1Copydockerpullelasticsearch:7.17.1dockerpullkibana:7.17.12.临时安装生成文件#Copy......
  • The 18-th Beihang University Collegiate Programming Contest (BCPC 2023) - Final
    https://codeforces.com/gym/104883A#include<bits/stdc++.h>usingnamespacestd;usingi32=int32_t;usingi64=longlong;usingvi=vector<int>;i32main(){ios::sync_with_stdio(false),cin.tie(nullptr);i64n,sum=0;c......
  • ElasticSearch 7.17.20本地源码调试
    目录使用本地安装gradle下载相关依赖本地编译本地调试使用本地安装gradle下载相关依赖在gradle安装目录下的init.d目录中,创建初始化脚本init.gradle,添加如下脚本,将其中的maven仓库源全部换成国内镜像allprojects{repositories{defREPOSITORY_URL='http://m......
  • 深度学习-nlp-NLP之实现skip-gram--74
    目录1.数据的获取2.数据加载3.制作数据集4.制作训练集5.模型定义6.训练模型7.可视化8.结果1.数据的获取#导入一些需要的库#由于Python是由社区推动的开源并且免费的开发语言,不受商业公司控制,因此,Python的改进往往比较激进,#不兼容的情况时有发生。Python为了确保......