Compass 更智能的搜索引擎(1)--入门

学完了前面的Lucene系列教程:

Lucene确实是个好东西,适用性也很强。但是需要对待索引的数据手动的封装,每次都需要从底层开始一点点的设计。对于一个工作量很大的项目而言,简直就是噩梦。所以,我们对于Lucene,了解其工作原理就行了。实际中开发靠得住的还是易用性强的框架。这同时也给我们这些开发人员提了个醒不是?易用.下面就来分享一个更好用的全文搜索框架。Compass,一个基于Lucene而又高于Lucene的好框架!
20160802213148233



准备工作

引入Compass

由于Compass是基于Lucene的,所以我们需要引入Lucene的支持。文中可以看到lucene的文件夹。
Lucene依赖

最后一点,那就是对于中文支持的依赖。使用适合汉语特点的分词器将能大大的提高我们的全文搜索的精准度。
适合汉语的Lucene拓展分词器下载

Compass工作原理

图解工作原理。

引用网上的一张图。
Compass工作原理

Compass和Hibernate的对比

主配置对比分析HibernateCompass
主配置文件名称hibernate.cfg.xmlcompass.cfg.xml
主配置文件所在目录src目录src目录
连接信息数据库的连接信息索引库的连接信息<connection><file path="indexDir"></connection>
声明映射文件mapper标签声明mapping标签声明,标注Bean的全名即可
其他配置二级缓存,显示SQL语句,自动建表等其他配置,分词器、高亮器等

Compass工作流程

Created with Raphaël 2.1.0加载配置信息`Configuration cfg = new Configuration().configure(); //默认加载hibernate.cfg.xml`获得Session对象`SessionFactory sessionFactory =cfg.buildSessionFactory(); //全局唯一`借助session对象完成业务逻辑,包括过滤,排序,各种查询等等`Session session = sessionFactory.openSession();`归还session对象,资源`session.close(); //关闭session`完成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的入门级的使用了。是不是很方便呢?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值