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:查询指定范围内的数据