Lucene概述第一部分:創建索引

介紹

我最近一直在與開源搜索引擎Lucene合作 。 我不是專家,但是由于我只是瀏覽了一些相當稀疏的文檔并將應用程序從Lucene的很舊的版本遷移到了最新版本的2.4,所以我在總體上很清楚。 Lucene的文檔有點讓人難以想象,因此我想趁此機會在我腦海中嶄露頭角時,對Lucene進行高層次的概述。

如果您發現此頁面正在尋找Lucene的入門資料,那么對您有好處! 那就是它的目的。 不要期望找到最佳實踐,代碼示例或高級主題。 您將對Lucene的概念體系結構有一個清晰的介紹,通過它您可以高效地訪問項目網站上的FAQ和教程。 我正在使用Lucene的Java實現,但是所有這些高級內容都將同樣適用于任何其他Lucene風格。

您應該了解的第一件事是Lucene的實際作用。 Lucene實際上只做兩件事。

  1. 它創建搜索索引。
  2. 它在那些索引中搜索內容。

索引是您需要進行搜索的任何數據的有效導航表示。 您的數據可能與內容管理系統中的一組Word文檔一樣簡單,或者可能是來自數據庫,HTML頁面或系統中任何類型的數據對象的記錄。 由您決定要使哪些實體可搜索。 對于我們的討論,我們假設我們正在處理一組Word文檔。

創建索引

因此,第一步是為我們的Word文檔集創建索引。 為此,我們需要編寫一些代碼,以從Word文檔中獲取信息并將其轉換為可搜索的索引。 唯一的方法就是蠻力。 我們必須遍歷每個Word文檔,檢查每個文檔并將其轉換為Lucene創建索引時需要處理的部分。

Lucene創建索引需要哪些步驟? 那里有兩個。

  1. 文件資料
  2. 領域

這兩個抽象是Lucene的關鍵,Lucene用兩個頂級Java類(Document和Field)來表示它們。 文檔,不要與我們的實際Word文檔混淆,是一個Java類,表示Lucene中的可搜索項目。 可搜索項是指文檔是您在搜索時發現的東西。 創建這些文檔由您決定。

對于我們來說幸運的是,這是從實際的Word文檔到Lucene文檔的非常清晰的一步。 我想任何人都會同意,這將是我們的用戶在進行搜索時希望找到的Word文檔。 這使我們的處理變得相當簡單,我們將為每個實際的Word文檔簡單地創建一個Lucene文檔。

創建文檔及其字段

但是我們該怎么做呢? 實際上非常簡單。 首先,我們使用new運算符創建Document對象-僅此而已。 但是,在這一點上,文檔是沒有意義的。 現在,我們必須確定要添加到文檔中的字段。 這是我們必須思考的部分。 文檔由任意數量的字段組成,每個字段都有一個名稱和一個值。 這里的所有都是它的。

創建Lucene索引的開發人員幾乎普遍創建了兩個字段。 最重要的字段將是“內容”字段。 這個字段保存了我們要為其創建Lucene文檔的Word文檔的內容。 請記住,字段的名稱完全是任意的,但是大多數人將字段之一稱為“內容”,他們將現實世界中可搜索對象(在我們的情況下為Word文檔)的實際內容粘貼到該字段的值中。 本質上,字段只是一個名稱:值對。

開發人員創建的另一個非常常見的字段是“標題”字段。 該字段的值將是Word文檔的標題。 我們可能希望將有關Word文檔的其他信息保留在索引中。 其他常見字段是諸如“作者”,“ creation_date”,“關鍵字”等之類的內容。對所需字段的標識完全取決于業務需求。

因此,對于我們要使其可搜索的每個Word文檔,我們都必須創建一個Lucene文檔,其中包含我們上面概述的字段。 使用這些字段創建文檔后,我們將其添加到Lucene索引編寫器中,并要求它編寫索引。 而已! 現在,我們有了一個可搜索的索引。 的確如此,但是我們可能已經忽略了幾個Field細節。 讓我們仔細看看Fields。

字段詳細信息:存儲還是索引?

字段可以以多種方式保留在索引中。 您最初可能懷疑存在的最明顯的方法,也許是唯一的方法是可搜索的方法。 在我們的示例中,我們完全希望,如果用戶鍵入一個Word文檔內容中存在的單詞,則搜索將在搜索結果中返回該Word文檔。 為此,Lucene必須索引該字段。 首先,該術語有點讓人困惑,但是請注意,完全有可能在不使其可搜索的情況下將“字段”“存儲”在索引中。 換句話說,可以“存儲”一個字段,但不能“索引”它。 為什么? 您很快就會看到。

Lucene在將Field保留在索引中的方式之間的第一個區別是存儲還是索引。 如果我們期望某個字段的值匹配以使文檔被搜索擊中,那么我們必須為該字段建立索引。 如果僅存儲字段,則搜索查詢無法達到其值。 為什么要存儲一個字段? 很簡單,當我們通過索引字段之一命中Document時,Lucene將向我們返回整個Document對象。 所有存儲的字段將在該Document對象上可用; 被索引的字段將不在該對象上。 索引字段是用于查找文檔的信息,存儲的字段是與文檔一起返回的信息。 兩件事。

這意味著盡管我們可能無法基于給定字段的內容進行搜索,但是當搜索返回文檔時,我們仍然可以利用該字段的值。 我能想到的最明顯的用例是基于Web的文檔的“ url”字段。 搜索aURL的值沒有任何意義,但是您肯定希望知道搜索返回的文檔的URL。 您的結果頁面還可以如何將用戶引導到點擊頁面? 這是非常重要的一點:存儲的字段的值將在搜索返回的文檔上可用,但是實際上只有索引的字段的值可以用作搜索的目標。

從技術上講,存儲的字段保留在Lucene索引內。 但是,我們必須跟蹤索引的字段與存儲的字段不同的事實。 不幸的術語。 這就是單詞重要的原因。 他們可以避免很多混亂。

索引字段:已分析還是未分析?

對于下一個皺紋,我們必須指出,可以以兩種不同的方式對索引字段進行索引。 首先,我們可以在單個塊中索引字段的值。 換句話說,我們可能有一個“電話號碼”字段。 當我們搜索電話號碼時,我們需要匹配整個值或什么都不匹配。 這是很合理的。 因此,對于像電話號碼這樣的字段,我們將整個值ATOMICALLY索引到Lucene索引中。

但是,讓我們考慮一下Word文檔的“內容”字段。 我們是否希望用戶必須匹配整個字段? 當然不是。 我們希望將Word文檔的內容分解為可搜索的標記。 此過程稱為分析。 我們可以從丟棄所有不重要的詞開始,例如“ a”,“ the”,“ and”等。我們可以進行許多其他優化,但是最重要的是,字段的內容如“ contents” ”應該由Lucene分析。 這將產生目標輕量級索引。 這就是搜索變得有效和強大的方式。

在API中,這歸結為以下事實:創建字段時,我們必須指定

  1. 是否存儲
  2. 是否索引
  • 如果建立索引,是否進行分析

現在,您應該清楚字段的詳細信息。 重要的是,我們可以存儲和索引給定的字段。 這不是一個選擇。

創建索引

將所有文檔添加到索引后,我們只需告訴索引編寫者即可創建索引。 從現在開始,我們可以根據索引的字段搜索任何文檔。 尋找即將到來的條目,以對在Lucene索引中搜索事物有一個高層次的概述。

分手筆記

回想一下,我們說過,假設我們的目標數據是一組Word文檔會更簡單。 現在我們已經完成了,請考慮您的目標數據可以是任何數據。 實際上,搜索的是Lucene文檔。 您可以根據需要創建任何內容。 它們可以并且經常來自現實世界中數據對象的集合。 同樣,將哪些數據放入Lucene文檔中取決于您的業務需求。 它可以像Word文檔到Lucene文檔的一對一映射一樣簡單,或者每個Lucene文檔可以是各種數據庫查詢以及您可能會發現的其他內容的集合。

索引愉快!

參考: Lucene概述第一部分:由我們的W4G合作伙伴 Chad Davis在zeroInsertionForce博客上創建索引 。


翻譯自: https://www.javacodegeeks.com/2012/04/lucene-overview-part-one-creating-index.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/373121.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373121.shtml
英文地址,請注明出處:http://en.pswp.cn/news/373121.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

初識openstack

一、 什么是openstack? OpenStack是一個由NASA(美國國家航空航天局)和Rackspace合作研發并發起的,以Apache許可證授權的自由軟件和開放源代碼項目。 二、openstack前世今身 openstack是一個跟Eucalyptus,AWS(Amazon web Service)類…

c語言case多語句的取值,Switch Case語句中多個值匹配同一個代碼塊的寫法

C#+JQuery+.Ashx+百度Echarts實現全國省市地圖和餅狀圖動態數據圖形報表的統計在目前的一個項目中,需要用到報表表現數據,這些數據有多個維度,需要同時表現出來,同時可能會有大量數據呈現的需求,經過幾輪挑選,最終選擇了百度的e…

php解決下單、抽獎并發導致的庫存負數的問題

我們知道數據庫處理sql是一條條處理的,假設購買商品的流程是這樣的: sql1:查詢商品庫存 if(庫存數量 > 0) { //生成訂單... sql2:庫存-1 } 當沒有并發時,上面的流程看起來是如此完美,假設同時兩個人下單,而…

在Spring中使用JDBCJobStore配置Quartz

我將開始一些有關Quartz Scheduler內部,提示和技巧的系列文章,這是第0章-如何配置持久性作業存儲。 在Quartz中,您基本上可以在將作業和觸發器存儲在內存中以及在關系數據庫中進行選擇( Terracotta是最近添加的混合功能&#xff0…

rlwrap插件,實現sqlplus上下翻頁

oracle在Linux下,sqlplus中不能上下翻,最主要我經常打錯字!嘿嘿 01、下載 RPM :http://rpmfind.net/linux/rpm2html/search.php?queryrlwrap tar.gz:https://fossies.org/linux/privat/rlwrap-0.42.tar.gz/ 百度云:h…

ice庫c語言例子,很不多的ICE架構入門學習例子

雖然使用傳統的SOCKET編程,我們可以更為清楚程序的性能,能夠更直接的操控SOCKET的設置,比如發送超時時間,接受BUFFER的大小,以及進行自己的協議加密。但是由于其調試成本較高,且不易于分布式部署ICE 作為一…

程序員的十個層次,你屬于哪一層?(轉)

自西方文藝復興以來,中國在自然科學方面落后西方很多,軟件領域也不例外。當然現在中國的許多程序員們對此可能有許多不同的意見,有些人認為中國的程序員水平遠落后于西方,有些則認為中國的程序員個人能力并不比西方的程序員差&…

操作系統基礎篇

程序運行的4個因素 (1).程序設計語言 (2).編譯系統 (3).操作系統 (4).指令集結構(硬件系統) 操作系統的定義:操作系統是掌控計算機上所有事情的軟件系統(硬件資源,軟件資源) 操作系統對內存,i/o,cpu&#x…

高效快速中值濾波算法c語言,快速中值濾波及c語言實現.docx

...快速中值濾波及c語言實現學生姓名: 劉 勇 學 號: 6100410218 專業班級: 數媒101【摘要】本文討論了用c語言在微機上實現中值濾波及快速算法,在程序設計的過程中充分考慮到程序運行的時間復雜度和空間復雜度的問題.解…

Arquillian 1.0.0.Final正式發布! 準備使用GlassFish和WebLogic! 殺死所有蟲子!

紅帽公司和JBoss社區今天宣布的1.0.0.Final發布的Arquillian ,其屢獲殊榮的建在Java虛擬機(JVM)運行測試平臺。 Arquillian大大減少了編寫和執行Java中間件集成和功能測試所需的工作。 它甚至使測試工程師能夠解決以前認為無法測試或測試成本…

Jquery選擇器特殊字符問題

場景: $("#" AAA ""),AAA代表某表單ID 當AAA為普通字符串時,ok; 當AAA含有特殊符號時(eg:a.b),獲取不到該對象; 原因:特殊符號會進行轉義&#xf…

qq五筆linux,QQ五筆 - 五筆小字典 QQ綁定很實用

九、 智能調頻、空碼檢索、詞序固定在QQ五筆中還有一些小亮點,比如它可以根據“最近輸入”、“輸入次數”對候選詞排序。同時為了加快檢索速度,默認只在常用字庫(GB2312)中檢索,只有出現空碼后才會繼續搜索容量更大的GBK字庫,很好…

DFS:C 小Y的難題(1)

解題心得: 1、在明確使用DFS之后一定要找到遞歸函數的出口、方向,以及遞歸的點(在某個情況下開始遞歸)(void 也可以return,但是沒有返回值)。遞歸時也要有遞歸的方向,最后都能夠達到遞歸的出口。 2、在DF…

使用ActiveMQ支持Spring Integration路由

正如我在上 一篇 文章中所討論的那樣 ,Spring Integration(SI) 是在Spring Framework之上構建的路由框架 ,它使您可以使用經過驗證的企業集成模式來通過消息傳遞解決系統集成問題。 配置好SI并執行路由和中介邏輯后,您…

quagga源碼分析--路由信息處理zebra-rib

對于各個協議生成的路由信息的處理屬于quagga中非常重要的一個功能,如何在內核進行路由增加,更新,刪除是一個復雜的過程。 quagga在thread任務調度中加入了一種工作隊列,work_queue,與內核的工作隊列類似,是…

android 關閉藍牙打電話功能,Android藍牙開發【八】hfp接聽、掛斷電話

繼續研究hfp相關功能。藍牙耳機可以控制手機接聽、拒接、掛斷電話,撥打電話等功能。本文主要分析下起這些操作的大致流程。在系統應用Bluetooth中com_android_bluetooth.cpp提供了多個回調方法,由hardware、協議棧回調過來。藍牙耳機的一些控制命令都會發…

android在listview中放入從sdcard讀取的bitmap

重寫viewbinder public class viewbinder_bookmark implements SimpleAdapter.ViewBinder{Overridepublic boolean setViewValue(View view, Object data, String textRepresentation){if(view instanceof ImageView && data instanceof Bitmap){ImageView imageview(I…

將狀態機模式實現為流處理器

在我的上一個博客中,我說我真的以為某些“四人行”(GOF)模式已經過時了,如果不是過時的話肯定不受歡迎。 特別是我說過StateMachine不是那么有用,因為您通常會想到另一種更簡單的方式來執行您正在執行的事情&#xff0…

android 自定義actionbar,如何讓android的actionbar浮動且透明

如上圖所示,谷歌地圖的actionbar是透明的,且浮動在整個布局之上,沒有占用布局空間。其實要做到這樣的效果,我們首先想到的是兩個方面:1.將讓actionbar浮動起來。2.給actionbar一個背景,可以為顏色也可以為圖…

CentOS 7安裝redis及php擴展

安裝remi源 # wget http://rpms.famillecollet.com/enterprise/remi-release-7.rpm # rpm -Uvh remi-release-7.rpm # sed -i -e "s/enabled1/enabled0/g" /etc/yum.repos.d/remi.repo 確認使用remi源時安裝的Redis版本。 安裝Redis 使用remi源yum安裝Redis。 # yum …