`

compass 小知识点

 
阅读更多

 今天发现排序不管事,

查了一下:索引的问题:排序的列不进行分词只进行索引,才可以。

 

 

我们在使用lucene管理document时,难免有些复杂,并且在做增量索引的时候会比较繁琐,现介绍compass如下:
compass对lucene的使用就如同Hibernate和对jdbc的使用。
Compass的使用步骤:
Hibernate的实现步骤是:
1》  设计实体
2》  配置映射元数据 (xml / 注解—Hibernate3才推出来的)
3》  利用Hibernate的api完成对实体的CURD
我们目前使用compass的操作步骤就与Hibernate的基本一样的:
Hibernate的第二步是映射到数据库,而compass是映射到收索引擎里面去。
1》  设计收索实体 – 就 是一个普通的javabean
你要写这么一个实体,定义一些属性,好比产品的id、名称
2》  配置映射元数据 – 针对收索引擎映射-我们采用主注解的方式
我们使用@Searchable 标注映射为收索实体,映射到Lucene中的document
假设是采用注解的形式,我们就需要在实体和属性上面加上一些注解
@Entity (映射到数据库中的表)
@Searchable  –> 这个注解把该类声明为搜索实体,映射到lucene中的document
Public class Product{
           @Id (Hibernate用来表示实体的标识属性)
           @SearchableId (compass标注为标识属性)
           Private Integer id;
           @Column()
           @SearchableProperty  à  映射搜索属性
           Private String name;
}
 
3>利用compass api完成对实体的添/删/查操作
  hibernate.cfg.xml / compass.cfg.xml 放在类路径下
hibernate: SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
Compass:   Compass compass = new CompassConfiguration().configure().buildCompass();
  SessionFactory == Compass
 
hibernate: Session session = sessionFactory.openSession();
compass:   CompassSession session = compass.openSession();
           Session = CompassSession
 
Hibernate:  session.beginTransaction();
compass:    session.beginTransaction();
 
Hibernate:  session.save(product)/persist();
compass:    session.save(product)/create();
 
Hibernate:  session.getTransaction().commit();
compass:    session.getTransaction().commit();
 
  session.close();
  sessionFactory.close();
 
         学习一下compass映射注解:常用的就5个
         @Searchable //告诉compass,将该类映射到lucene的Document
         注意注解如果标注在属性上只能标注在get方法上面
         @SearchableId //compass要求每个搜索实体类都要具有一个标识属性,这点和Hibernate相似
         @SearchableProperty(index=Index.NOT_ANALYZED ,store=Store.YES)// store的默认值为Store.YES
类别id不需要分词,蛋需要索引并存储
Index。UN_TOKENIZED 不对该field进行分词,但是要索引,该属性已过时,建议产用NOT__ANALYZED替换
Index.TOKENIZED:先分词后索引。该属性已过时,建议采用ANALYZED替换
Inde.NOT_ANALYZED 不分词,但建立索引
Index.ANALYZED 分词并且建立索引
 
@SearchableId Property(boost=2)//boost的默认值为1,用户设置属性在索引中的重要性
如下:
@Searchable //告诉compass,将该类映射到Lucene的Document
public class Product {
         private Integer id;
         private String name;
         private String content;
         private Float price;
         private String note;
         private Integer position;
         private Integer typeid;
        
         public Product(){}
        
         public Product(Integer id) {
                   this.id = id;
         }
 
         public Product(Integer id, String name, String content, Float price,String note,Integer typeid,Integer position) {
                   this.id = id;
                   this.name = name;
                   this.content = content;
                   this.price = price;
                   this.note = note;
                   this.typeid = typeid;
                   this.position = position;
         }
        
         @SearchableId //compass要求每个搜索实体类都要具有一个标识属性,这点和Hibernate相似
         public Integer getId() {
                   return id;
         }
         public void setId(Integer id) {
                   this.id = id;
         }
         //类别id不需要分词,但需要索引并储存
         //Index.UN_TOKENIZED:不对该Field进行分词,但是要索引.该属性已过时,建议采用NOT_ANALYZED替换
    //Index.TOKENIZED:先分词后索引。该属性已过时,建议采用ANALYZED替换
         //Index.NOT_ANALYZED:不分词,但建立索引
         //Index.ANALYZED :分词并且建立索引
        
         @SearchableComponent //关联的符合索引,专门用来标注复合类型
         那么被标注的这个属性对应的类,我们也要标注一下为收索实体,但是这个搜索实体他不是单独存在的,他只是最为产品搜索实体的一部分
@Searchable(root=false)
@SearchableProperty(index=Index.NO ,store=Store.YES)
         我们对他的主键不需要索引只需要存储
         当你存在双向关系的时候,并且需要引用会对应的实体,反指引用
         @SearchableReference
 
@SearchableProperty(index=Index.NOT_ANALYZED, store=Store.YES)//store的默认值为Store.YES
         public Integer getTypeid() {
                   return typeid;
         }
 
         public void setTypeid(Integer typeid) {
                   this.typeid = typeid;
         }
 
         @SearchableProperty(boost=2)//boost的默认值为1,用于设置属性在索引中的重要性
         public String getName() {
                   return name;
         }
         public void setName(String name) {
                   this.name = name;
         }
 
         @SearchableProperty
         public String getContent() {
                   return content;
         }
         public void setContent(String content) {
                   this.content = content;
         }
         //价格不需要进行搜索,但需要存储,如果没有存储,就需要从数据库中获取价格了
         @SearchableProperty(index=Index.NO)//store的默认值为Store.YES
         public Float getPrice() {
                   return price;
         }
         public void setPrice(Float price) {
                   this.price = price;
         }
         @SearchableProperty(store=Store.YES)
         public String getNote() {
                   return note;
         }
 
         public void setNote(String note) {
                   this.note = note;
         }
         @SearchableProperty(index=Index.NOT_ANALYZED, store=Store.YES)//store的默认值为Store.YES
         public Integer getPosition() {
                   return position;
         }
 
         public void setPosition(Integer position) {
                   this.position = position;
         }
        
        
}
 
 
我们不集成spring的编程配置和使用方式如下:
import java.util.ArrayList;
import java.util.List;
 
import org.compass.annotations.config.CompassAnnotationsConfiguration;
import org.compass.core.Compass;
import org.compass.core.CompassException;
import org.compass.core.CompassHits;
import org.compass.core.CompassQueryBuilder;
import org.compass.core.CompassSession;
import org.compass.core.CompassTransaction;
import org.compass.core.CompassQuery.SortDirection;
import org.compass.core.CompassQuery.SortPropertyType;
import org.compass.core.config.CompassEnvironment;
 
import cn.itcast.bean.Product;
import cn.itcast.bean.QueryResult;
import cn.itcast.compass.service.ProductSearch;
 
public class ProductSearchBean implements ProductSearch {
         private Compass compass = null;//-->SessionFactory
        
         public ProductSearchBean(){
                    try {
                             //编程式配置
                            compass = new CompassAnnotationsConfiguration()
                            .setSetting(CompassEnvironment.CONNECTION, "[url=file://indexfile]file://indexfile[/url]")
                            //.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();
                   } catch (Exception e) {
                            e.printStackTrace();
                   }
         }
        
         //compass支持增量索引,社会上很多公司,他们的产品都没有实现增量索引,1>lucene版本比较低,不支持增量索引,2>要增量索引,技术要求稍微有点高
         //(晚上 2-3,定时器,把索引文件删除,重新生成索引)实时性不强,在索引文件更新的时候,用户是访问不了的
         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();
                   }
         }
 
         public void deleteIndex(Product product) {
                   CompassSession session = null;
                   CompassTransaction tx = null;
                   try {
                            session = compass.openSession();
                            tx = session.beginTransaction();
                       session.delete(product);
                       tx.commit();
                   } catch (CompassException e) {
                            e.printStackTrace();
                            tx.rollback();
                   }finally{
                            if(session!=null && !session.isClosed()) session.close();
                   }
         }
 
         public void updateIndex(Product product) {
                   CompassSession session = null;
                   CompassTransaction tx = null;
                   try {
                      session = compass.openSession();
                      tx = session.beginTransaction();
                      session.delete(product);
                      session.save(product);
                      tx.commit();
                   } catch (CompassException e) {
                            e.printStackTrace();
                            tx.rollback();
                   }finally{
                            if(session!=null && !session.isClosed()) session.close();
                   }
         }
 
         public void destroy(){
                   compass.close();
         }
        
         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>();
                             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;
         }
}

分享到:
评论

相关推荐

    compass教程.pdf

    下面是 COMPASS 的一些重要知识点: 1. COMPASS WELLPLAN FOR WINDOWS 功能简介:COMPASS 的核心功能包括 PLANNING(设计)、SURVEY(实测计算)和 ANTICOLLISION(防碰计算)。 2. COMPANY SETUP:公司设置允许...

    java搜索 compass资料

    ### Java搜索 Compass 资料知识点 #### 一、Compass 概述 Compass 是一个为 Java 应用程序提供全文检索功能的框架。它能够帮助开发者在 Java 应用程序中轻松实现复杂的搜索需求,并且具有较高的性能。Compass 基于...

    mongodb-compass-1.17.0-win32-x64 MongoDB可视化工具Compass

    Compass作为其配套的可视化工具,提供了以下关键功能和知识点: 1. 数据浏览:Compass可以连接到MongoDB服务器,展示数据库、集合(相当于关系数据库中的表)以及文档(类似JSON格式的数据记录)。用户可以清晰地...

    Sass和Compass 实战

    ### Sass与Compass实战知识点详解 #### 一、Sass简介 Sass(Syntactically Awesome Style Sheets)是一种预处理器脚本语言,用于扩展CSS的功能。它为CSS增加了诸如变量、嵌套规则、混合器(mixins)、继承、函数等...

    COMPASS使用说明

    下面是COMPASS使用说明中的重要知识点: 一、基本概念和界面操作 * 文件操作:COMPASS支持打开、保存、导出和打印等文件操作,用户可以通过菜单栏或工具栏进行文件操作。 * 界面操作:COMPASS的界面主要包括菜单栏...

    compass 全文搜索

    学习和使用Compass全文搜索,你需要掌握以下几个关键知识点: 1. **Lucene基础知识**:理解Lucene的索引结构、倒排索引、Term和Document的概念,以及如何使用Analyzer处理文本。 2. **Compass配置**:设置数据源、...

    前端开源库-compass-mixins

    关于 Compass Mixins,以下是一些关键知识点: 1. **浏览器前缀处理**:Compass 提供了自动处理浏览器前缀的 mixin,例如 `compass/css3/border-radius`,可以简化编写圆角边框的代码,同时自动添加 `-webkit-`,`-...

    MongoDB compass

    以下是关于MongoDB Compass的一些关键知识点: 1. **界面与导航**:MongoDB Compass拥有用户友好的图形用户界面(GUI),使得数据库的浏览和操作变得直观。用户可以轻松地通过集合、文档、索引等视图来探索数据。 ...

    Compass简单学习

    【标题】"Compass简单学习"所涉及的知识点主要集中在两个方面:一是对Compass工具的理解,二是如何使用Compass进行源码分析和开发辅助。Compass是一个强大的样式表(CSS)编译器,它基于Sass语言,帮助开发者更高效...

    Compass与ssh框架整合

    以下是一些关键步骤和知识点: 1. **安装与配置Compass**:下载并添加Compass库到项目的类路径,然后在配置文件(如`compass.cfg.xml`)中指定索引存储位置,以及需要索引的数据源。 2. **配置SSH框架**:在Spring...

    sass与compass实战

    ### SASS与Compass实战知识点总结 #### 一、SASS简介 SASS(Syntactically Awesome Style Sheets,简称SASS)是一种预处理器语言,它扩展了CSS的功能,使得CSS更加灵活、易于管理和维护。SASS引入了诸如变量、嵌套...

    compass-reference.pdf

    根据给定的文件信息,我们可以深入探讨Compass——一个强大的Java搜索引擎库,以及其核心概念、配置方式、连接管理、搜索引擎特性等关键知识点。 ### Compass概述 Compass是为Java开发人员设计的一个高性能、高...

    Compass-master.zip

    在Android平台上,开发...以上就是"Compass-master.zip"项目所涉及的关键技术和知识点。通过对这些内容的理解和实践,开发者不仅可以创建一个功能齐全的指南针应用,还能深入了解Android系统的传感器机制和UI交互设计。

    compass内部分享

    ### Compass与Lucene知识点详解 #### Lucene简介 **Lucene**是一款优秀的、成熟的、开源的、纯Java语言编写的全文检索工具包。它提供了一种高性能的方式来进行文本的索引和搜索,使得开发者能够在应用中轻松实现...

    微信小程序开发之指南针小工具compass-master.zip

    通过学习以上知识点并结合"compass-master"的源代码,你可以深入理解微信小程序的开发流程,掌握指南针小工具的实现原理,并能够自己动手开发类似的功能。在实践中不断探索和提升,是掌握微信小程序开发的关键。

    简单的compass示例源码

    通过分析这个压缩包的内容,我们可以学习到以下Compass的关键知识点: 1. **Compass配置**:如何设置Compass的配置文件,包括数据源、索引位置、分析器等。 2. **对象绑定**:理解如何将应用程序中的对象与Compass...

    S2SH+compass (实现站内全文检索)

    标题中的"S2SH+compass"指的是一个基于Struts2(S),Spring(S)和Hibernate(H)这三种开源框架的Java Web应用,再...如果想深入了解这些知识点,可以参考博文链接提供的内容,或者查阅相关框架和Compass的官方文档。

    compass索引插件demo

    下面将详细介绍如何在Java SSH框架中集成Compass插件,并探讨相关知识点。 **SSH框架** SSH(Spring、Struts和Hibernate)是一种常见的Java Web开发框架组合。Spring提供依赖注入和事务管理,Struts负责MVC架构,...

    compass_lucene_source

    在Compass中,主要的知识点包括: 1. **配置**:Compass的配置允许开发者定义索引的位置、数据源、连接方式等,以便与应用的其他部分协调。 2. **映射(Mapping)**:Compass的映射机制允许将Java对象的属性映射到...

    compass和wellplan学习总结.doc

    本文档总结了Compass和WellPlan的学习笔记,涵盖了油气工业中常用的井trajectory设计和分析、Well Planning和设计等方面的知识点。 一、井trajectory设计和分析 井trajectory设计和分析是油气工业中非常重要的一环...

Global site tag (gtag.js) - Google Analytics