溫馨提示×

溫馨提示×

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

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

lucene4.7排序方法怎么使用

發(fā)布時間:2021-12-23 09:12:51 來源:億速云 閱讀:133 作者:iii 欄目:互聯(lián)網(wǎng)科技

這篇文章主要介紹“l(fā)ucene4.7排序方法怎么使用”,在日常操作中,相信很多人在lucene4.7排序方法怎么使用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”lucene4.7排序方法怎么使用”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

在這之前,我們先來熟悉下lucene中排序的基本知識,在默認情況下,Lucene使用的是以關聯(lián)性降序的方式為默認的排序方式,這樣可以使得我們搜索的結(jié)果通常是最優(yōu)的,因為它會盡可能的使得首先出現(xiàn)的幾個結(jié)果是與我們搜索的內(nèi)容最相關,而不需要我們翻頁尋找我們最想要的內(nèi)容,這一點是與數(shù)據(jù)庫相比,是全文檢索一個很大的優(yōu)點。當然,在實際開發(fā)中我們也需要根據(jù)業(yè)務的實際情況來給我們的客戶提供多種不同的排序方式。我們先來看下在Lucene中比較特殊的兩種基本的排序方式 

Sort里的屬性SortField里的屬性含義
Sort.INDEXORDERSortField.FIELD_DOC按照索引的順序進行排序
Sort.RELEVANCESortField.FIELD_SCORE按照關聯(lián)性評分進行排序

我們再來看幾個檢索時需要用的方法

 =========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對象構(gòu)造方法默認是按文檔評分排序
  public Sort(SortField field);//排序的一個SortField
  public Sort(SortField... fields)//排序的多個SortField可以傳入一個數(shù)組
 
  =========IndexSearche類r========
//query是查詢的Query對象 filter是過濾  n返回的數(shù)量  sort是排序
search(Query query, Filter filter, int n, Sort sort) 
//doDocScores 為true情況下每個命中的結(jié)果下都會被評分
//doMaxScore  為true情況下對最大分值的搜索結(jié)果進行評分
search(Query query, Filter filter, int n, Sort sort, boolean doDocScores, boolean doMaxScore)

1,在還沒有進行一點排序前我們先來看下索引里的內(nèi)容,核心代碼如下:

        TopDocs topDocs=searcher.search(new MatchAllDocsQuery(),10000);

lucene4.7排序方法怎么使用

2,使用默認的關聯(lián)性評分后,核心代碼和運行效果圖如下:

   Sort sort=new Sort();//默認使用關聯(lián)性評分
             TopDocs topDocs=searcher.search(new MatchAllDocsQuery(),10000,sort);

lucene4.7排序方法怎么使用

關于上圖中亂碼字符原因是因為默認排序情況下lucene是不會對搜索結(jié)果進行評分操作的,因為評分操作會降低性能,所以關于score的那一列返回的是NAN的字符串,出于格式的需要,散仙在用DecimalFormat類給其評分結(jié)果保留2位小數(shù)時,因為是一個特殊字符,所以就出現(xiàn)了上圖情況。 

3,按照日期降序排序,,核心代碼和運行效果圖如下:

 Sort sort=new Sort(new SortField("date", Type.INT,true));//true為降序排列
             TopDocs topDocs=searcher.search(new MatchAllDocsQuery(),10000,sort);

lucene4.7排序方法怎么使用

4,按照價格升序排序,,核心代碼和運行效果圖如下:

 Sort sort=new Sort(new SortField("price", Type.DOUBLE,false));//false為降序排列
             TopDocs topDocs=searcher.search(new MatchAllDocsQuery(),10000,sort);

lucene4.7排序方法怎么使用

5,多字段排序,按照日期降序的情況下,因為id為7和8的日期相同,所以我們就新增一個排序字段按ename升序排列,,核心代碼和運行效果圖如下:

 // Sort sort=new Sort(new SortField("date", Type.INT, true),new SortField("ename", Type.STRING, false));
            //這兩段代碼效果一樣
            Sort sort=new Sort(new SortField[]{new SortField("date", Type.INT, true),new SortField("ename", Type.STRING, false)});
             TopDocs topDocs=searcher.search(new MatchAllDocsQuery(),10000,sort);

lucene4.7排序方法怎么使用

6,帶評分的排序,注意后面兩個布爾類型的變量可以控制是否評分,特別是在沒有要求需要打分時,建議別開啟,大數(shù)量時對性能影響較大,檢索“編程”得到的結(jié)果,默認按評分降序排序,核心代碼和運行效果圖如下:

    Sort sort=Sort.RELEVANCE;
            TopDocs topDocs=searcher.search(new TermQuery(new Term("bookname", "編程")),null,100,sort,true,true);

lucene4.7排序方法怎么使用

上面的編程,編程因為在切分時編程的tf出現(xiàn)了2次,所以在查詢時有較高的得分,所以排在首位。 

7,注意幾點 
(1)排序?qū)σ粋€文檔里什么域都沒存儲,使用字符串排序會排在首位 
(2)排序?qū)σ粋€文檔里什么域都沒存儲,使用數(shù)字類型排序會默認給其賦值為0進行排序 
(3)我們可以對數(shù)字類型的null值的文檔進行代碼控制,可以將其設置為最大,所以將會排在最后面,代碼如下

 SortField sortField = new SortField("value", SortField.Type.INT);
    sortField.setMissingValue(Integer.MAX_VALUE);

到此,關于“l(fā)ucene4.7排序方法怎么使用”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細節(jié)

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

AI