鹽城網(wǎng)站app建設(shè)西安網(wǎng)站外包
Elasticsearch和Lucene的關(guān)系
? ??Lucene 是一個開源、免費(fèi)、高性能、純 Java 編寫的全文檢索引擎,可以算作是開源領(lǐng)域最好的全文檢索工具包。ElasticSearch 是基于Lucene實(shí)現(xiàn)的一個分布式、可擴(kuò)展、近實(shí)時性的高性能搜索與數(shù)據(jù)分析引擎。
Lucene索引層次結(jié)構(gòu)
Lucene的基礎(chǔ)層次結(jié)構(gòu)由索引、段、文檔、域、詞五個部分組成。正向索引的生成即為基于Lucene的基礎(chǔ)層次結(jié)構(gòu)一級一級處理文檔并分解域存儲詞的過程。
索引文件層級關(guān)系如圖1所示:
-
索引(Index):Lucene索引庫包含了搜索文本的所有內(nèi)容,可以通過文件或文件流的方式存儲在不同的數(shù)據(jù)庫或文件目錄下。
-
段(Segment):一個索引中包含多個段,段與段之間相互獨(dú)立。由于Lucene進(jìn)行關(guān)鍵詞檢索時需要加載索引段進(jìn)行下一步搜索,如果索引段較多會增加較大的I/O開銷,減慢檢索速度,因此寫入時會通過段合并策略對不同的段進(jìn)行合并。
-
文檔(Document):Lucene會將文檔寫入段中,一個段中包含多個文檔。
-
域(Field):一篇文檔會包含多種不同的字段,不同的字段保存在不同的域中。
-
詞(Term):Lucene會通過分詞器將域中的字符串通過詞法分析和語言處理后拆分成詞,Lucene通過這些關(guān)鍵詞進(jìn)行全文檢索。
倒排索引
其中主要有如下幾個核心術(shù)語需要理解:
-
詞條(Term):?索引里面最小的存儲和查詢單元,對于英文來說是一個單詞,對于中文來說一般指分詞后的一個詞。
-
詞典(Term Dictionary):?或字典,是詞條 Term 的集合。搜索引擎的通常索引單位是單詞,單詞詞典是由文檔集合中出現(xiàn)過的所有單詞構(gòu)成的字符串集合,單詞詞典內(nèi)每條索引項(xiàng)記載單詞本身的一些信息以及指向“倒排列表”的指針。
-
倒排表(Post list):?一個文檔通常由多個詞組成,倒排表記錄的是某個詞在哪些文檔里出現(xiàn)過以及出現(xiàn)的位置。每條記錄稱為一個倒排項(xiàng)(Posting)。倒排表記錄的不單是文檔編號,還存儲了詞頻等信息。
-
倒排文件(Inverted File):?所有單詞的倒排列表往往順序地存儲在磁盤的某個文件里,這個文件被稱之為倒排文件,倒排文件是存儲倒排索引的物理文件。
-
字典樹(Term Index):?從數(shù)據(jù)結(jié)構(gòu)上分類算是一個“Trie 樹”,也就是我們常說的字典樹。這棵樹不會包含所有的 term,它包含的是 term 的一些前綴(這也是字典樹的使用場景,公共前綴)。通過 term index 可以快速地定位到 term dictionary 的某個 offset。
索引查詢及文檔搜索過程
Lucene利用倒排索引定位需要查詢的文檔號,通過文檔號搜索出文件后,再利用詞權(quán)重等信息對文檔排序后返回。
-
內(nèi)存加載tip文件,根據(jù)FST匹配到后綴詞塊在tim文件中的位置;
-
根據(jù)查詢到的后綴詞塊位置查詢到后綴及倒排表的相關(guān)信息;
-
根據(jù)tim中查詢到的倒排表信息從doc文件中定位出文檔號及詞頻信息,完成搜索;
-
文件定位完成后Lucene將去.fdx文件目錄索引及.fdt中根據(jù)正向索引查找出目標(biāo)文件。
文件格式如圖4所示: