我是靠谱客的博主 辛勤可乐,最近开发中收集的这篇文章主要介绍浅谈elasticsearch的分词原理,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

这篇文章主要是来浅谈一下elasticsearch的分词原理,让各位同学对分词不再陌生~

废话不多说,我们直接上干货


 

前言一

  • 我们创建一个文档 

PUT test/_doc/1
{
  "msg":"乔丹是篮球之神"
}
  • 我们通过'乔丹'这个关键词来搜索这个文档
POST /test/_search
{
  "query": {
    "match": {
      "msg": "乔丹"
    }
  }
}

  • 我们发现能匹配文档出来,那整一个过程的原理是怎样的呢?


 

前言二

  • 我们来试下使用中文分词器(安装分词过程省略)
PUT test/_mapping
{
  "properties": {
    "msg_chinese":{
      "type":"text",
      "analyzer": "ik_max_word"
    }
  }
}
POST test/_doc/1
{
  "msg":"乔丹是篮球之神",
  "msg_chinese":"乔丹是篮球之神"
}

 

  • 分别对两个不同类型的字段,通过‘乔’来搜索,看能不能搜出来
POST /test/_search
{
  "query": {
    "match": {
      "msg_chinese": "乔"
    }
  }
}

POST /test/_search
{
  "query": {
    "match": {
      "msg": "乔"
    }
  }
}

  • 为什么同样是输入'乔',为什么msg能匹配出文档,而msg_chinese不能呢?


 

写时分词

  • 我们使用来分析这个msg这个字段是怎样分词的
POST test/_analyze
{
  "field": "msg",
  "text": "乔丹是篮球之神"
}

乔,丹,是,篮,球,之,神
  • 再来分析这个msg_chinese这个字段是怎样分词的
POST test/_analyze
{
  "field": "msg_chinese",
  "text": "乔丹是篮球之神"
}

乔丹, 是, 篮球, 之神
  • 文档写入的时候会根据字段设置的分词器类型进行分词,如果不指定就是默认的standard分词器。

  • 写时分词器需要在mapping中指定,而且一旦指定就不能再修改,若要修改必须重建索引。


 

读时分词

  • 由于读时分词器默认与写时分词器默认保持一致,拿上面的例子,你搜索 msg 字段,那么读时分词器为 Standard ,搜索 msg_chinese 时分词器则为 ik_max_word。这种默认设定也是非常容易理解的,读写采用一致的分词器,才能尽最大可能保证分词的结果是可以匹配的。

  • 允许读时分词器单独设置

POST test/_search
{
  "query": {
    "match": {
      "msg_chinese": {
        "query": "乔丹",
        "analyzer": "standard"
      }
    }
  }
}
  • 一般来讲不需要特别指定读时分词器,如果读的时候不单独设置分词器,那么读时分词器的验证方法与写时一致。

 

 


深入分析

 

  • 分析器(analyzer)有三部分组成

    • char filter : 字符过滤器

    • tokenizer : 分词器

    • token filter :token过滤器

  • char filter(字符过滤器)

    • 字符过滤器以字符流的形式接收原始文本,并可以通过添加、删除或更改字符来转换该流。一个分析器可能有0个或多个字符过滤器。

  • tokenizer (分词器)

    • 一个分词器接收一个字符流,并将其拆分成单个token (通常是单个单词),并输出一个token流。比如使用whitespace分词器当遇到空格的时候会将文本拆分成token。"eating an apple" >> [eating, and, apple]。一个分析器必须只能有一个分词器

      POST _analyze
      {
        "text": "eating an apple",
        "analyzer": "whitespace"
      }
      

       

  • token filter (token过滤器)

    • token过滤器接收token流,并且可能会添加、删除或更改tokens。比如一个lowercase token filter可以将所有的token转成小写。一个分析器可能有0个或多个token过滤器,它们按顺序应用。

  • standard分析器

    • tokenizer

      • Stanard tokenizer

    • token filters

      • Standard Token Filter

      • Lower Case Token Filter


 

最后

以上就是辛勤可乐为你收集整理的浅谈elasticsearch的分词原理的全部内容,希望文章能够帮你解决浅谈elasticsearch的分词原理所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部