初次接触 Elasticsearch 的同学经常会遇到分词相关的难题,比如如下这些场景:
1、为什么命名有包含搜索关键词的文档,但结果里面就没有相关文档呢?
2、我存进去的文档到底被分成哪些词(term)了?
3、我得自定义分词规则,但感觉好麻烦呢,无从下手
如果你遇到过类似的问题,希望本文可以解决你的疑惑。
一、上手
让我们从一个实例出发,如下创建一个文档:
PUT test/doc/1
{
"msg":"Eating an apple a day keeps doctor away"
}
然后我们做一个查询,我们试图通过搜索 eat这个关键词来搜索这个文档
POST test/_search
{
"query":{
"match":{
"msg":"eat"
}
}
}
ES的返回结果为0。这不太对啊,我们用最基本的字符串查找也应该能匹配到上面新建的文档才对啊!
各位不要急,我们先来看看什么是分词。
二、 分词
搜索引擎的核心是倒排索引(这里不展开讲),而倒排索引的基础就是分词。所谓分词可以简单理解为将一个完整的句子切割为一个个单词的过程。在 es 中单词对应英文为 term。我们简单看个例子: