實現得分的PrefixQuery

2021-08-28 01:57:32 字數 1637 閱讀 8459

(先宣告一下,我使用的lucene的版本是lucene4.7.2)

在lucene中,有一種型別的query叫做multitermquery,故名思議,他是要涉及到很多個term的query,比如我們常用的wildcardquery、fuzzyquery、prefixquery、termrangequery、numericrangequery等,他們都是需要按照乙個或者多個term按照一定的邏輯找到多個term,然後再重寫由找到的這些term形成的termquery進入乙個新的query(比如booleanquery、或者constantscorequery),但是有個一指的注意的地方是:有些multitermquery是不得分的,也就是在返回的時候不會按照得分排序,比如prefixquery,的不得分是由每個multitermquery使用的rewritemethod指定,也就是由重寫規則指定。本文的目的不在於討論重寫規則,而是想實現乙個可以得分的prefixquery(業務場景是我們要使用prefixquery做搜尋框中提示詞的排序,所以必須實現得分)。

實現原理很簡單,在指定重寫規則的時候將重寫規則指定為得分的規則(當然這裡涉及到重寫規則的實現,這裡本文不討論),在org.apache.lucene.search.multitermquery類中含有scoring_boolean_query_rewrite這個重寫規則從他的名字中就可以理解是封裝為乙個booleanquery,並且計算分數。他的邏輯很簡單,將搜尋到的多個termquery封裝成乙個booleanquery,每乙個termquery都是optional的,也就是對多個termquery取並集。但是booleanquery有個需要注意的地方,他不能有太多的clause,不然會報錯,預設是1024個,所以我們需要修改這個值,做到這裡就算是完成了。我的**如下:

/**

* 由於solr自帶的prefixquery是不得分的,不能滿足提示詞的排序要求,所以重寫這個query.

*/public class scoredprefixquery extends prefixquery

public scoredprefixquery(term prefix)

/*** 從詞典表中得到字首匹配的term的方法

*/@override

public termsenum gettermsenum(terms terms, attributesource atts) throws ioexception

return new prefixtermsenum(tenum, getprefix().bytes()) else

return null;}}

}; }

public int getlimit()

//做測試用的

public void setlimit(int limit)

//這個測試的前提是我們在索引中僅僅儲存了只有id域的100個document,id為從0-99,省略了建立索引的**。

public static void main(string args) throws ioexception

system.out.println(td.scoredocs.length);

} }

這樣就完成了得分的字首匹配的query,如果要在solr中使用,還需要自己定義queryparser的外掛程式,這個留在以後再寫部落格。

C 實現天梯得分排行演算法

1.使用c 實現天梯積分排行簡單演算法 給出一組使用者和使用者積分,給出排行榜。2.實現原理 簡單排序的思想,就不多說了。3.實現 include include define max 100 define min 0 int main void int juni max 2 int count 0...

1102 得分最高的路徑

題目描述 給你乙個 r 行 c 列的整數矩陣 a。矩陣上的路徑從 0,0 開始,在 r 1,c 1 結束。路徑沿四個基本方向 上 下 左 右 展開,從乙個已訪問單元格移動到任一相鄰的未訪問單元格。路徑的得分是該路徑上的 最小 值。例如,路徑 8 4 5 9 的值為 4 找出所有路徑中得分 最高 的那...

計算歌手的最後得分一

1.5.檔名稱 7.完成日期 2013年 11月13日 8.版本號 v0.1 9.對任務及求解方法的描述部分 10.輸入描述 無 11.問題描述 12.程式輸入 13.程式輸出 14.問題分析 15.演算法設計 16.17.我的程式 include using namespace std doubl...