Lucene Query Term Weighting
方法
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 }
传入参数说明:
- tquery:经过QueryParser解析后的Query对象
- term2weight:计算好或人为设定的每个词的检索权重
背景
近期搜索:lucene如何设置query中不同term权重,浏览了不下百个页面和解答。
使用最多的搜索词组合如标题:Lucene Query Term Weighting
得到的信息大致如下
1、 对lucene的score公式的说明:也就是在假设query中term的tf都为1,新的query不列入df的计算,然后推导出一个vsm下的文档之间的cosine similarity;
2、 lucene如何在index阶段给不同的Document.setBoost, index或检索阶段给Filed.setBoost,以及检索阶段给Query.setBoost
吐槽1: 对于刚开始接触lucene的同学,对Query.setBoost <--- TermQuery.setBoost时略微有些迷茫的;
吐槽2: 额外, Clause的概念让人有些迷茫,为何不直接叫QueryTerm这种呢?
3、 对于TermWeight树的解释,基本同1;
乱入
上述都不能很好的解答我的需求,连stackoverflow中有些问答也是。
但,这跟初学者没有熟识lucene也有关。
抑或说,是我搜索时用词的姿势不对。
*******************************
***** Never ever let you down. *****
*******************************