`
smz11smz
  • 浏览: 16536 次
社区版块
存档分类
最新评论

compass搜索

阅读更多

compass搜索
2011年07月01日
  compass对于lucene就像hibernate对于jdbc一样,使用方法和hibernate差不多。
  Hibernate/LopLink/JPA (ORM)
  compass OSEM(Object/Search Engine Mapping)
  使用方法:
  1、导入所需要的包:
  dist/commons-logging.jar
  dist/compass-2.2.0.jar
  dist/lucene/lucene-analyzers.jar
  dist/lucene/lucene-core.jar
  dist/lucene/lucene-highlighter.jar
  dist/lucene/lucene-queries.jar
  dist/lucene/lucene-snowball.jar
  dist/lucene/lucene-spellchecker.jar
  2、使实体与数据区document 一一映射
  这里使用注解的方式:
  @Searchable 设置这个类存储到document
  @SearchableId 搜索实体的标识属性。
  @SearchableProperty 用于普通属性 将java类的属性映射到lucene的document中的field。
  (index:设置是否需要分词或建索引 
  Index.NOT_ANALYZED 不分词但建立索引
  Index.ANALYZED 分词并建立索引 
  Index.NO 
  store:是否将值存储 eg: Store.YES 
  boost :设置属性在索引中的重要性 越大级别越高 默认为1)
  @SearchableComponent 用于复合类型的属性。
  在引用类型的类上设置 在引用类中 Searchable(root =false)
  如果引用的名称和其它的相同,比如都是name,要设置name值,name=typename
  @SearchableReference 
  3、保存索引
  在hibernate中我们使用sessionfactory管理session 使用session来保存修改删除实体。这里也类似
  我们首先创建一个compass 管理CompassSession 使用CompassSession 来保存修改删除实体。
  public class ProductSearchBean{
  private Compass compass = null;
  public ProductSearchBean(){
  try {
  //编程式配置
  compass = new CompassAnnotationsConfiguration()
  .setSetting(CompassEnvironment.CONNECTION, " file://indexfile")
  //.setSetting(CompassEnvironment.CONNECTION, "ram://index")//在内存中建立索引
  .setSetting("compass.engine.highlighter.default.fo rmatter.simple.pre","")
  .setSetting("compass.engine.highlighter.default.fo rmatter.simple.post","")//设置高亮为红色
  .addScan("cn.itcast.bean").buildCompass();//在cn.itcast.bean包下面搜索包含compass注解的类
  } catch (Exception e) {
  e.printStackTrace();
  }
  }
  //创建索引,compass支持增量索引.
  public void buildIndex(){
  CompassSession session = null;
  CompassTransaction tx = null;
  try {
  session = compass.openSession();
  tx = session.beginTransaction();
  Product p1 = new Product(12,"c瑜珈球","非常好的瑜珈球",12f, "www", 2, 12); //新建一个产品
  session.create(p1);
  Product p2 = new Product(35,"b瑜珈球","天花板瑜珈球,good",42f, "mmm",2,9);
  session.create(p2);
  Product p3 = new Product(8,"a蓝球瑜珈球","蓝球小子",125f, "ppp",5,8);
  session.create(p3);
  tx.commit();
  } catch (CompassException e) {
  e.printStackTrace();
  tx.rollback();
  }finally{
  if(session!=null && !session.isClosed()) session.close();
  }
  }
  // 删除索引,session. session.delete(product);
  //更新就是先删除再创建。
  //查询 QueryResult 是自己写的一个分页的结果集类,有属性List resultlist; long totalrecord 
  public QueryResult search(String keyword, int firstIndex, int maxResult) {
  QueryResult qr = new QueryResult();
  CompassSession session = null;
  CompassTransaction tx = null;
  try {
  session = compass.openSession();
  tx = session.beginTransaction();
  //对所有索引Field进行搜索,你也可以指定对某个Field搜索,如:"name:jack",如果想指定多个字段可以用空格和"+"隔开如"name:jack +content:xxx"
  CompassHits hits = session.find(keyword);
  List products = new ArrayList();
  //下面length表示某页内容的最大id值
  int length = firstIndex+ maxResult;
  if(length>hits.length()) length = hits.length(); 
  for(int i=firstIndex; i search(String keyword, Integer typeid, int firstIndex, int maxResult) {
  QueryResult qr = new QueryResult();
  CompassSession session = null;
  CompassTransaction tx = null;
  try {
  session = compass.openSession();
  tx = session.beginTransaction();
  //查询指定类别的匹配记录,并按position字段 降序排序
  CompassQueryBuilder queryBuilder = session.queryBuilder();
  CompassHits hits = queryBuilder.bool()
  .addMust(queryBuilder.spanEq("typeid", typeid))
  .addMust(queryBuilder.queryString(keyword).toQuery ())
  .toQuery().addSort("position", SortPropertyType.FLOAT, SortDirection.REVERSE)
  .hits();//类似于这个sql: typeid=1 and (xxxx like ?) order by positoin desc
  List products = new ArrayList();
  int length = firstIndex+ maxResult;
  if(length>hits.length()) length = hits.length(); 
  for(int i=firstIndex; i
  
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics