`
yangmingjiayou
  • 浏览: 112490 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

搜索引擎Compass的例子

阅读更多

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文件指定字典的存放位置
分享到:
评论

相关推荐

    自己动手写搜索引擎

    - Compass是一个基于Hibernate和Lucene的开源搜索引擎框架。本章节介绍了如何利用Compass简化搜索系统的开发,并提供了一些实际应用场景的例子。 #### 八、Lucene分布式和Google Search API - 随着数据量的增长,...

    Lucene+compass+spring+jdbc+庖丁的一个例子

    2. **Compass**: Compass是基于Lucene的一个开源搜索引擎框架,它简化了在Java应用中集成Lucene的过程。Compass提供了一种ORM(对象关系映射)的方式来处理Lucene索引,允许开发者直接对对象进行搜索,而无需关心...

    巴巴运动包jar(包含compass,lucene)

    标题中的“巴巴运动包jar(包含compass,lucene)”指的是一个特定的Java应用程序包,它集成了两个重要的开源搜索引擎库:Compass和Lucene。在Java开发中,JAR(Java Archive)文件是一种用于打包类文件、资源文件和...

    开源企业搜索引擎SOLR的应用教程

    ### 开源企业搜索引擎SOLR的应用教程 #### 一、概述与特性介绍 **1.1 企业搜索引擎方案选型** 对于门户社区等网站来说,搜索引擎功能是提升用户体验的关键因素之一。当前,针对搜索引擎功能的需求有多种解决方案...

    lunece

    Compass是一个面向对象的全文搜索引擎,它将Lucene的功能封装在ORM层,便于与Java持久化框架集成。Nutch则是一个开源的Web搜索引擎项目,集成了爬虫、索引和搜索等功能,可以用来构建大规模的网络搜索引擎。 学习和...

    Solr 教程 pdf

    目前实现搜索引擎的方案有多种,包括基于Lucene封装实现站内搜索、调用Google或Baidu的API,以及基于Compass+Lucene实现搜索功能。Solr作为一个企业级搜索引擎方案,被选型在其中。 Solr的特性主要包括: - 使用了...

    开源搜索框架lucene介绍

    这种技术广泛应用于搜索引擎等领域,能够极大地提高信息检索的速度和准确性。 #### 三、Lucene的特点 1. **跨平台性**:由于Lucene是基于Java编写的,因此它可以在任何支持Java运行环境的操作系统上运行,如Windows...

    solr从入门到精通教程

    - 企业搜索引擎方案选型:主要比较了基于Lucene封装、调用第三方搜索引擎API和基于Compass+Lucene三种方案的优劣。 - Solr的特性:描述了Solr是基于Lucene的搜索引擎,并对其扩展性进行了说明;包括Solr的Schema模式...

    java源码包---java 源码 大量 实例

    1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件,FTP的目标是:(1)提高...

    JAVA上百实例源码以及开源项目源代码

    EJB中JNDI的使用源码例子 1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件...

    strapi-plugin-elastic:elasticsearch插件可让您轻松地将数据库与elasticsearch同步

    在trapi v3.x上测试最新测试:v3.4.0该插件尚未在mongodb上进行测试开发此插件的目的是使用Strapi中的弹性搜索引擎来帮助应用程序开发过程 :memo: 目录 方案4 职能阿皮例子记录中作者 先决条件安装Elasticsearch- ...

    java源码包2

    1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件,FTP的目标是:(1)提高...

    java源码包3

    1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件,FTP的目标是:(1)提高...

    java源码包4

    1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件,FTP的目标是:(1)提高...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    EJB中JNDI的使用源码例子 1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    EJB中JNDI的使用源码例子 1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件...

Global site tag (gtag.js) - Google Analytics