您的位置:首页 > 产品设计 > UI/UE

关于BooleanQuery在搜索中的用处

2011-07-27 11:20 465 查看
关于BooleanQuery在搜索中的用处
我们在搜索中可能会遇到要搜索索引文件中不同字段,不同字段之间就存在了与或非的运算关系,如:这个xx字段中必须存在什么什么关键词,而另一个XXX字段可以存在或不存在什么什么关键词等等等。这就需要有BooleanQuery这个得到一个组合检索对象,进行组合检索了。

BooleanClause是在一个BooleanQuery中子句。该类中定义了一个静态最终内部类Occur定义了BooleanQuery的运算符:
public static final Occur MUST = new Occur("MUST"); // 与运算
public static final Occur SHOULD = new Occur("SHOULD"); // 或运算
public static final Occur MUST_NOT = new Occur("MUST_NOT"); // 非运算

例如:
public SearchObjects[] search(String path,String keyword, String type, int startIndex) {
// Date beginTime = new Date();
try {
Searcher searcher = new IndexSearcher(path);
// Analyzer aStandardAnalyzer = new StandardAnalyzer();
Analyzer aStandardAnalyzer = new StandardAnalyzer();
QueryParser parser = new QueryParser("title",aStandardAnalyzer);
parser.setDefaultOperator(QueryParser.OR_OPERATOR);// 设置检索的条件.OR_OPERATOR表示"或"
Query query = parser.parse(keyword);
QueryParser qp1 = new QueryParser("content", aStandardAnalyzer);// 检索content列
qp1.setDefaultOperator(QueryParser.OR_OPERATOR);// 设置检索的条件.OR_OPERATOR表示"或"
Query query1 = qp1.parse(keyword);
BooleanQuery m_BooleanQuery = new BooleanQuery();// 得到一个组合检索对象
if (type!=null && !type.equals("")){
QueryParser qp2 = new QueryParser("type", aStandardAnalyzer);// 检索type列
qp1.setDefaultOperator(QueryParser.OR_OPERATOR);// 设置检索的条件.OR_OPERATOR表示"或"
Query query2 = qp2.parse(type);
BooleanQuery bq = new BooleanQuery();
bq.add(query1,BooleanClause.Occur.SHOULD);
bq.add(query,BooleanClause.Occur.SHOULD);
m_BooleanQuery.add(bq, BooleanClause.Occur.MUST);
m_BooleanQuery.add(query2, BooleanClause.Occur.MUST);
}else{
m_BooleanQuery.add(query1,BooleanClause.Occur.SHOULD);
m_BooleanQuery.add(query,BooleanClause.Occur.SHOULD);
}
Hits hits = searcher.search(m_BooleanQuery);

SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter("<font color='red'>","</font>");
Highlighter highlighter = new Highlighter(simpleHTMLFormatter,new QueryScorer(query));
highlighter.setTextFragmenter(new SimpleFragmenter(100));

SearchObjects[] so = processHits(hits, startIndex, keyword,highlighter);
//processHits为自定义的method解析搜索结果
searcher.close();
return so;
} catch (CorruptIndexException e) {
} catch (IOException e) {
} catch (Exception e) {
}

return null;
}

例子中是先搜索title或content字段中的结果再与上type字段中的结果,即 ((title||content)&&type);
MUST 也可以理解为是必须的,而SHOULD可以理解为可有可无的,例子中先title和content是可有可无的,但两个中必须有一个存在,type是必须存在的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: