关于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是必须存在的。
我们在搜索中可能会遇到要搜索索引文件中不同字段,不同字段之间就存在了与或非的运算关系,如:这个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是必须存在的。
相关文章推荐
- 【转载】关于BooleanQuery在搜索中的用处
- 关于BooleanQuery在搜索中的用处
- lucene-查询query->BooleanQuery “与或”搜索
- 关于全文搜索elasticsearch中matchQuery和termQuery的区别
- 关于全文搜索elasticsearch中matchQuery和termQuery的区别
- Linux下gcc编译中关于头文件与库文件搜索路径相关问题(一)
- 如何预测用户query意图 « 搜索技术博客-淘宝
- [转]Unix下针对邮件,搜索,网络硬盘等海量存储的分布式文件系统项目(关于GFS、MogileFS分布式文件系统邮件列表)
- 关于Boolean类型在flex与java中间传递的问题
- 调试用Python C API 写的程序问题还真多,关于import搜索路径的,复制过来,以防忘记
- 关于google搜索
- 关于@transactional注解的用处与意义
- TermQuery词条搜索
- 关于QT5 SQLITE中QSqlQuery::exec: database not open的问题的解决方法
- 如何在Lucene里面进行数字范围搜索 (Numeric Range Query)
- Lucene的数字范围搜索 (Numeric Range Query)原理
- 关于对搜索广告的几点看法
- 转载: Linux下gcc编译中关于头文件与库文件搜索路径相关问题
- 关于Google搜索技巧
- 关于Boolean类型在flex与java中间传递的问题