`

超轻量级全文搜索框架的设计和实现

阅读更多

Lucene是Java领域最出色的全文搜索引擎,然而其API比较复杂,并且有严格的线程同步模型,直接使用不易。Compass则是封装了Lucene的一个OSEM:Object-SearchEngine Mapping,与Hibernate封装JDBC类似,然而过于复杂,支持的Lucene版本较低,在www.javaeedev.com发现雪峰开发一个类似Compass的简单封装Lucene的全文搜索框架,支持最新版本Lucene和Java 5泛型代码,用户通过简单的代码即可对自定义Bean进行搜索:

List<T> list = Searcher.search(Class<T>, String q, Page page);

下载地址:

http://code.google.com/p/lightweight-search/downloads/list

 

 

 

下面介绍下简单的用法:

 

1.自定义Bean,例如:Article

import com.javaeedev.lightweight.search.Index;
import com.javaeedev.lightweight.search.SearchableId;
import com.javaeedev.lightweight.search.SearchableProperty;
import com.javaeedev.lightweight.search.Store;

/**
 * Article bean that can be searched.
 *
 * @author Xuefeng
 */
public class Article {

    private String id;
    private String title;
    private String author;
    private String content;

    @SearchableId
    public String getId() {
        return id;
    }

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

    @SearchableProperty(store=Store.YES, index=Index.TOKENIZED, boost=3.0f)
    public String getTitle() {
        return title;
    }

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

    @SearchableProperty(store=Store.YES, index=Index.TOKENIZED, boost=2.0f)
    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    @SearchableProperty(store=Store.YES, index=Index.TOKENIZED)
    public String getContent() {
        return content;
    }

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

其中特别的地方就是@SearchableId和@SearchableProperty

@SearchableId是描述lucene索引的ID

@SearchableProperty是描述lucene索引域的

以上二属性的详细信息请查询lucene,应为此框架的原理仅仅是对lucene的封装。
2.实现全文全文搜索

有两种方法:

        一 直接用行,所需参数在调用类中配置,例如:

import com.javaeedev.lightweight.common.Page;
import com.javaeedev.lightweight.search.Searcher;
import com.javaeedev.lightweight.search.SearcherProvider;

/**
 * Run directly.
 * 
 */
public class Run {

    @SuppressWarnings("unchecked")
    public static void main(String[] args) {
        // define classes that can be searched:
        Set<Class> searchableClasses = new HashSet<Class>();
        searchableClasses.add(Article.class);
        // init a provider:
        SearcherProvider provider = new SearcherProvider("./index-location", searchableClasses);
        provider.setAnalyzer(new StandardAnalyzer());
        provider.setHighlightPre("<b>");
        provider.setHighlightPost("</b>");
        // get a searcher:
        Searcher searcher = provider.get();
        // now do all search work with "searcher" object:
        // first add new Articles:
        Article a = new Article();
        a.setId(UUID.randomUUID().toString());
        a.setTitle("How to use lightweight search?");
        a.setAuthor("Liao Xuefeng");
        a.setContent("Lightweight search project is an open source project that using Lucene but simplify full text search.");
        searcher.index(a);
        // now search:
        Page page = new Page(1);
        List<Article> articles = searcher.search(Article.class, "lightweight", page);
        System.out.println("Results: " + page.getTotalCount());
        for(Article article : articles) {
            System.out.println(article.getTitle() + " by " + article.getAuthor());
        }
    }

}

(注意:请注意其代码中的注释部分)

       二 借助于Guice注入(相关Guice的资料

    借助于Guice注入,首先要做的就是初始化Guice

import com.google.inject.Module;
import com.google.inject.name.Names;
import com.javaeedev.lightweight.search.Searcher;
import com.javaeedev.lightweight.search.SearcherProvider;

/**
 * Init Google Guice IoC Container.
 * 

 */
public class MyModule implements Module {

    @SuppressWarnings("unchecked")
    public void configure(Binder binder) {
        binder.bindConstant().annotatedWith(Names.named("HighlightPre")).to("<span class=\"highlight\">");
        binder.bindConstant().annotatedWith(Names.named("HighlightPost")).to("</span>");
        binder.bindConstant().annotatedWith(Names.named("IndexLocation")).to("./index-location");
        Set<Class> set = new HashSet<Class>();
        set.add(Article.class);
        binder.bind(new Key<Set<Class>>(Names.named("SearchableClasses")) {}).toInstance(set);
        binder.bind(Analyzer.class).to(StandardAnalyzer.class).asEagerSingleton();
        binder.bind(Searcher.class).toProvider(SearcherProvider.class).asEagerSingleton();
    }

}
其次创建调用

import java.util.List;
import java.util.UUID;

import com.google.inject.Guice;
import com.google.inject.Injector;
import com.javaeedev.lightweight.common.Page;
import com.javaeedev.lightweight.search.Searcher;

/**
 * Run demo with Google Guice as IoC container.
 *
 * @author Xuefeng
 */
public class RunWithGuice {

    public static void main(String[] args) {
        Injector injector = Guice.createInjector(new MyModule());
        Searcher searcher = injector.getInstance(Searcher.class);
        // now do all search work with "searcher" object:
        // first add new Articles:
        Article a = new Article();
        a.setId(UUID.randomUUID().toString());
        a.setTitle("How to use lightweight search?");
        a.setAuthor("Liao Xuefeng");
        a.setContent("Lightweight search project is an open source project that using Lucene but simplify full text search.");
        searcher.index(a);
        // now search:
        Page page = new Page(1);
        List<Article> articles = searcher.search(Article.class, "lightweight", page);
        System.out.println("Results: " + page.getTotalCount());
        for(Article article : articles) {
            System.out.println(article.getTitle() + " by " + article.getAuthor());
        }
    }

分享到:
评论
1 楼 ymgoodboy 2008-09-22  
死涛涛,哈哈

相关推荐

    超轻量级MVC框架的设计和实现(源码)

    在这个超轻量级框架中,设计可能会包括以下特点: - **简单的路由机制**:控制器如何响应HTTP请求可能是通过注解定义的,例如,使用`@RequestMapping`来关联URL路径和处理方法。 - **自动的依赖注入**:框架可能...

    Biny腾讯开源高性能超轻量级PHP框架

    其中,Biny脱颖而出,它是一款由腾讯开源的高性能、超轻量级PHP框架,专为快速构建现代Web应用程序而设计。Biny以其简洁优雅的代码和易于理解的架构,吸引了许多开发者的眼球。 **框架概述** Biny遵循经典的MVC...

    PHP实例开发源码-BroPHP框架 免费开源的超轻量级PHP框架正式版.zip

    PHP实例开发源码—BroPHP框架 免费开源的超轻量级PHP框架正式版.zip PHP实例开发源码—BroPHP框架 免费开源的超轻量级PHP框架正式版.zip PHP实例开发源码—BroPHP框架 免费开源的超轻量级PHP框架正式版.zip

    基于PHP的BroPHP框架免费开源的超轻量级PHP框架正式版源码.zip

    这个框架的核心特性体现在其超轻量级的设计,使得它在资源消耗和性能优化方面表现出色。在这款框架中,你可以发现许多现代Web开发的最佳实践,例如MVC(模型-视图-控制器)架构模式、路由系统、依赖注入等。 1. MVC...

    C# MVC+layui.js超轻量级框架(包含数据库)

    总的来说,"C# MVC+layui.js超轻量级框架(包含数据库)"提供了一个开箱即用的解决方案,适合初学者和有一定经验的开发者快速搭建功能完善的Web应用。通过C# MVC的后端控制和layui.js的前端呈现,结合SQLSugar的...

    基于PHP的BroPHP框架 免费开源的超轻量级PHP框架 正式版.zip

    9. **性能优化**:BroPHP的超轻量级设计意味着它有较低的内存占用和较快的执行速度。同时,框架允许开发者通过缓存策略进一步提升性能,例如使用文件缓存或Memcached、Redis等内存缓存。 10. **社区与文档**:作为...

    iOS 超轻量级框架 MJExtension.zip

    iOS 超轻量级框架 MJExtension ,MJExtension 是 JSON 和模型之间最快捷方便的转换。

    MiniFramework是一款支持MVC的超轻量级PHP开源框架

    在MiniFramework中,开发者可以轻松实现应用的分层结构,将业务逻辑、数据处理和用户界面分离,从而更好地管理和维护代码。 **MVC模式详解:** MVC模式是软件工程中一种广泛使用的架构模式,用于组织和分离应用程序...

    基于PHP的BroPHP框架 免费开源的超轻量级PHP框架正式版.zip

    1. **轻量级设计**:BroPHP框架的轻量化设计使得它在项目初期就能快速上手,降低了学习曲线,特别适合小型和中型项目。这种设计理念让开发者能更专注于业务逻辑,而非框架本身的复杂性。 2. **MVC模式**:BroPHP...

    PHP实例开发源码—BroPHP框架 免费开源的超轻量级PHP框架 正式版.zip

    BroPHP作为一款超轻量级框架,它的核心特性主要体现在以下几个方面: 1. **路由系统**:BroPHP框架采用直观的路由定义方式,允许开发者通过简单的规则来处理HTTP请求,实现URL与控制器方法的映射,方便地管理应用...

    QP-nano 是一种超轻量级的开源实时嵌入式框架 (RTEF),用于构建现代嵌入式 软件作为异步、事件驱动的活动对象系统

    QP-nano是一个针对嵌入式系统的超轻量级开源实时嵌入式框架(RTEF),专门设计用于构建异步、事件驱动的活动对象系统。这个框架的核心理念是利用活动对象(Active Object)的设计模式来解决嵌入式软件开发中的并发...

    机票预订系统,超轻量级WEB+ORM框架-JFinal框架实现.zip

    【适合场景】:相关项目设计中,皆可应用在项目开发、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面中 可借鉴此优质项目实现复刻,也可基于此项目来扩展开发...

    cpp-shineframe高性能超轻量级C开发库及服务器编程框架

    "cpp-shineframe高性能超轻量级C++开发库及服务器编程框架"是一个专为C++开发者设计的高效工具,其核心目标是简化在Linux和Windows平台上构建非阻塞、高并发服务器程序的过程。该框架充分利用了C++11的新特性,以...

    超轻量级物联网虚拟机.zip

    本文将深入探讨EVM(Embedded Virtual Machine),这是一种专为物联网环境设计的超轻量级虚拟机,它能够在资源受限的单片机上高效运行。 EVM的设计理念是简洁而高效。它采用通用的虚拟机架构,但经过精心优化以适应...

    ios-自定义超轻量级HUD.zip

    总之,"ios-自定义超轻量级HUD.zip"提供了一个基础的框架,帮助开发者快速实现简单的加载指示或者进度反馈功能,同时保持了代码的简洁性和项目的轻量化。开发者可以根据自身需求对其进行定制和优化,以适应项目的...

    stlog-用于资源受限设备的超轻量级日志记录框架-Rust开发

    stlog用于资源受限设备的超轻量级日志记录框架文档许可证,在Apache许可的2.0版下获得许可stlog用于资源受限设备的超轻量级日志记录框架,文档许可在Apache许可证,版本2.0之下获得许可(LICENSE-APACHE或...

    基于Vue3.0的乐聊超轻量级全平台聊天软件设计源码

    该项目是一款基于Vue3.0的乐聊超轻量级全平台聊天软件设计源码,共包含839个文件。其中,前端开发采用vue3.0、element plus、electron和TypeScript,支持Windows、Linux、Mac、安卓、iOS、小程序及H5平台。软件功能...

    antfarm:一个超轻量级的网络框架

    一个超轻量级的网络框架 为什么是另一个? 通常,欣赏您的工具的最佳方式是尝试不使用它们。 就像其他几个项目一样,这是我为了更好地理解我使用的工具所做的努力。 哲学 一个框架应该保护你免受两件事的影响: ...

    一款超轻量级通用人脸检测模型

    标题中的“一款超轻量级通用人脸检测模型”是指一种专为高效运行设计的人脸检测算法,它在保持高精度的同时显著降低了模型的大小和计算需求。这种模型特别适合资源有限的设备,如边缘计算设备和低算力硬件,以及个人...

Global site tag (gtag.js) - Google Analytics