Lucene4 3開發之插曲之烽火連城

2021-09-01 19:35:42 字數 1783 閱讀 1944

[url]

[/size][/color][/b]

[b][color=green][size=x-large]上次散仙給大家總結了lucene中,一些常用filter的用法和例子,今天,我們在來看下不在filter家族中的乙個特殊的filter,屬於lucene捐贈模組的特殊包中的類duplicatefilter,這個filter的作用是用來對某個字段進行去重操作的,類似資料庫中的distinct關鍵字,可以實現對某個列的結果集去重,這個去重的字段,一般情況下是不建議分詞的,因為分詞後,可能去重效果不準確.[/size][/color][/b]

[b][color=green][size=x-large]舉個例子,來說明分詞後去重,會造成什麼情況,假如我們的索引name一列中有中國,和偉大的中國,那麼就對這個name列去重後,就會發現lucene只保留了偉大的中國這個字段,為什麼呢?因為切詞後偉大的中國會被分成偉大|的|中國,進行去重時,lucene認為中國是重複的,而偉大的中國是不重複的,又因為偉大的中國裡包含中國,所以最後的結果就會只保留偉大的中國,而沒有中國。所以無論使用這個過濾器去重,還是使用grouping或fact去重,大多數情況下操作的字段是不能分詞的,這一點需要注意![/size][/color][/b]

[b][color=green][size=x-large]下面我們來具體看下duplicatefilter這個特殊的過濾器,怎麼使用。在這之前我們先來看下我們簡單的測試資料.[/size][/color][/b]

name===type

a===>中國

a===>法國

b===>中國

c===>英國

d===>英國

b===>英國

[b][color=green][size=x-large]分別對對name和type去重後的效果(注意一次只能去重乙個字段)[/size][/color][/b]

acd

b

法國中國

英國

[b][color=green][size=x-large]下面給出具體的**實現,需要額外匯入的包[/size][/color][/b]

org.apache.lucene.sandbox.queries

[b][color=green][size=x-large]核心**[/size][/color][/b]

//**流 324714439

//string field="name";

string field="type";

duplicatefilter filter=new duplicatefilter(field);//去重過濾

query q=new matchalldocsquery();//對所有結果去重

topdocs s=search.search(q, filter, 100);

[b][color=olive][size=x-large]可以看出,核心的**量很少,卻可以高效的完成去重工作,去重技術在我們的實際運用中也是一項很常用的技術,有時候我們可能只需要檢視不重複的記錄,而沒有一些類似統計的功能,如果需要去重並統計個數,那麼就需要使用分組功能或分面功能了,當然,如果我們只需要簡單的對字段去重,那麼就可以使用duplicatefilter簡潔高效的來完成這項任務。[/size][/color][/b]

[url]

[/size][/color][/b]

Lucene4 3開發之插曲之斗轉星移

b size x large url 謝謝配合 size b b size x large color green 散仙在上篇文章中,總結了幾個lucene的特殊的分詞需求,以及怎麼定製我們自己的tokenizer和analyzer用來處理他們,那麼本篇我們依舊是分析使用者需求 哈哈,也不算是使用者...

Lucene4 3開發之第五步之融丹築基 五

url color size b b color green size x large 那麼,本篇散仙就來看下我們在lucene中怎麼使用其豐富的排序功能。size color b b color green size x large 在這之前,我們先來熟悉下lucene中排序的基本知識,在預設情況...

Lucene之AttributeImpl原始碼簡單

一 簡單介紹 attribute介面是乙個空介面 attributeimpl也繼承attribute介面 根據原始碼是 記錄物件的屬性,但是不包含靜態屬性 對於一些屬性是attribute是介面,然後attributeimpl去實現介面。例如 offsetattribute 和 offsetattr...