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
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