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

2021-09-01 19:15:44 字數 4026 閱讀 2840

[url]

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

[b][color=green][size=x-large]那麼,本篇散仙就來看下我們在lucene中怎麼使用其豐富的排序功能。[/size][/color][/b]

[b][color=green][size=x-large]在這之前,我們先來熟悉下lucene中排序的基本知識,在預設情況下,lucene使用的是以關聯性降序的方式為預設的排序方式,這樣可以使得我們搜尋的結果通常是最優的,因為它會盡可能的使得首先出現的幾個結果是與我們搜尋的內容最相關,而不需要我們翻頁尋找我們最想要的內容,這一點是與資料庫相比,是全文檢索乙個很大的優點。當然,在實際開發中我們也需要根據業務的實際情況來給我們的客戶提供多種不同的排序方式。我們先來看下在lucene中比較特殊的兩種基本的排序方式

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

[b][size=x-large]

[table]

|sort裡的屬性|sortfield裡的屬性|含義

|sort.indexorder|sortfield.field_doc|按照索引的順序進行排序

|sort.relevance|sortfield.field_score|按照關聯性評分進行排序

[/table][/size][/b]

[b][size=x-large]我們再來看幾個檢索時需要用的方法[/size][/b]

*****====sortfield類**********==

//field是排序欄位type是排序型別

public sortfield(string field, type type);

//field是排序欄位type是排序型別reverse是指定公升序還是降序

//reverse 為true是降序 false為公升序

public sortfield(string field, type type, boolean reverse)

*****====sort類**********==

public sort();//sort物件構造方法預設是按文件評分排序

public sort(sortfield field);//排序的乙個sortfield

public sort(sortfield... fields)//排序的多個sortfield可以傳入乙個陣列

*****====indexsearche類r*****===

//query是查詢的query物件 filter是過濾 n返回的數量 sort是排序

search(query query, filter filter, int n, sort sort)

//dodocscores 為true情況下每個命中的結果下都會被評分

//domaxscore 為true情況下對最大分值的搜尋結果進行評分

search(query query, filter filter, int n, sort sort, boolean dodocscores, boolean domaxscore)

[b][color=green][size=x-large]1,在還沒有進行一點排序前我們先來看下索引裡的內容,核心**如下:[/size][/color][/b]

topdocs topdocs=searcher.search(new matchalldocsquery(),10000);

[img]

[b][color=green][size=x-large]2,使用預設的關聯性評分後,核心**和執行效果圖如下:[/size][/color][/b]

sort sort=new sort();//預設使用關聯性評分

topdocs topdocs=searcher.search(new matchalldocsquery(),10000,sort);

[img]

[b][color=green][size=x-large]關於上圖中亂碼字元原因是因為預設排序情況下lucene是不會對搜尋結果進行評分操作的,因為評分操作會降低效能,所以關於score的那一列返回的是nan的字串,出於格式的需要,散仙在用decimalformat類給其評分結果保留2位小數時,因為是乙個特殊字元,所以就出現了上圖情況。[/size][/color][/b]

[b][color=green][size=x-large]3,按照日期降序排序,,核心**和執行效果圖如下:[/size][/color][/b]

sort sort=new sort(new sortfield("date", type.int,true));//true為降序排列

topdocs topdocs=searcher.search(new matchalldocsquery(),10000,sort);

[img]

[b][color=green][size=x-large]3,按照**公升序排序,,核心**和執行效果圖如下:[/size][/color][/b]

sort sort=new sort(new sortfield("price", type.double,false));//false為降序排列

topdocs topdocs=searcher.search(new matchalldocsquery(),10000,sort);

[img]

[b][color=green][size=x-large]4,多欄位排序,按照日期降序的情況下,因為id為7和8的日期相同,所以我們就新增乙個排序欄位按ename公升序排列,,核心**和執行效果圖如下:[/size][/color][/b]

// sort sort=new sort(new sortfield("date", type.int, true),new sortfield("ename", type.string, false));

//這兩段**效果一樣

sort sort=new sort(new sortfield);

topdocs topdocs=searcher.search(new matchalldocsquery(),10000,sort);

[img]

[b][color=green][size=x-large]5,帶評分的排序,注意後面兩個布林型別的變數可以控制是否評分,特別是在沒有要求需要打分時,建議別開啟,大數量時對效能影響較大,檢索「程式設計」得到的結果,預設按評分降序排序,核心**和執行效果圖如下:[/size][/color][/b]

sort sort=sort.relevance;

topdocs topdocs=searcher.search(new termquery(new term("bookname", "程式設計")),null,100,sort,true,true);

[img]

[b][color=green][size=x-large]上面的程式設計,程式設計因為在切分時程式設計的tf出現了2次,所以在查詢時有較高的得分,所以排在首位。[/size][/color][/b]

[b][color=green][size=x-large]6,注意幾點

(1)排序對乙個文件裡什麼域都沒儲存,使用字串排序會排在首位

(2)排序對乙個文件裡什麼域都沒儲存,使用數字型別排序會預設給其賦值為0進行排序

(3)我們可以對數字型別的null值的文件進行**控制,可以將其設定為最大,所以將會排在最後面,**如下

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

sortfield sortfield = new sortfield("value", sortfield.type.int);

sortfield.setmissingvalue(integer.max_value);

[url],謝謝合作。

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

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

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

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

url size color b b color green size x large 上次散仙給大家總結了lucene中,一些常用filter的用法和例子,今天,我們在來看下不在filter家族中的乙個特殊的filter,屬於lucene捐贈模組的特殊包中的類duplicatefilter,這個f...

第五模組 WEB開發基礎之DOM

dom document object model 文件物件模型 js中物件分為三種 1.使用者定義物件 2.內建物件 array date math 3.宿主物件 window 將dom看做一顆樹.dom把文件看作一顆家譜樹.在html中,標籤就是dom物件,這些dom物件又構成了家譜樹 節點樹 ...