搜索引擎:
搜索引擎:全文索引,目录索引,元搜索引擎,垂直搜索引擎、集合式搜索引擎,门户搜索引擎。
全文索引引擎:搜索,建立起数据库,返回结果。
全文检索思路:非结构化的一部分信息提取出来-》重新组织-》变成一定结构(索引)-》提高搜索速度
基于lucene纯java全文搜索工具包,提供完整查询引擎和索引引擎
Apache基金的子项目
lucene是一个IR库(informationretrieval library)不是web爬行器。
lucene:1.对要搜索的文件建立索引
2.在索引的基础上搜索
Lucene:采用反向索引机制,通过特定的API建立索引。
倒排索引:基础知识:
文档(Document)
文档集合(Document Collection)
文档编号(Document ID)单词编号(word ID)
倒排索引(Inverted Index)单词-文档矩阵的一种具体形式。
单词词典(Lexicon)搜索引擎的通常索引单位是单词。单词词典内每条索引项记载单词本身的一些信息以及指向倒排列表的指针。
倒排列表(PostingList)出现过某个单词的所有文档的文档列表以及该单词在文档中的位置信息,每条记录称为一个倒排项(Posting),根据倒排列表可以获知哪些文档包含某个单词。
倒排文件:存放倒排列表的文件称为倒排文件,存放倒排索引的物理文件
注意:单词词典在内存,倒排文件在磁盘。
TF表示出现的次数。
CSDN倒排索引、搜索引擎中有介绍。
单词词典:维护文档集合中出现的所有单词相关信息,同时记载某个单词对应的倒排列表在倒排文件中的位置信息。
哈希链表:两个不同单词获得相同的哈希值,在哈希方法里被称作一次冲突。
B树另外一种高效查找结构
Lucene文件格式
Lucene的索引过程,就是按照全文检索的基本过程,将倒排表写成此文件格式的过程。
Lucene的搜索过程,就是按照此文件格式将索引进去的信息读出来,然后计算每篇文档打分的过程(score)
Lucene文件格式:
段文件(Segments File):segments.gen segments_N
锁文件( Lock File ):write.lock
段信息(Segments Info):.si
复合文件(Copound File):.cfs
字段信息(Fields):.fnm
字段索引(Fields Index):.fdx
字段数据(Field Data):.fdt
词典(Term Dictionary).tim
词索引(Term Index).tip
频率信息(Frequencies).doc
位置信息(Positions).pos
Payloads .pay
Norms .nvd,.nvm
每个文档的值(Per-Document Values).dvd,.dvm
词向量索引(Term Vector Index).tvx
词向量文件(Term Vector Documents).tvd
词向量字段(Term Vector Fields).tvf
删除文档 .del
Lucene主要逻辑图:
一, 文本内容经切词后索引入库。
二, 根据查询条件返回结果。
Lucene入库逻辑:
1.入库者定义到库中文档的结构,结构与关系型数据库中表结构类似。包含多个字段,文章标题,作者,发布时间,正文内容等。
2.包含N个字段的文档(DOCUMENT),在真正入库前需要经过切词(或分词)索引(ANALYZER)
3.切分后的单词注册到索引树上,供查询时用(STORAGE)。
4.Lucene的索引树结构优秀,是Lucene的一大特色。
还需要细细研究
Lucene查询逻辑
1. 查询器根据条件遍历索引树,得到查询结果,结果类似于JDBC中的ResultSet。
2. 将返回的结果集显示在查询结果页面,如点击某一条内容,可以打开全文检索库中存储的网页内容。
3. Lucene默认只支持中文
Lucene数据结构与数据库对比
Lucene 数据库
doc(field1,field2) record(field1,field2)
结果:Hits(doc) results(record)
Lucene核心索引类:
IndexWriter Directory Analyzer Document
IndexWriter:索引过程中的中心组件,可以把IndexWriter想像为你可以对索引进行写操作的对象,但是不能用来读取或搜索。
Public IndexWriter(String path,Analyzera,boolean create)
Directory:代表一个Lucene索引的位置。它是一个抽象类。其中的两个实现:FSDirectory 存储在文件系统中的索引的位置;RAMDirectory存储在内存中的索引的位置。
Lucene Analyzer:在一个文档被索引之前,首先对文档进行分词处理,并且要剔除一些冗余的词句。Analyzer把分词后的内容交给IndexWriter来建立索引。
Lucene document:Document类似于数据库中的一条记录,由多个Field字段组成。方法add,get等。
Lucene Field:Field对象用来描述一个文档的某个属性的,比如一封电子邮件的标题和内容可以用两个Field对象分别描述。
Lucene创建索引过程:
Lucene搜索类
IndexSearcher Term Query TermQuery Hits
IndexSearcher:在建立好的索引上进行搜索的。返回Hits类型的对象
Term:搜索的基本单元。一个Term对象由两个String类型的域组成:字段的名称和字段的值。
Query:将用户输入的字符串封装成Lucene能够识别的Query。
TermQuery: 是抽象类Query的一个子类,也是最为基本的一个查询类。
Hits:用来保存搜索结果的。Hits实例并不从索引中加载所有匹配的文档,而是每次一小部分。
Lucene关键词搜索过程:
Lucene BooleanQuery
Lucene 范围搜索:RangeQuery(TermlowerTerm,Term upperTerm)
Lucene 前缀搜索:PrefixQuery
Lucene 短语搜索:PhraseQuery
Lucene 模糊查询:FuzzyQery
Elasticsearch –基于lucene的分布式搜索引擎
Elasticsearch是一个高可扩展的,开源的全文本搜索和分析工具。它允许你以近实时的方式快速存储,搜索,分析大容量的数据。Lucene被认为是迄今为止最先进,性能最好,功能最全的搜索引擎库。
Elasticsearch可以使用java开发并使用Lucene作为核心来实现所有的索引和搜索功能,但是它的目的是通过简单的RESTful API 来隐藏Lucene的复杂性,从而让全文搜索变得简单。
分布式的实时文件存储
分布式的实时分析搜索引擎
可以扩展到上百台服务器,处理PB级结构化和非结构化数据。
Elasticsearch核心概念:
Index:ES存储数据的地方,类似于关系型数据库的database。
Document type:类似于关系型数据库的表,主要功能是将完全不同schema数据分开,一个index里面可以有若干个Document type。
Document:这个类似于关系数据库的一行,在同一个Documenttype下面,每个Document都有一个唯一的ID作为区分;
Filed:类似关系数据库的某一列,这是ES数据存储的最小单位。
Cluster和Node:ES可以以节点或者集群的方式运行,以一个整体对外提供search服务的所有节点组成cluster,组成cluster的各个节点叫做node。
Shard:通常叫分片,将完整的index分成若干部分存储在相同或者不同的节点上,组成index的部分就叫做shard。
Replica:和replication通常指的是一回事,即index的冗余备份,
在索引创建后,你可以在任何时候动态的改变副本的数量,但是不能改变分片的数量。默认情况下Elasticsearch的每个索引都被分成5个主分片和另外5个副本。
当ES的一个节点启动后,它会广播找到集群中的其他节点,并且建立连接。
ES工作的时候,主节点会监控所有的节点是否正常,每隔1s主节点发送1次心跳。超时时间为30s,测试次数为3次,超过3次,则认为该节点通主接地那已经脱离。
ES通过Query DSL(基于json的查询语言)来查询数据。在ES内部,每次查询分为2个步骤,分散和聚合,分散是查询所有相关的分片,聚合是吧所有分片上的查询结果合并,排序,处理然后返回给客户端。
ES有4种方式创建数据库,
1.最简单的方法是index API。将一个Document发送到特定的index
2.bulk API
3.UDP bulk API 2和3的区别仅在于连接方式。
4.通过插件-river
GET/_cluster/health
PUT /blogs
新建,索引,删除文档
分布式集群-内部机制
检索文档,搜索所有文档,结构化查询合并多字句
ELK是一套常用的开源日志监控和分析系统,elasticsearch是一个分布式索引与搜索服务。一个管理日志和事件的工具logstash,和一个可视化服务Kibana。
来源:CSDN
作者:Dxydu
链接:https://blog.csdn.net/xiduxingyu/article/details/70163127