今天来聊聊es的分词问题。
我们的项目做的是舆情搜索,主要的技术在es。当时就到了一个很奇怪的问题,通过关键词查询,返回来的文本内容中并没有这个关键词,我们还对查询做来高亮显示。关键词是unita,返回的文本数据可以高亮的词为unit,很郁闷。
倒排索引
elasticsearch的底层是由lucene实现,主要的原理是倒排索引,在知乎上看到一篇对倒排索引原理介绍特别好的文章Lucene 查询原理。这里简单的转载一些内容。
在es字段类型中,我们可以简单的划分为可以分析字段(使用分析器分析,入text),不可以分析字段(如keyword)
而不可以分析的字段在索引存储中就是最小的单元,我们称之为term(词条)。而对于可分析字段text,在索引的创建过程中,会使用特别的分析器对这个字段内容进行分析,最后形成一系列的term。倒排索引既是使用这些term构建一个倒排链,通过term查询具体的文档。
何为倒排链?假设你在es存储了三篇文档。
docid | name | age | describe |
---|---|---|---|
2 | ycc | 18 | this is a handsame boy |
3 | ycc | 18 | nothing is impossible |
1 | lin | 17 | this is a hadsame boy |
对于name和age字段,在索引创建中存在两条对应的倒排链:
ycc | (2,3) |
---|---|
lin | (1) |
18 | (2,3) |
---|---|
17 | (1) |