`
wjjbfq
  • 浏览: 80214 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

compass搜索

阅读更多

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.formatter.simple.pre","<font color='red'>")
   .setSetting("compass.engine.highlighter.default.formatter.simple.post","</font>")//设置高亮为红色
   .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<T> resultlist; long totalrecord

public QueryResult<Product> search(String keyword, int firstIndex, int maxResult) {
  QueryResult<Product> qr = new QueryResult<Product>();
  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<Product> products = new ArrayList<Product>();

//下面length表示某页内容的最大id值
    int length = firstIndex+ maxResult;
    if(length>hits.length()) length = hits.length();   
   

for(int i=firstIndex; i<length; i++){
     Product product = (Product)hits.data(i);

//高亮显示
     product.setContent(hits.highlighter(i).fragment("content"));


     products.add(product);
    }


    qr.setResultlist(products);
    qr.setTotalrecord(hits.length());
    hits.close();
  } catch (CompassException e) {
   e.printStackTrace();
   tx.rollback();
  }finally{
   if(session!=null && !session.isClosed()) session.close();
  }
  return qr;
 }
 //多样查询
 public QueryResult<Product> search(String keyword, Integer typeid, int firstIndex, int maxResult) {
  QueryResult<Product> qr = new QueryResult<Product>();
  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<Product> products = new ArrayList<Product>();
    int length = firstIndex+ maxResult;
    if(length>hits.length()) length = hits.length();   
    for(int i=firstIndex; i<length; i++){
     Product product = (Product)hits.data(i);
     product.setContent(hits.highlighter(i).fragment("content"));
     products.add(product);
    }
    qr.setResultlist(products);
    qr.setTotalrecord(hits.length());
    hits.close();
  } catch (CompassException e) {
   e.printStackTrace();
   tx.rollback();
  }finally{
   if(session!=null && !session.isClosed()) session.close();
  }
  return qr;
 }

 

}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics