热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

全文检索Lucene(四)---Compass框架

Compass是一个强大的,事务的,高性能的对象搜索引擎映射(OSEM:objectsearchenginemapping)与一个Java持久层框架。Compass之于Luc

Compass是一个强大的,事务的,高性能的对象/搜索引擎映射(OSEM:object/search engine mapping)与一个Java持久层框架。
Compass之于Lucene,就像Hibernate之于JDBC,Compass就是把Lucene封装了一层。
Compass目前版本是2.2.0,已经很久没有更新与维护。Compass2.2的版本所对应的Lucene2.4.1。

下载地址:http://www.compass-project.org/
解压后的目录结构:
这里写图片描述

开发的基本jar包在dist及其子目录下查找,主要如下,
这里写图片描述

代码示例:
Article.java

package com.my.bean;

import org.compass.annotations.Index;
import org.compass.annotations.Searchable;
import org.compass.annotations.SearchableBoostProperty;
import org.compass.annotations.SearchableId;
import org.compass.annotations.SearchableProperty;
import org.compass.annotations.Store;

@Searchable
public class Article {
// 对于@SearchableId,默认是不可以进行查询的,在指定了name参数后,就可以使用这个属性查询了
// 对于数字的属性,可以指定format为若干个0,表示要存成几个长度,如果不足这个长度,前面用'0'补齐
@SearchableId(name = "id", format = "00000000")
private Integer id;
@SearchableProperty(name = "title", store = Store.YES, index = Index.ANALYZED)
private String title;
@SearchableProperty(name = "content", store = Store.YES, index = Index.ANALYZED)
private String content;
@SearchableBoostProperty
private float boostValue = 1F;

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public String getTitle() {
return title;
}

public void setTitle(String title) {
this.title = title;
}

public String getContent() {
return content;
}

public void setContent(String content) {
this.cOntent= content;
}

public float getBoostValue() {
return boostValue;
}

public void setBoostValue(float boostValue) {
this.boostValue = boostValue;
}

}

HelloWorld.java

package com.my.compass;

import java.util.ArrayList;
import java.util.List;

import org.compass.core.Compass;
import org.compass.core.CompassHits;
import org.compass.core.CompassSession;
import org.compass.core.CompassTransaction;
import org.compass.core.config.CompassConfiguration;
import org.junit.Test;

import com.my.bean.Article;

public class HelloWorld {

private CompassConfiguration cfg = new CompassConfiguration().configure();
private Compass compassSessiOnFactory= cfg.buildCompass();

// 建立索引(模拟在贴吧中发表了一个文章,会保存到数据库中,并且应该建立索引,以便能搜索到)
@Test
public void createIndex() throws Exception {
// 模拟一条刚保存到数据库中的数据
Article article = new Article();
article.setId(1);
article.setTitle("Lucene是全文检索的框架");
article.setContent("如果信息检索系统在用户发出了检索请求后再去互联网上找答案,根本无法在有限的时间内返回结果。");

// 建立索引 ?
CompassSession session = compassSessionFactory.openSession();
CompassTransaction tx = session.beginTransaction();
session.create(article); // 创建索引
tx.commit();
session.close();
}

// 搜索
@Test
public void search() throws Exception {
// 搜索条件
// String queryString = "lucene";
String queryString = "compass";

// 进行搜索,得到结果 ?
List
list = new ArrayList
();
CompassSession session = compassSessionFactory.openSession();
CompassTransaction tx = session.beginTransaction();

CompassHits hits = session.find(queryString);
// int count = hits.length(); // 总结果数
for (int i = 0; i
Article article = (Article) hits.data(i);
// hits.score(i);
list.add(article);
}

tx.commit();
session.close();

// 显示结果
System.out.println("总结果数量为:" + list.size());
for (Article article : list) {
System.out.println("--------> id = " + article.getId());
System.out.println("title = " + article.getTitle());
System.out.println("cOntent= " + article.getContent());
}
}
}

compass.cfg.xml


<compass-core-config xmlns="http://www.compass-project.org/schema/core-config"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.compass-project.org/schema/core-config
http://www.compass-project.org/schema/compass-core-config-2.2.xsd"
>


<compass name="default">

<connection>
<file path="./indexDir/" />
connection>


<mappings>
<class name="com.my.bean.Article" />
mappings>


<settings>

<setting name="compass.engine.highlighter.default.formatter.simple.pre" value="" />

<setting name="compass.engine.highlighter.default.formatter.simple.post" value="" />


<setting name="compass.engine.highlighter.default.fragmenter.simple.size" value="20" />


<setting name="compass.engine.analyzer.default.type" value="jeasy.analysis.MMAnalyzer" />
settings>


compass>
compass-core-config>

Compass增删改查
CompassUtils.java

package com.my.utils;

import org.compass.core.Compass;
import org.compass.core.CompassSession;
import org.compass.core.config.CompassConfiguration;

public class CompassUtils {

private static Compass compassSessionFactory;

static {
CompassConfiguration cfg = new CompassConfiguration().configure();
compassSessiOnFactory= cfg.buildCompass();
}

/**
* 打开一个新的CompassSession并返回
*
* @return
*/

public static CompassSession openSession() {
return compassSessionFactory.openSession();
}

public static Compass getCompassSessionFactory() {
return compassSessionFactory;
}

}

ArticleIndexDao.java

package com.my.compass;

import java.util.ArrayList;
import java.util.List;

import org.compass.core.CompassHits;
import org.compass.core.CompassSession;
import org.compass.core.CompassTransaction;

import com.my.bean.Article;
import com.my.bean.QueryResult;
import com.my.utils.CompassUtils;

public class ArticleIndexDao {

/**
* 创建索引(保存到索引库)
*
* @param article
*/

public void save(Article article) {
CompassSession session = CompassUtils.openSession();
CompassTransaction tx = null;
try {
tx = session.beginTransaction();
session.create(article); // 建立索引
tx.commit();
} catch (Exception e) {
tx.rollback();
throw new RuntimeException(e);
} finally {
session.close();
}
}

/**
* 删除索引
*
* Term:是指某字段中的某个关键词(在目录中出现的关键词)
*
* @param id
*/

public void delete(Integer id) {
CompassSession session = CompassUtils.openSession();
CompassTransaction tx = null;
try {
tx = session.beginTransaction();
session.delete(Article.class, id); // 删除索引
tx.commit();
} catch (Exception e) {
tx.rollback();
throw new RuntimeException(e);
} finally {
session.close();
}
}

/**
* 更新索引
*
* @param article
*/

public void update(Article article) {
CompassSession session = CompassUtils.openSession();
CompassTransaction tx = null;
try {
tx = session.beginTransaction();
session.save(article); // 更新索引
tx.commit();
} catch (Exception e) {
tx.rollback();
throw new RuntimeException(e);
} finally {
session.close();
}
}

/**
* 搜索(分页)
*
* @param queryString
* @param firstResult
* @param maxResults
* @return 总记录数 + 一页数据列表
*/

public QueryResult search(String queryString, int firstResult, int maxResults) {
CompassSession session = CompassUtils.openSession();
CompassTransaction tx = null;
try {
tx = session.beginTransaction();
// -------------------------------------------------
// 查询,得到中间结果
CompassHits hits = session.find(queryString);
int count = hits.length();

// 处理结果并返回
List
list = new ArrayList
();
int endIndex = Math.min(firstResult + maxResults, hits.length());

for (int i = firstResult; i // 只取一段数据
Article article = (Article) hits.data(i);

// ------------------------------------------------
// 做高亮操作,一次高亮一个属性,如果当前高亮的属性值中没有出现搜索的关键字,则返回null
String text = hits.highlighter(i).fragment("content");
if (text != null) {
article.setContent(text); // 使用高亮后的文本替换原始内容
}
// ------------------------------------------------

list.add(article);
}
tx.commit();

return new QueryResult(count, list);
// -------------------------------------------------
} catch (Exception e) {
tx.rollback();
throw new RuntimeException(e);
} finally {
session.close();
}
}
}

基于CompassTemplate的增删改查

package com.my.compass;

import java.util.ArrayList;
import java.util.List;

import org.compass.core.CompassCallback;
import org.compass.core.CompassException;
import org.compass.core.CompassHits;
import org.compass.core.CompassSession;
import org.compass.core.CompassTemplate;

import com.my.bean.Article;
import com.my.bean.QueryResult;
import com.my.utils.CompassUtils;

public class ArticleIndexDao2 {

/**
* 创建索引(保存到索引库)
*
* @param article
*/

public void save(Article article) {
CompassTemplate compassTemplate = new CompassTemplate(CompassUtils.getCompassSessionFactory());
compassTemplate.create(article);
}

/**
* 删除索引
*
* Term:是指某字段中的某个关键词(在目录中出现的关键词)
*
* @param id
*/

public void delete(Integer id) {
CompassTemplate compassTemplate = new CompassTemplate(CompassUtils.getCompassSessionFactory());
compassTemplate.delete(Article.class, id);
}

/**
* 更新索引
*
* @param article
*/

public void update(Article article) {
CompassTemplate compassTemplate = new CompassTemplate(CompassUtils.getCompassSessionFactory());
compassTemplate.save(article);
}

/**
* 搜索(分页)
*
* @param queryString
* @param firstResult
* @param maxResults
* @return 总记录数 + 一页数据列表
*/

public QueryResult search(final String queryString, final int firstResult, final int maxResults) {
CompassTemplate compassTemplate = new CompassTemplate(CompassUtils.getCompassSessionFactory());

return compassTemplate.execute(new CompassCallback() {
public QueryResult doInCompass(CompassSession session) throws CompassException {
// 查询,得到中间结果
CompassHits hits = session.find(queryString);
int count = hits.length();

// 处理结果并返回
List
list = new ArrayList
();
int endIndex = Math.min(firstResult + maxResults, hits.length());

for (int i = firstResult; i // 只取一段数据
Article article = (Article) hits.data(i);

// 做高亮操作,一次高亮一个属性,如果当前高亮的属性值中没有出现搜索的关键字,则返回null
String text = hits.highlighter(i).fragment("content");
if (text != null) {
article.setContent(text); // 使用高亮后的文本替换原始内容
}

list.add(article);
}
return new QueryResult(count, list);
}
});
}
}

查询示例:

package com.my.compass;

import java.util.ArrayList;
import java.util.List;

import org.compass.core.CompassHits;
import org.compass.core.CompassQuery;
import org.compass.core.CompassQueryBuilder.CompassMultiPhraseQueryBuilder;
import org.compass.core.CompassSession;
import org.compass.core.CompassTransaction;
import org.junit.Test;

import com.my.bean.Article;
import com.my.utils.CompassUtils;

public class QueryTest {

@Test
public void search() throws Exception {

CompassSession session = CompassUtils.openSession();
CompassTransaction tx = session.beginTransaction();

// 查询
// ------------------------------------------------

// 1,查询所有
CompassQuery query1 = session.queryBuilder().matchAll();

// 关键词查询
CompassQuery query2 = session.queryBuilder().term("title", "lucene");

// 范围查询
CompassQuery query3 = session.queryBuilder().between("id", 5, 15, true);

// 通配符查询
CompassQuery query4 = session.queryBuilder().wildcard("title", "luc*n?");

// 模糊查询
CompassQuery query5 = session.queryBuilder().fuzzy("title", "lucenx", 0.8F);

// 短语查询
CompassMultiPhraseQueryBuilder multiPhraseQueryBuilder = session.queryBuilder().multiPhrase("title");
multiPhraseQueryBuilder.add("lucene", 0);
multiPhraseQueryBuilder var cpro_id = "u6885494";
推荐阅读
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • Spring学习(4):Spring管理对象之间的关联关系
    本文是关于Spring学习的第四篇文章,讲述了Spring框架中管理对象之间的关联关系。文章介绍了MessageService类和MessagePrinter类的实现,并解释了它们之间的关联关系。通过学习本文,读者可以了解Spring框架中对象之间的关联关系的概念和实现方式。 ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • 面向对象之3:封装的总结及实现方法
    本文总结了面向对象中封装的概念和好处,以及在Java中如何实现封装。封装是将过程和数据用一个外壳隐藏起来,只能通过提供的接口进行访问。适当的封装可以提高程序的理解性和维护性,增强程序的安全性。在Java中,封装可以通过将属性私有化并使用权限修饰符来实现,同时可以通过方法来访问属性并加入限制条件。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
author-avatar
再见傻瓜傻瓜_299
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有