ES有很多亮点,其中一个就是他的索引方式:倒排索引;
正排索引是从文档到关键字的映射(已知文档求关键字),倒排索引是从关键字到文档的映射(已知关键字求文档)。通俗的来说,正向索引可以看作是查找所有文档,然后再去寻找关键字,而倒排索引是通过关键字做索引,然后找索引所对应的文档。
举个栗子:
假设我们有两个文档:
1)I have a friend who loves smile
2)love me, I love you
*表示该列文档中有这个词条,为空表示没有该词条
如果我们要搜索 I love you,我们只需要查找包含每个词条的文档:
两个文档都能匹配上,如果按命中词条数量来算,doc2比doc1更匹配。
这个是倒排索引最简化的表达方式,在ES的倒排索引存储结果中,还会记录每个词条在文档中出现的位置。
期望的分词处理
我们再看一下这个索引的建立过程,loves和love有区别吗?没有,都是爱的意思,一个是第三人称单数,一个是原形。如果能将一些语法的区别处理掉,这样的搜索结果是不是更切合实际需求?
例如:
loves提取词干处理成love
a,have之类的无实义的词,直接屏蔽掉
等等
现在索引看上去成这样:
常见分词器介绍
Elasticsearch自身提供了内置的分词器,也允许使用第三方的分词器。
内置分词器
标准分词器standard analyzer
ES默认分词器,根据Unicode联盟定义的单词边界划分文本,删除绝大部分标点,最后将词条小写。
简单分词器simple analyzer
在任何不是字母的地方分隔文本,将词条小写
空格分词器whitespace analyzer
在空格的地方划分文本
语言分词器language analyzer
特定的语言的分词器,如english,英语分词器,维护了一组英语停用词and、the之类的,用于删除词条,针对英文语法规则,有提取单词词干的能力。