Product 搜索实体类 可以对应数据库里的表
package com.ym.compass.bean;
import org.compass.annotations.Index;
import org.compass.annotations.Searchable;
import org.compass.annotations.SearchableId;
import org.compass.annotations.SearchableProperty;
import org.compass.annotations.Store;
//标识为搜索实体
@Searchable
public class Product {
private String id;
private String name;
private int price;
private String saler;
private String descripiton;
public Product(){
}
public Product(String id){
this.id=id;
}
public Product(String id, String name, int price, String saler,
String descripiton) {
this.id = id;
this.name = name;
this.price = price;
this.saler = saler;
this.descripiton = descripiton;
}
@SearchableId //compass 要求每个搜索实体类都要具有一个标识属性,这点和Hibernate很相似
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
/**
* Index.UN_TOKENIZED 不对该Field进行分词 但是建立索引 该属性已过时,建议采用NOT_ANALYZED
* Index.TOKENIZED 先分词后索引 该属性已过时,建议采用ANALYZED
* Index.NOT_ANALYZED 不分词但建立索引
* Index.ANALYZED 分词并且建立索引
*Index.NO 不分词不建立索引 没有索引就不会查询这个字段
* @return
*/
//设置收索属性 分词并建立索引
//Store默认值为YES boost的默认值为1用于设置属性在索引中的重要性
@SearchableProperty (index= Index.ANALYZED,store=Store.YES,boost=1)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@SearchableProperty
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
@SearchableProperty
public String getSaler() {
return saler;
}
public void setSaler(String saler) {
this.saler = saler;
}
@SearchableProperty (index=Index.ANALYZED,store=Store.YES)
public String getDescripiton() {
return descripiton;
}
public void setDescripiton(String descripiton) {
this.descripiton = descripiton;
}
}
******************************************************
ProductSearchBean 真正实现Compass搜索的类
package com.ym.compass.service.impl;
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.CompassQuery.SortDirection;
import org.compass.core.CompassQuery.SortPropertyType;
import org.compass.core.CompassQueryBuilder;
import org.compass.core.CompassSession;
import org.compass.core.CompassTransaction;
import org.compass.core.config.CompassEnvironment;
import com.ym.compass.bean.Product;
import com.ym.compass.bean.QueryResult;
import com.ym.compass.service.ProductSearch;
public class ProductSearchBean implements ProductSearch {
private Compass compass = null;
public ProductSearchBean() {
try {
// 编程式配置 也可以使用配置文件
compass = new CompassAnnotationsConfiguration()
.setSetting(CompassEnvironment.CONNECTION,
"file://indexfile")
// .setSetting(CompassEnvironment.CONNECTION, "ram://index")
// //在内存中建立索引
.setSetting("compass.engine.analyzer.default.type",
"net.paoding.analysis.analyzer.PaodingAnalyzer")
//进行加亮处理 如把关键字变成红色
.setSetting(
"compass.engine.highlighter.default.formatter.simp.pre",
"<font color='red'>")
.setSetting(
"compass.engine.highlighter.default.formatter.simp.post",
"</font>")
.addScan("com.ym.compass.bean").buildCompass();//扫描包下面的实体类 如果发现@Searchable就会当作搜索实体类
} catch (CompassException e) {
e.printStackTrace();
}
}
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();
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.setDescripiton(hits.highlighter(i).fragment(
"descripiton"));
products.add(product);
}
qr.setResults(products);
qr.setTotal(hits.length());
hits.close();
} catch (CompassException e) {
e.printStackTrace();
tx.rollback();
} finally {
if (session != null && !session.isClosed())
session.close();
}
return qr;
}
/**
* 高级查询 比如搜索 销售员为“yang”的商品里面包含关键字的商品
*/
public QueryResult<Product> search(String keyWord, String saler,
int firstIndex, int maxResult) {
QueryResult<Product> qr = new QueryResult<Product>();
CompassSession session = null;
CompassTransaction tx = null;
try {
session = compass.openSession();
tx = session.beginTransaction();
// 查询指定类型的匹配记录,并按照什么排序
CompassQueryBuilder queryBuilder = session.queryBuilder();
CompassHits hits = queryBuilder.bool()
.addMust(queryBuilder.spanEq("saler", saler))
.addMust(queryBuilder.queryString(keyWord).toQuery())
.toQuery().addSort("price", SortPropertyType.INT, SortDirection.REVERSE)
.hits(); // 等同于效果 sql where saler=yang and (xxx like ?) order by price 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.setDescripiton(hits.highlighter(i).fragment(
"descripiton"));
product.setName(hits.highlighter(i).fragment(
"name"));
products.add(product);
}
qr.setResults(products);
qr.setTotal(hits.length());
hits.close();
} catch (CompassException e) {
e.printStackTrace();
tx.rollback();
} finally {
if (session != null && !session.isClosed())
session.close();
}
return qr;
}
public void destroy() {
compass.close();
}
public void buildIndex() {
CompassSession session = null;
CompassTransaction tx = null;
try {
session = compass.openSession();
tx = session.beginTransaction();
Product p1 = new Product("1", "红豆经典衬衫", 150, "汤姆", "经典舒适衬衫 大品牌你懂的");
session.create(p1);
Product p2 = new Product("5", "红豆内衣", 50, "杰克", "经典舒适衬衫 大品牌你懂的");
session.create(p2);
Product p3 = new Product("8", "联想笔记本", 150, "汤姆", "经典商务本,不要错过哦");
session.create(p3);
Product p4 = new Product("11", "文具笔记本", 10, "琼斯", "书写流畅");
session.create(p4);
Product p5 = new Product("17", "红豆", 8, "汤姆", "红豆冰淇淋很好吃的哦");
session.create(p5);
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);
} catch (CompassException e) {
e.printStackTrace();
tx.rollback();
} finally {
if (session != null && !session.isClosed())
session.close();
}
}
}
详细代码见附件,是在eclipse下一个可以通过Junit运行的工程。 解压密码:123
dic目录下是庖丁分词器的字典,paoding-dic-home.properties文件指定字典的存放位置
分享到:
相关推荐
《Lucene搜索引擎与Compass框架详解》 在信息化飞速发展的今天,搜索引擎已经成为了我们获取信息的重要工具。Apache Lucene是一个高性能、全文本检索库,它提供了基础的索引和搜索功能,使得开发者能够轻松地在应用...
- Compass是一个基于Hibernate和Lucene的开源搜索引擎框架。本章节介绍了如何利用Compass简化搜索系统的开发,并提供了一些实际应用场景的例子。 #### 八、Lucene分布式和Google Search API - 随着数据量的增长,...
2. **Compass**: Compass是基于Lucene的一个开源搜索引擎框架,它简化了在Java应用中集成Lucene的过程。Compass提供了一种ORM(对象关系映射)的方式来处理Lucene索引,允许开发者直接对对象进行搜索,而无需关心...
标题中的“巴巴运动包jar(包含compass,lucene)”指的是一个特定的Java应用程序包,它集成了两个重要的开源搜索引擎库:Compass和Lucene。在Java开发中,JAR(Java Archive)文件是一种用于打包类文件、资源文件和...
### 开源企业搜索引擎SOLR的应用教程 #### 一、概述与特性介绍 **1.1 企业搜索引擎方案选型** 对于门户社区等网站来说,搜索引擎功能是提升用户体验的关键因素之一。当前,针对搜索引擎功能的需求有多种解决方案...
Compass是一个面向对象的全文搜索引擎,它将Lucene的功能封装在ORM层,便于与Java持久化框架集成。Nutch则是一个开源的Web搜索引擎项目,集成了爬虫、索引和搜索等功能,可以用来构建大规模的网络搜索引擎。 学习和...
目前实现搜索引擎的方案有多种,包括基于Lucene封装实现站内搜索、调用Google或Baidu的API,以及基于Compass+Lucene实现搜索功能。Solr作为一个企业级搜索引擎方案,被选型在其中。 Solr的特性主要包括: - 使用了...
这种技术广泛应用于搜索引擎等领域,能够极大地提高信息检索的速度和准确性。 #### 三、Lucene的特点 1. **跨平台性**:由于Lucene是基于Java编写的,因此它可以在任何支持Java运行环境的操作系统上运行,如Windows...
- 企业搜索引擎方案选型:主要比较了基于Lucene封装、调用第三方搜索引擎API和基于Compass+Lucene三种方案的优劣。 - Solr的特性:描述了Solr是基于Lucene的搜索引擎,并对其扩展性进行了说明;包括Solr的Schema模式...
1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件,FTP的目标是:(1)提高...
1. **基于Lucene自行封装实现站内搜索**:这种方式虽然能够最大程度地控制搜索引擎的行为,但由于需要大量的开发工作,且在后续维护和扩展方面可能会遇到挑战,因此通常不会被首选。 2. **调用第三方搜索引擎如...
在trapi v3.x上测试最新测试:v3.4.0该插件尚未在mongodb上进行测试开发此插件的目的是使用Strapi中的弹性搜索引擎来帮助应用程序开发过程 :memo: 目录 方案4 职能阿皮例子记录中作者 先决条件安装Elasticsearch- ...
1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件,FTP的目标是:(1)提高...
1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件,FTP的目标是:(1)提高...
1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件,FTP的目标是:(1)提高...
EJB中JNDI的使用源码例子 1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件...
EJB中JNDI的使用源码例子 1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件...
导航:图形类,搜索算法和导航网格实现可实现高级路径查找。 感知:创建具有短期记忆和愿景成分的游戏实体。 触发器:使用触发器在游戏中生成动态动作。 模糊逻辑:通过Yuka的模糊推理系统,使您的游戏实体更...