ElasticSearch(7.2.2)-浅谈es的分词原理

mac2025-12-25  8

简介:谈谈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。⽐如⼀个lower case token filter可以将所有的token转成⼩写。⼀个分析器可能有0个或多个token过滤器,它们按顺序应⽤。
standard分析器
tokenizer Stanard tokenizer token filters Standard Token FilterLower Case Token Filter
最新回复(0)