因为项目中,需要全文检索,于是用到了compass,第一次用到这个东西、一头雾水,经过简单测试得到如下结论:
@Override
public List<Book> searchBooks(String queryString) {
List<Book> books = new ArrayList<Book>();
Compass compass = compassTemplate.getCompass();
CompassSession session = compass.openSession();
//CompassTransaction tx = session.beginLocalTransaction();
//System.out.println(queryString);
/*
* 查询任意个属性
* */
// CompassQueryBuilder queryBuilder=session.queryBuilder();
// CompassBooleanQueryBuilder boolQuery=queryBuilder.bool();
// boolQuery.addShould(queryBuilder.queryString("author:"+queryString).toQuery());
// boolQuery.addShould(queryBuilder.queryString("content:"+queryString).toQuery());
// CompassHits hits = boolQuery.toQuery().hits();
//
/*
* 查询一个属性
*
*/
//CompassHits hits = session.queryBuilder().queryString("content:"+queryString).toQuery().hits();
//System.out.println("length:"+hits.length());
/*
* 查询所有属性
*
*/
CompassHits hits = session.queryBuilder().queryString(queryString).toQuery().hits();
for(int i=0;i<hits.length();i++){
Book book = (Book)hits.data(i);
books.add(book);
}
//tx.commit();
return books;
}
参考资料:
CompassQueryBuilder queryBuilder=session.queryBuilder();
CompassBooleanQueryBuilder boolQuery=queryBuilder.bool();
//必须匹配
boolQuery.addMust(queryBuilder.queryString(type+":"+queryString).toQuery());
//必须不匹配
boolQuery.addMustNot(queryBuilder.queryString(type+":"+queryString).toQuery());
//或者匹配 也许没有
boolQuery.addShould(queryBuilder.queryString(type+":"+queryString).toQuery());
假如 Book 对象还有很多其它的属性, 现在要求页面输入的关键字只在 title 和 desc 中查询,
我使用
queryBuilder.bool() //
.addShould(queryBuilder.term("title", keywords)) //
.addShould(queryBuilder.term("desc", keywords)) //
.toQuery();
这样有一个问题:
关键字 "技术 实践", 不会匹配 "核心技术最佳实践"
使用
queryBuilder.queryString(keywords)
.toQuery();
这样才可以, 不过这样就是查询所有的属性了
-----------------------------------------------------------------------------------------------------------------------------------
session.queryBuilder()返回CompassQueryBuilder的对象,再调用queryString来查询搜索字串。可这个构造字串就有学问了:“titleIndex:学习”表示指明字段名搜索,如果想指明多个字段呢可以用空格和“+”隔开如:“titleIndex:学习 +contentIndex:第”
注意:查询字串里的标识不是对象的属性,而是对象的属性映射成索引的名字,这个是可以在Article.cmp.xml里看到的。还有就是一定要在两个搜索内容之间加空格要不然什么都搜不到。
addSort就是对搜索出的结果按一定的顺序排序。
Hits()呢就是返回hits结果集吧。
最后用个for循环利用hits.data(i)将结果遍历输出。