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也有关。

抑或说,是我搜索时用词的姿势不对。

 

posted on 2015-07-16 22:53  amojry  阅读(812)  评论(0编辑  收藏  举报