学完了前面的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)--入门的更多相关文章

  1. Compass 更智能的搜索引擎(2)--进阶

    经过了Compass 更智能的搜索引擎(1)–入门的学习,想必对于Compass的使用有了更深的认识了吧.下面谈点更加切合实际开发的东西.那就是CRUD. 面向对象的分页 dao层实现 代码释义 优点 ...

  2. Compass 更智能的搜索引擎(3)--高亮,排序,过滤以及各种搜索

    要想使得一个搜索系统更加的完美,查询精确度和页面显示算是其中比较重要的两个方面.今天,我们就来谈谈怎么使得我们的搜索系统更加的完美. 关于分词 下载地址 配置 关于高亮 关于排序 原理 冗余字段 使用 ...

  3. 《SEO教程:搜索引擎优化入门与进阶(第3版)》

    <SEO教程:搜索引擎优化入门与进阶(第3版)> 基本信息 作者: 吴泽欣 丛书名: 图灵原创 出版社:人民邮电出版社 ISBN:9787115357014 上架时间:2014-7-1 出 ...

  4. iPad版微信终于来临了 微信5.4版搜索更智能 转账就是发消息

    等待甚久的iPad版微信终于来临了!昨日微信iOS版本更新至5.4.0.16,新增功能包括搜索公众号.识别图中二维码.面对面收钱,同时适配iPad.(微信5.4安卓版重回ios风格 导航菜单都放底栏位 ...

  5. C# .NET更智能的数据库操作的封装

    前述: 对数据库操作的封装,相信网络上已经有一大堆,ORM框架,或者是.NET本身的EF,都很好的支持数据库操作.这篇文章是分享自己所思考的,对数据库操作的简单封装.我对于这篇文章,认为被浏览者所关注 ...

  6. 全文搜索引擎Elasticsearch入门实践

    全文搜索引擎Elasticsearch入门实践 感谢阮一峰的网络日志全文搜索引擎 Elasticsearch 入门教程 安装 首先需要依赖Java环境.Elasticsearch官网https://w ...

  7. 全文搜索引擎 Elasticsearch 入门

    1. 百科 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearch是用Java开发的,并作 ...

  8. 使用OpenAPI构建更智能的API

    像OpenAPI这样的API描述规范是一个关键工具,您应该尽可能地将其好好掌握,记录和执行API的工作由计算机和开发人员完成:OpenAPI 3.0现在允许额外的表现力,可以让机器为我们做更多有用的工 ...

  9. Win10系统升级更新方式将会更智能

    使用Win10系统的你肯定遇到过在工作时开始自动更新而不得不搁置工作的情况,想必你也已经被Win10系统的自动更新折磨不已,不过这种情况将会马上得到改观. 微软现在已经开始寻找更智能的版本升级更新方式 ...

随机推荐

  1. [HEOI2015]小Z的房间

    Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含n*m个格子的格状矩形,每个格子是一个房间或者是一个柱子.在一开始的时候,相邻的格子之间都有墙隔着. ...

  2. hdu 5438(拓扑+bfs)

    题意:建图,删掉所有连接点小于2的点,直到不能删为止,问最后剩余的联通块中,点的数量是奇数的联通块中的点的权值和. 思路:拓扑删点,bfs计算 #include <iostream> #i ...

  3. Linux中LCD设备驱动-framebuffer(帧缓冲)【】

    转自:https://blog.csdn.net/linux_devices_driver/article/details/7079442 1.framebuffer 帧缓冲     帧缓冲(fram ...

  4. 从零安装Scrapy心得 | Install Python Scrapy from scratch

    1. 介绍 Scrapy,是基于python的网络爬虫框架,它能从网络上爬下来信息,是data获取的一个好方式.于是想安装下看看. 进到它的官网,安装的介绍页面 https://docs.scrapy ...

  5. 使用PL/SQL Developer连接远程DB(本机不安装Oracle客户端)

    本文内容亲测可行环境:    服务端:centos6.7 ,oracle 11g r2 ,动态注册,监听端口号:1521    用户端:win7 ,没有安装ORACLE及其客户端 准备文件:plsql ...

  6. Requests库介绍

    Requests 是用Python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库.它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTT ...

  7. mongo数据删除和游标

    数据删除 db.集合.remove(删除条件,是否只删除一个数据);默认删多条(false)true删除一条db.集合.remove({}) 删除所有元素但集合还在db.集合.drop() 删除集合 ...

  8. python学习之路网络编程篇(第四篇)

    python学习之路网络编程篇(第四篇) 内容待补充

  9. IPFS星际文件系统

    IPFS星际文件系统(InterPlanetary File System)是去中心化文件系统,本文介绍IPFS节点软件系统安装,环境搭建等简介入门教程,及学习如何使用ipfs-api和Node.js ...

  10. 网络流24题第一题(luogu2796飞行员配对方案)

    飞行员配对方案 二分图裸题,可以拿最大流怼. 题目背景 第二次世界大战时期.. 题目描述 英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的2 ...