如何查询ES的分词器 es分词算法_analyzer

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

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


前言一

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

如何查询ES的分词器 es分词算法_analyzer_02

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

前言二

  • 我们来试下使用中文分词器(安装分词过程省略)
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": "乔"
    }
  }
}

如何查询ES的分词器 es分词算法_如何查询ES的分词器_03

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

如何查询ES的分词器 es分词算法_分词器_04

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

写时分词

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

如何查询ES的分词器 es分词算法_分词器_05

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

如何查询ES的分词器 es分词算法_分词器_06

乔丹, 是, 篮球, 之神
  • 文档写入的时候会根据字段设置的分词器类型进行分词,如果不指定就是默认的standard分词器。
  • 写时分词器需要在mapping中指定,而且一旦指定就不能再修改,若要修改必须重建索引。

读时分词

  • 由于读时分词器默认与写时分词器默认保持一致,拿上面的例子,你搜索 msg 字段,那么读时分词器为 Standard ,搜索 msg_chinese 时分词器则为 ik_max_word。这种默认设定也是非常容易理解的,读写采用一致的分词器,才能尽最大可能保证分词的结果是可以匹配的。
  • 允许读时分词器单独设置
POST test/_search
{
  "query": {
    "match": {
      "msg_chinese": {
        "query": "乔丹",
        "analyzer": "standard"
      }
    }
  }
}
  • 一般来讲不需要特别指定读时分词器,如果读的时候不单独设置分词器,那么读时分词器的验证方法与写时一致。

 

 


深入分析

如何查询ES的分词器 es分词算法_字段_07

 

  • 分析器(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