Elasticsearch全文本搜索和原理分析

版权声明:本博客都是作者10多年工作总结 https://blog.csdn.net/Peter_Changyb/article/details/81980305

Elasticsearch一个高可扩展的开源的全文本搜索和分析工具。允许你以近实时的方式快速存储、搜索、分析大容量的数据。Elasticsearch是一个基于ApacheLucene(TM)的开源搜索引擎。无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。

  • ElasticSearch 有四种方式来构建数据库
  1. 最简单的方法是使用indexAPI,将一个Document发送到特定的index,一般通过curltools实现。
  2. 第二第三种方法是通过bulkAPI和UDPbulkAPI。两者的区别仅在于连接方式。
  3. 第四种方式是通过一个插件-river。river运行在ElasticSearch上,并且可以从外部数据库导入数据到ES中。需要注意的是,数据构建仅在分片上进行,而不能在副本上进行。
  • 对全文数据(非结构化数据)的搜索方式有两种: 

顺序扫描 
所谓顺序扫描就是按顺序对所有文件以此扫描,对每个文档进行关键字匹配 
全文检索 
对文档首先使用分词器取出关键词,得出的关键词列表即是倒排索引,这种非结构化数据中提取出的然后重新组织的信息,我们称之索引 ,这种对文档先建立索引在搜索的过程,叫全文检索 
全文检索的底层使用倒排索引(将文档使用分词器拆分成一个关键词列表)

  •  如何创建索引 

全文检索的索引创建过程一般有以下几步: 
第一步:一些要索引的原文档(Document)。 
第二步:将原文档传给分次组件(Tokenizer)。 
第三步:将得到的词元(Token)传给语言处理组件(Linguistic Processor)。 
第四步:将得到的词(Term)传给索引组件(Indexer)。 

  • 创建索引和搜索图解

查询索引的过程: 

  1. 在反向索引表中,分别找出包含lucene,learn,hadoop的文档链表。 
  2. 对包含lucene,learn的链表进行合并操作,得到既包含lucene又包含learn的文档链表。 
  3. 将此链表与hadoop的文档链表进行差操作,去除包含hadoop的文档,从而得到既包含lucene又包含learn而且不包含hadoop的文档链表。 此文档链表就是我们要找的文档。 
  • 计算权重的过程 

影响一个词(Term)在一篇文档中的重要性主要有两个因素: 
Term Frequency (tf):即此Term在此文档中出现了多少次。tf 越大说明越重要。 
Document Frequency (df):即有多少文档包含次Term。df 越大说明越不重要。

  • 倒排索引原理和实现 

搜索引擎的底层实现是基于倒排索引,倒排索引其实就是实现“单词-文档矩阵”的具体数据结构 
可以有不同的方式来实现上述概念模型,比如“倒排索引”、“签名文件”、“后缀树”等方式。 
后缀树:是一种PAT树,它描述了给定字符串的所有后缀,许多重要的字符串操作都能够在后缀树上快速地实现。https://www.cnblogs.com/luosongchao/p/3247478.html 

  • 倒排索引主要由两个部分组成:“单词词典”和“倒排文件” 
  1. 单词词典(Lexicon):搜索引擎的通常索引单位是单词,单词词典是由文档集合中出现过的所有单词构成的字符串集合,单词词典内每条索引项记载单词本身的一些信息以及指向“倒排列表”的指针。 
  2. 倒排列表(PostingList):倒排列表记载了出现过某个单词的所有文档的文档列表及单词在该文档中出现的位置信息,每条记录称为一个倒排项(Posting)。根据倒排列表,即可获知哪些文档包含某个单词。 单词词典进行构建和查找,常用的数据结构包括哈希加链表结构和树形词典结构。 

猜你喜欢

转载自blog.csdn.net/Peter_Changyb/article/details/81980305