全文检索到了compass

 

        因为项目中,需要全文检索,于是用到了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)将结果遍历输出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值