Compass 更智能的搜索引擎(1)--入门
学完了前面的Lucene系列教程:
Lucene确实是个好东西,适用性也很强。但是需要对待索引的数据手动的封装,每次都需要从底层开始一点点的设计。对于一个工作量很大的项目而言,简直就是噩梦。所以,我们对于Lucene,了解其工作原理就行了。实际中开发靠得住的还是易用性强的框架。这同时也给我们这些开发人员提了个醒不是?易用.下面就来分享一个更好用的全文搜索框架。Compass,一个基于Lucene而又高于Lucene的好框架!
准备工作
由于Compass是基于Lucene的,所以我们需要引入Lucene的支持。文中可以看到lucene的文件夹。
最后一点,那就是对于中文支持的依赖。使用适合汉语特点的分词器将能大大的提高我们的全文搜索的精准度。
适合汉语的Lucene拓展分词器下载
Compass工作原理
图解工作原理。
引用网上的一张图。
Compass和Hibernate的对比
| 主配置对比分析 | Hibernate | Compass |
|---|---|---|
| 主配置文件名称 | hibernate.cfg.xml | compass.cfg.xml |
| 主配置文件所在目录 | src目录 | src目录 |
| 连接信息 | 数据库的连接信息 | 索引库的连接信息<connection><file path="indexDir"></connection> |
| 声明映射文件 | mapper标签声明 | mapping标签声明,标注Bean的全名即可 |
| 其他配置 | 二级缓存,显示SQL语句,自动建表等 | 其他配置,分词器、高亮器等 |
Compass工作流程
实例分析
项目目录
创建Bean对象Article.java
/**
* @Date 2016年8月2日
*
* @author Administrator
*/
package domain;
import org.compass.annotations.ExcludeFromAll;
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;
/**
*
* Compass的映射配置要求
*
* 在实体类上面有一个@Searchable注解<br>
*
* 在属性上面,至少有一个有@SearchableId
*
* 其他的属性只需要是@SearchableProperty即可
*
*
*
* @author 郭瑞彪
*/
@Searchable
public class Article {
@SearchableId
private Integer id;
@SearchableProperty(store = Store.YES, index = Index.ANALYZED)
private String title;
@SearchableProperty(store = Store.YES, index = Index.ANALYZED)
private String content;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getTitle() {
return title;
}
@Override
public String toString() {
return "Article [id=" + id + ", title=" + title + ", content=" + content + "]";
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
CompassUtils.java
/**
* @Date 2016年8月2日
*
* @author Administrator
*/
package util;
import org.compass.core.Compass;
import org.compass.core.config.CompassConfiguration;
/**
* @author 郭瑞彪
*
*/
public class CompassUtils {
private static Compass compassSessionFactory;
static{
CompassConfiguration cfg = new CompassConfiguration().configure();
compassSessionFactory = cfg.buildCompass();
}
public static Compass getCompassSessionFactory() {
return compassSessionFactory;
}
}
compass.cfg.xml
<?xml version="1.0" encoding="UTF-8" ?>
<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>
<!-- 映射信息,好比Hibernate的映射关系 -->
<mappings>
<class name="domain.Article" />
</mappings>
</compass-core-config>
测试代码
/**
* @Date 2016年8月2日
*
* @author Administrator
*/
package main;
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.junit.Test;
import domain.Article;
import util.CompassUtils;
/**
* @author 郭瑞彪
*
*/
public class HelloWorld {
@Test
public void createIndex() throws Exception {
// 模拟一条文章数据
Article a = new Article();
a.setId(1);
a.setTitle("全文检索");
a.setContent("我们主要是做站内搜索(或叫系统内搜索),即对系统内的资源进行搜索");
// 建立索引
Compass compassSessionFactory = CompassUtils.getCompassSessionFactory();
CompassSession session = compassSessionFactory.openSession();
CompassTransaction tx = session.beginTransaction();
session.create(a);
tx.commit();
session.close();
}
@Test
public void search() throws Exception {
String queryString = "资源";
// 查询,得到结果
List<Article> articles = new ArrayList<Article>();
// 建立索引
Compass compassSessionFactory = CompassUtils.getCompassSessionFactory();
CompassSession session = compassSessionFactory.openSession();
CompassTransaction tx = session.beginTransaction();
CompassHits hits = session.find(queryString);
for (int i = 0; i < hits.length(); i++) {
Article a = (Article) hits.data(i);
articles.add(a);
}
tx.commit();
session.close();
// 显示结果
System.out.println(articles.toString());
for (Article a : articles) {
System.out.println("-----------搜索结果如下-----------------");
System.out.println(">>>id: " + a.getId());
System.out.println(">>>title:" + a.getTitle());
System.out.println(">>>content:" + a.getContent());
}
}
}
以上,我们就实现了对于Compass的入门级的使用了。是不是很方便呢?
Compass 更智能的搜索引擎(1)--入门的更多相关文章
- Compass 更智能的搜索引擎(2)--进阶
经过了Compass 更智能的搜索引擎(1)–入门的学习,想必对于Compass的使用有了更深的认识了吧.下面谈点更加切合实际开发的东西.那就是CRUD. 面向对象的分页 dao层实现 代码释义 优点 ...
- Compass 更智能的搜索引擎(3)--高亮,排序,过滤以及各种搜索
要想使得一个搜索系统更加的完美,查询精确度和页面显示算是其中比较重要的两个方面.今天,我们就来谈谈怎么使得我们的搜索系统更加的完美. 关于分词 下载地址 配置 关于高亮 关于排序 原理 冗余字段 使用 ...
- 《SEO教程:搜索引擎优化入门与进阶(第3版)》
<SEO教程:搜索引擎优化入门与进阶(第3版)> 基本信息 作者: 吴泽欣 丛书名: 图灵原创 出版社:人民邮电出版社 ISBN:9787115357014 上架时间:2014-7-1 出 ...
- iPad版微信终于来临了 微信5.4版搜索更智能 转账就是发消息
等待甚久的iPad版微信终于来临了!昨日微信iOS版本更新至5.4.0.16,新增功能包括搜索公众号.识别图中二维码.面对面收钱,同时适配iPad.(微信5.4安卓版重回ios风格 导航菜单都放底栏位 ...
- C# .NET更智能的数据库操作的封装
前述: 对数据库操作的封装,相信网络上已经有一大堆,ORM框架,或者是.NET本身的EF,都很好的支持数据库操作.这篇文章是分享自己所思考的,对数据库操作的简单封装.我对于这篇文章,认为被浏览者所关注 ...
- 全文搜索引擎Elasticsearch入门实践
全文搜索引擎Elasticsearch入门实践 感谢阮一峰的网络日志全文搜索引擎 Elasticsearch 入门教程 安装 首先需要依赖Java环境.Elasticsearch官网https://w ...
- 全文搜索引擎 Elasticsearch 入门
1. 百科 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearch是用Java开发的,并作 ...
- 使用OpenAPI构建更智能的API
像OpenAPI这样的API描述规范是一个关键工具,您应该尽可能地将其好好掌握,记录和执行API的工作由计算机和开发人员完成:OpenAPI 3.0现在允许额外的表现力,可以让机器为我们做更多有用的工 ...
- Win10系统升级更新方式将会更智能
使用Win10系统的你肯定遇到过在工作时开始自动更新而不得不搁置工作的情况,想必你也已经被Win10系统的自动更新折磨不已,不过这种情况将会马上得到改观. 微软现在已经开始寻找更智能的版本升级更新方式 ...
随机推荐
- Linux下 Apache Vhost 配置 防止403
首先,贴一份正确的配置(最简单的) <VirtualHost *:80> DocumentRoot /home/ubuntu/www/spider/public ServerName sp ...
- 计蒜客NOIP模拟赛6 D1T1Diamond-square
Diamond-square 算法是一种能够用于生成噪声的算法,现在我们考虑这个算法的一个变种. 你有一个 2^n\times 2^n2n×2n 的网格,一共有 (2^n+1)^2(2n ...
- [BZOJ]1045 糖果传递(HAOI2008)
放一道数学题. Description 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. Input 第一行一个正整数n<=1000000,表示 ...
- Python中byte与str
原文传送门:请点击 现在计算机中,在内存中采用unicode编码方式. 可以看到上图中,字节型数据t并没有像想象中的一样显示0,1字符串.显示仍然是b,这是因为t是采用utf-8来编码,而utf-8与 ...
- Linux 下 HTTP连接超时
将项目部署到现场环境,HTTP请求莫名奇妙的连接超时,通过抓包定位了问题,是请求的IP被禁止掉.其中用到了抓包,将记录记录于此. tcpdump host 120.197.89.51 -i any - ...
- STM32 基于定时器的PWM发生器
脉冲宽度调制(PWM),是英文"Pulse Width Modulation" 的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术.简单一点,就 ...
- 反向Ajax之Socket.io
1.什么是反向ajax? 传统的ajax的困惑? 新需求--当服务器端数据发生变化时,客户端(浏览器端)如何即时得到通知呢? 找一些实际的案例:客服系统.在线聊天 这类应用,有一个显著的特点: 数据并 ...
- Structured Streaming + Kafka 集成中遇到的问题
官方指导:http://spark.apache.org/docs/2.2.0/structured-streaming-kafka-integration.html 1.版本问题 起初用的kafk ...
- 使用Vitrualbox虚拟Windows Server 2016系统的一些常见问题
所有的问题都是基于有路由器的网络环境下进行设置的,所有的vitrualbox都是安装在win7或者win2008系统上进行的. 1.无法创建x64系统? 解决方法:1)进入主板bios设置,开启cpu ...
- js强大的日期格式化函数,不仅可以格式化日期,还可以查询星期,一年中第几天等
js强大的日期格式化,timestamp支持10位或13位的时间戳,或是时间字符串,同时支持android ios的处理,不只是日期的格式化还有其它方法,比如获 获取某月有多少天 .获取某个日期在这一 ...