在Field级别上设置boost并存储在索引上好像不是很灵活,一旦索引建成无法修改。
感觉比较灵活的方式是存储建索引的时候并不设置boost,在检索创建过滤器的时候在Query上设置boost是个好办法。
Query qTitle = IKQueryParser.parse("title", "中文分词工具包");
qTitle.setBoost((float)100);
Query qBody = IKQueryParser.parse("body", "好好学习");
qBody.setBoost((float)50);
BooleanQuery bq = new BooleanQuery();
bq.add(qTitle, BooleanClause.Occur.SHOULD);
bq.add(qBody, BooleanClause.Occur.SHOULD);
TopDocs docs = searcher.search(bq, null, 100000);
System.out.println("HITS:"+docs.totalHits);
for(int i = 0; i< docs.totalHits;i++){
ScoreDoc s_doc = docs.scoreDocs[i];
Document doc = searcher.doc(s_doc.doc);
System.out.println(doc.get("id"));
}
实际上是把每个检索字段分别建立一个Query,然后在Query上设置boost。
最后建立一个BooleanQuery,把所有Query合并进去。
合并的时候需要设置检索的合并关系:
有三种:
BooleanClause.Occur.MUST
BooleanClause.Occur.MUST_NOT
BooleanClause.Occur.SHOULD
它们的组合关系代表的意思如下:
1、MUST和MUST表示“与”的关系,即“并集”。
2、MUST和MUST_NOT前者包含后者不包含。
3、MUST_NOT和MUST_NOT没意义
4、SHOULD与MUST表示MUST,SHOULD失去意义;
5、SHOUlD与MUST_NOT相当于MUST与MUST_NOT。
6、SHOULD与SHOULD表示“或”的概念。