中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

lucene全文索引是什么

發布時間:2021-12-20 09:32:06 來源:億速云 閱讀:173 作者:iii 欄目:編程語言

本篇內容主要講解“lucene全文索引是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“lucene全文索引是什么”吧!

一、Lucene介紹及應用

Apache Lucene是當下最為流行的開源全文檢索工具包,基于JAVA語言編寫。

目前基于此工具包開源的搜索引擎,成熟且廣為人知的有Solr和Elasticsearch。2010年后Lucene和Solr兩個項目由同一個Apache軟件基金會的開發團隊制作,所以通常我們看到的版本都是同步的。二者的區別是Lucene是工具包,而Solr是基于Lucene制作的企業級搜索應用。另外,我們常用的Eclipse,幫助系統的搜索功能也是基于Lucene實現的。

二、Lucene的兩項工作

在我們的生活物品中,漢語字典與全文索引是很相似的。我們拿拼音查字法舉例,首先我們通過拼音找到我們要查字的頁數,然后翻到該頁,閱讀這個字的詳細解釋。

在上面的例子中,我們提到了兩個要素:一個是字典,另一個是查字的過程。對應到Lucene的功能上,一個是我們要建立一個字典,這個過程叫做建立索引,另一個是根據搜索詞基于索引進行查詢。

2.1 建立索引

1)文檔的準備(Document)

文檔就是指我們要去搜索的原文。

2)分詞組件(Tokenizer)

將第一步的文檔進行詞語切割,去除標點,去除無用詞,比如“是”,“的”等。常用的開源中文分詞組件有MMSEG4J、IKAnalyzer等。切割后的詞語我們稱為詞元(Token)。

3)語言處理(Linguistic Processor)

將上一步的獲得的詞元進行處理,比如英文的大寫轉小寫,復數變單數,過去時分詞轉原形等。此時得到的結果,被稱作詞(Term)

4)索引組件

索引組件將上步得到的詞,生成索引和詞典,存儲到磁盤上。索引組件先將Term變成字典,然后對字典進行排序,排序后對相同的詞進行合并,形成倒排列表。每個詞在列表中存儲了對應的文檔Id(Document Frequency)以及這個詞在這個文檔中出現了幾次(Term Frequency)。

2.2 搜索

1)輸入查詢詞

2)詞法分析及語言處理

對輸入的詞進行拆分,關鍵字識別(AND,NOT)等。對拆分的詞元進行語言處理,與建立字典時語言處理的過程相同。由關鍵字與處理后的詞生成語法樹。

3)搜索索引,獲得符合語法樹的文檔

如A and B not C形成的語法樹,則會搜索包含A B C的文檔列表,然后用A和B的文檔列表做交集,結果集與C做差集,得到的結果,就是符合搜索條件的文檔列表

4)根據相關性,對搜索結果排序

通過向量空間模型的算法,得到結果的相關性。比較簡單的實現描述如下:在建立索引的時候,我們得到了Document Frequency和Term Frequency,Term Frequency越高,說明文檔的相關性越高;Document Frequency越高,說明相關性越弱。這個算法可以自己進行實現。

5)根據上面的排序結果,返回文檔。

三、索引結構

Lucene的索引結構是有層次結構的。我們以下圖為例

lucene全文索引是什么

3.1 索引(Index)

如果拿數據庫做類比,索引類似于數據庫的表。

在Lucene中一個索引是放在一個文件夾中的。所以可以理解索引為整個文件夾的內容。

3.2 段(Segment)

如果拿數據庫做類比,段類似于表的分區。

索引下面引入了Segment 的概念,一個索引下可以多個段。當flush或者commit時生成段文件。截圖中有0,1兩個段。segments.gen和segments_5是段的元數據文件,它們保存了段的屬性信息。其他的文件對應的就是各段的文件,稍后會詳細說明各文件的用處。

索引的寫入是順序的,只能被追加,不能被修改。當索引要刪除時,在.del文件中寫入對應的docId。查詢的時候會過濾到此docId。另外索引的修改,是對Document進行刪除后做的追加。這種設計保證了高吞吐量。

分段的設計能保證查詢的高效,當段太大時,查詢會產生很大的IO消耗。段太小,則需要查詢的段太多。所以lucene對段進行了合并,另外刪除的數據也是在合并過程中過濾掉的。4.0之前的默認的合并策略為LogMergePolicy,這個策略會合并小于指定值的相鄰段,如果兩個相鄰段,一個大小為1G,一個大小為1k,則會重寫1G的文件會占用很大資源。4.0之后默認策略改為了TieredMergePolicy,這個策略會先按分段大小進行排序,對段進行刪除比計算,優先合并小的分段。當系統閑暇的時候,才對大分段進行合并。

3.3 文檔(Document)

如果拿數據庫做類比,文檔類似于數據的一行。

Document是索引的基本單位。一個段可以有多個Document

3.4 域(Field)

如果拿數據庫做類比,域相當于表的字段。

Doument里可以有多個Field。Lucene提供多種不同類型的Field,例如StringField、TextField、LongFiled或NumericDocValuesField等。

3.5 詞(Term)

Term是索引的最小單位。Term是由Field經過Analyzer(分詞)產生。

四、段的文件說明

segments_N保存了此索引包含多少個段,每個段包含多少篇文檔。

*.fnm

保存了此段包含了多少個域,每個域的名稱及索引方式。

*.fdx,*.fdt

保存了此段包含的所有文檔,每篇文檔包含了多少域,每個域保存了那些信息。

*.tvx,*.tvd,*.tvf

保存了此段包含多少文檔,每篇文檔包含了多少域,每個域包含了多少詞,每個詞的字符串,位置等信息。

*.tis,*.tii

保存了詞典(Term Dictionary),也即此段包含的所有的詞按字典順序的排序。

*.frq

保存了倒排表,也即包含每個詞的文檔ID列表。

*.prx

保存了倒排表中每個詞在包含此詞的文檔中的位置

*.del

前面講段的時候有提到,用來是存儲刪掉文檔id的。

到此,相信大家對“lucene全文索引是什么”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

绥棱县| 靖安县| 金昌市| 遵义市| 麦盖提县| 灵石县| 元氏县| 新和县| 普安县| 民县| 乌拉特后旗| 尚义县| 博白县| 上蔡县| 巨鹿县| 珠海市| 甘孜| 根河市| 伽师县| 安达市| 海丰县| 沙田区| 清原| 甘德县| 乌审旗| 漳平市| 沁阳市| 南雄市| 蕲春县| 绍兴市| 常山县| 富阳市| 揭西县| 义乌市| 伊金霍洛旗| 静宁县| 涟水县| 孟村| 浮梁县| 奎屯市| 荆门市|