建立lucene時document欄位屬性的選擇

2021-08-27 15:31:42 字數 2465 閱讀 6046

在建立索引檔案的時候,不知道會不會有下面的疑惑:

1)document欄位設定成什麼型別?

2)採用什麼分詞器?

3)欄位的權重設定成多少等?

這些也許都是我們在建立索引檔案中經常會遇到的問題,這篇就主要說一下自己關於第乙個問題的理解

此篇是以 lucene 4.3.1 為事例,其他版本類似:

個人認為,我們在建立document物件的時候,對於以後可能用於使用者搜尋的字段,我們在建立索引的時候必須對該字段值進行分詞處理;對於那些只做儲存的字段,就可以只簡單的儲存一下即可,不需要分詞,也不需要檢索;對於那些需要整體考慮字段,就不能採取分詞。下面就簡單的看下document的api:

對於那種已經有明確的型別的字段可以設定成 intfield、floatfield、longfield等,這種字段型別就像api中說的一樣,可以高效的處理過濾和排序。如果索引檔案中,某些欄位是用來排序或者索引的,那這種型別應該是不錯的選擇。stringfield 是將屬性值當做乙個整體,並不對其做分詞操作,但是可以做檢索。storedfield 只是將屬性值做簡單的儲存,並不參與搜尋、過濾和排序等操作,只是在查詢索引時能通過indexsearcher.doc(int) 或 indexreader.document(int, org.apache.lucene.index.storedfieldvisitor)  取得對應的字段值。textfield 型別主要用於根據使用者輸入詞進行搜尋的字段,這裡就牽扯到分詞器的選擇。

這裡就簡單的說一下自己對分詞器選擇的理解。選擇何種分詞器使用者的搜尋效果才更好,這個主要根據產品的特點(也許有人會說,這不等於白說嘛)。舉個簡單的例子:前幾天自己給人民網新聞和論壇做了乙個站內搜尋,對於新聞這種資訊的搜尋,個人理解最大的就是對人名或者事件的搜尋,如果分詞器可以準確的處理出人名,那對搜尋結果應該會有很大的提公升,但是現在主流的幾個分詞器都沒有關於人名的處理或者沒有全面的處理,所以自己只能去修改ikanalyzer分詞器,讓其可以準確的處理人名。這樣,使用者搜尋出的結果質量就有很大的提高(和ikanalyzer分詞器相比),也就是說要根據自己產品的特點去選擇或者修改現有的分詞器。最後說乙個,在建立索引和對使用者搜尋詞分詞的時候,盡量使用同乙個分詞器。

下面就舉乙個簡單的例項:

/**  

*@description: document與各個類(資料結構)之間的轉換

*/ package cn.yicha.novel.search.util;

import org.apache.lucene.document.document;

import org.apache.lucene.document.intfield;

import org.apache.lucene.document.storedfield;

import org.apache.lucene.document.stringfield;

import org.apache.lucene.document.textfield;

import org.apache.lucene.document.field.store;

import cn.yicha.novel.search.model.novelindex;

public class parsedocument

document doc = new document();

//storedfield

if (novelindex.getsourcesite() != null)

if (novelindex.getchapterlist() != null)

//stringfield

if (novelindex.getupdatetime() != null)

if (novelindex.getauthor() != null)

if (novelindex.getname() != null)

if (novelindex.gettype() != null)

if (novelindex.getnid() != null)

//intfield

if (novelindex.getchaptercount() != -1)

if (novelindex.getstate() != -1)

//textfield

if (novelindex.getdescription() != null)

if (novelindex.getkeywords() != null)

return doc;

}}

這就是自己現在測試專案中的乙個用到的乙個具體例項,當然細節還有待進一步的驗證與調整。

具體的業務就只對 keywords 和 description 這兩個欄位做分詞搜尋,所以也就只有這兩個字段採用 textfiled 型別,其他欄位都根據具體的業務選擇了對應的型別。

Lucene 建立索引

public class indexer public static string indexdir d luceneindex public static void main string args system.out.println 被索引的文件個數 writer.numdocs catch ...

lucene 建立IndexWriter物件

indexwriter物件主要包含以下幾方面的資訊 用於索引文件 directory directory 指向索引資料夾 analyzer analyzer 分詞器 similarity similarity similarity.getdefault 影響打分的標準化因子 normalizatio...

Lucene之建立索引

lucene用來建搜尋引擎要解決四個問題 抓取資料 解析資料 建立索引和執行搜尋。首先為每一篇文章新增標題 內容 寫作時間等資訊,從而寫好每一篇文章,然後將每一篇文章新增到書裡面去。這樣問及就寫好了。建立索引的過程如下 建立索引器indexwriter,這相當於一本書的框架。建立文件物件docmen...