过段时间需要写一点搜索的小业务,所以复习一下es。
什么是es?
我觉得是分布式强一致性+http+lucene.一开始以为es做了很多事,于是就去瞄了一眼lucene结果发现分词都是lucene做的,泪目了。

简单的看一下英文的分词就是一个简单的词法器。kStemData1-8就是从a-z的词库,这样根据首字母就可以去不同的词库中去做匹配了,减小了匹配的范围,提高了匹配的速度。
索引结构和名词解释?
在没有es的时候我们怎么样做全文搜索?在mysql中我们使用like来达到相同的目的,坏处也是显而易见的
1.不走索引,全表扫描,mysql cpu拉满领导气得想打人。
2.只能首尾匹配,不能做复杂的搜索业务
正排索引:是以文档对象的唯一 ID 作为索引,以文档内容作为记录的结构。就像我们看书的时候先去看目录一样页码就是对应文章的唯一id.
倒排索引:就是以单词为索引,文章id为记录的索引结构。
倒排索引包含
1.文档id。
2.单词频率tf 记录的该单词在文档中出现的次数。
3.位置position,记录单词在文档中分词的位置,用于语句搜索phrase query。(分词之后是第几个单词)
4.偏移offset,记录单词在文档中开始和结束的位置,实现高亮。(这个应该会存多个,这样才能将出现多个的同一单词就能全部高亮了)
面临的问题
1.Dictionary(所有的单词)太大,因为一段文档可能分词出成千上万的单词。
2.Postings (即文档id等内容)太大,因为一个单词可能出现在任意一个文档中。
Postings中的数据没有依赖关系。所以es分为三个文件去存储
.doc
存储文档id和tf词频
.pay
记录payload信息和偏移量信息
.pos
记录位置信息
暂时就写到这里吧,太细致的东西现在写也不太适合,等过段时间有了新的感悟再说
网友评论