Lucene创建索引原理
Lucene是基于倒排索引原理来实现的
- 首先,将原文档进行分词处理,形成一个个单独的单词,
- 然后取出标点符号以及停词,形成词元,
- 再将词元做一些语言相关的处理,比如变成小写,转换时态,单复数形式等等,
- 将得到的词创建一个字典,按照字母顺序排序,合并相同的词,最终生成一个倒排索引文档
ES的keyword和text区别
keyword:不分词,直接建立索引,支持模糊查询,精确查询,聚合查询
text:分词后建立索引,支持模糊查询,精确查询,不支持聚合查询
keyword通常用于通常用于存储年龄,性别,邮编,邮箱号码等等,直接将完整数据保存的场景
text通常存储全文搜索的数据,例如地址,文章内容的保存
ES的优势
ES是基于Lucene的开源搜索引擎,它解决了原生Lucene使用的不足,优化了Lucene的调用方式
- 分布式的实时文件存储,每个字段都被索引并可被搜索
- 支持实时分析搜索
- 可以扩展到上百台服务器,处理PB级结构化或非结构化数据
- 通过简单的 RESTful API、可以跟各种语言的客户端甚至命令行进行交互
- 上手非常容易,只需很少的学习就可以在生产环境中使用
Lucene/ES为什么那么快(ES用到什么数据结构)
传统搜索比如mysql的like关键字查询,它的搜索方式就是全文扫表,查询性能很低
ES是基于Lucene的全文检索引擎,它采用的是倒排索引结构,在存储时先对文档进行分词,再做一些标点符号去除,大小写时态转换等优化处理,最后按照字母顺序去重排序,形成一个倒排索引文档,我们在检索时,就可以通过二分查找的方式找到目标值
ES的分层结构,index下面是什么
Index:索引库,包含有一堆相似结构的文档数据,类比Mysql中的数据库
Type:类型,它是index中的一个逻辑数据分类,类比Mysql中的表
Document:文档:是ES中的最小数据单元,通常用json结构标识,类比Mysql中的一行数据
Field:字段:类比Mysql中的一个列
从ES7.0开始,Type被干掉了,从此库表合一即一个Index中只有一个默认的Type
讲几个ES中的查询对象:比如TermQuery
TermQuery:匹配关键字查询(关键词不分词)
MatchQuery:匹配关键字查询(关键字分词后)
BooleanQuery:按条件查询
matchAllQuery:匹配所有文档查询
rangeQuery:查询指定范围内的数据