方法spa
1 public static Query TermWeighting(Query tquery,Map<String,Float>term2weight){ 2 BooleanQuery nquery = new BooleanQuery(); 3 Set<Term> terms = new HashSet<Term>(); 4 tquery.extractTerms(terms);
5 for(Term itr : terms){ 6 float weight = term2weight.get(itr.text()); 7 Query q = new TermQuery(new Term(itr.field(), itr.text())); 8 q.setBoost(weight); //設置權重 9 nquery.add(q, BooleanClause.Occur.SHOULD); 10 } 11 return nquery; 12 }
傳入參數說明:code
背景對象
近期搜索:lucene如何設置query中不一樣term權重,瀏覽了不下百個頁面和解答。blog
使用最多的搜索詞組合如標題:Lucene Query Term Weighting文檔
獲得的信息大體以下get
一、 對lucene的score公式的說明:也就是在假設query中term的tf都爲1,新的query不列入df的計算,而後推導出一個vsm下的文檔之間的cosine similarity;it
二、 lucene如何在index階段給不一樣的Document.setBoost, index或檢索階段給Filed.setBoost,以及檢索階段給Query.setBoostclass
吐槽1: 對於剛開始接觸lucene的同窗,對Query.setBoost <--- TermQuery.setBoost時略微有些迷茫的;搜索
吐槽2: 額外, Clause的概念讓人有些迷茫,爲什麼不直接叫QueryTerm這種呢?float
三、 對於TermWeight樹的解釋,基本同1;
亂入
上述都不能很好的解答個人需求,連stackoverflow中有些問答也是。
但,這跟初學者沒有熟識lucene也有關。
抑或說,是我搜索時用詞的姿式不對。