`
wangwanbao
  • 浏览: 20586 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

使用装饰器模式构建Lucene的搜索

阅读更多

 

  一、Java IO中的装饰器模式:

     良好的设计模式可以更好的扩充,“开闭原则”是指对新功能开放,对原有代码封闭。我理解为纵向扩展,在尽量不改变原代码的前提下进行扩展新功能,典型的装饰器例子有java IO包中的大家耳熟能详的代码:

     

BufferedReader bufReader=new BufferedReader(new InputStreamReader(new FileInputStream(new File("test.txt")))); 

    我们看上面的一句代码,

    FileInputStream对new File("text.txt")进行了装饰!

    InputStreamReader对FileInputStream进行了装饰!

    BufferedReader对InputStreamReader进行了装饰! 

    我们假设现在对一个文件全部转换成 小写 字母,那么我们需要构购一个,那么上述的代码可 

    以改成:

BufferedReader bufReader=new BufferedReader(new InputStreamReader(new FileInputStream(new FileLowCaseStream(new File("test.txt"))))); 

 

   

二、我们的应用:

     大家都用过51Job找过工作吧,假设现在找工作的Server业务层里有这几个搜索

      1)前缀搜索:如有公司名为“腾迅网络”,那么,应该支持用户输入“腾迅”。(PrefixQuery)

      2)准确搜索:搜索关键字为“java”(TermQuery)

      3)范围搜索:搜索“某天到某到”,(RangeQuery)

     4)模糊搜索:通过公司地址,“深圳”,也能搜索到“腾迅网络”(FuzzyQuery)

 

三、代码如下:

      1)构建一个BaseQuery,主要提供类型一致,它是一个抽象类。

      

public abstract class BaseQuery {
	public abstract BooleanQuery getQuery();
}

   

     2)构建SearchQuery,它是我们上面提到的四种搜索的父类。

     

public abstract class SearchQuery extends BaseQuery {
	
	protected BaseQuery baseQuery;

	public abstract Query setQuery();

	@Override
	public BooleanQuery getQuery() {
		BooleanQuery booleanQuery;
		if (null == baseQuery)
			booleanQuery = new BooleanQuery();
		else
			booleanQuery = baseQuery.getQuery() == null ? new BooleanQuery()
					: baseQuery.getQuery();
		Query query = setQuery();
		booleanQuery.add(query, Occur.MUST);
		return booleanQuery;
	}
}

 

   3)分别构建上面四种搜索:

 

public class FuzzyTemplateQuery extends SearchQuery {

	protected String queryValue;

	protected String attribute;
	@Override
	

 public Query setQuery() {
		return new FuzzyQuery(new Term(attribute,queryValue));
	}

}

   

   上面代码,attribute是存进索引的键,queryValue是客户端输入的搜索的值。

 同样的,构建其它三另的搜索只需重载一下setQuery即可,下面一并给出代码:

 

//前缀搜索,PrefixQuery
	@Override
	public Query setQuery() {
		return new PrefixQuery(new Term(attribute,queryValue));
	}

//准确搜索 TermQuery
	@Override
	public TermQuery setQuery() {
		return new TermQuery(new Term(attribute,queryValue));
	}

//范围搜索,RangeQuery,注意范围搜索有起始值和结束值
	@Override
	public Query setQuery() {
		Term start = new Term(attribute,startValue);
		Term end = new Term(attribute,endValue);
		Query rangeQuery = new RangeQuery(start,end,bound);
		return rangeQuery;
	}

//针对RangeQuery我们还可以加上边界的设定
public BaseQuery setBound(boolean bound) {
		this.bound = bound;
		return this;
	}

 

四、通过四种类型构造查询,如查找公司名称,它继承自PrefixTemplateQuery

 

	public class CorporationQuery extends  prefixQuery {
                           public CompanyQuery(String queryValue, BaseQuery baseQuery) {
		this.attribute = "companyField";//设置索引中的key
		this.queryValue = queryValue;
		this.baseQuery = baseQuery;
	}

               }

  其实做到这一步,就已经很容易了,只需要一个构造函数完成值的设置就行了。其它的就不举例了。分别继承再设值就好了。

 

五、写客户端的代码。

    

BaseQuery base = new CorporationQuery("腾讯",null);

  

    那如果同时要查询腾讯公司的java职位呢?

 

   

BaseQuery base = new CorporationQuery("腾讯",null);
base  = new JobQuery("java",base);

    我们注意到,先构建一个query,搜索“腾讯”公司的,然后再构建JobQuery来装饰CorporationQuery。

    至此我们完成了装饰器来动态增加搜索,尊循了开闭原则。

 

 

分享到:
评论

相关推荐

    Lucene3.0_pdf

    - **迭代器模式**:在遍历索引时,如TermEnum和DocsAndPositionsEnum,使用了迭代器模式来遍历文档和位置信息。 - **工厂模式**:用于创建Analyzer、IndexWriter和Searcher等对象,简化了不同配置的实例化过程。 ...

    lucene-2.9.3-src.zip

    - **装饰器模式**:Analyzer和Filter类可以组合使用,形成一个装饰器链,增加新的处理逻辑。 4. **高级特性**: - **评分系统(Scoring)**:Lucene通过TF-IDF算法计算相关度,决定搜索结果的排序。 - **过滤器...

    IKAnalyzer中文分词器V3.1.1使用手册

    ### IKAnalyzer中文分词器V3.1.1使用手册 #### 1. IKAnalyzer 3.1.1 介绍 IKAnalyzer是一个基于Java语言开发的开源轻量级中文分词工具包。自2006年12月发布1.0版本以来,IKAnalyzer已经经历了多个版本的迭代,不断...

    IKAnalyzer中文分词器

    4. **Lucene查询优化**:IKAnalyzer内置了针对Lucene全文检索优化的查询分析器IKQueryParser,利用歧义分析算法优化搜索关键字的排列组合,有效提升Lucene检索的准确性和速度。 #### 二、分词效果示例 通过几个...

    学习相关,包括spring-cloud、elasticsearch、zookeeper、数据结构和算法

    Elasticsearch是一款开源的全文搜索引擎,基于Lucene构建。它不仅用于全文搜索,还可用于实时数据分析。Elasticsearch提供了一个分布式、 RESTful 风格的搜索和分析引擎,可用于处理大量结构化和非结构化数据,并...

    ASP.NET某中学图书馆系统的设计与实现(源代码+论文).zip

    项目可能遵循SOLID原则,使用面向对象的设计模式,如工厂、单例、装饰器等。 10. **论文部分**:论文将详细阐述系统的设计思路、技术选型、实施过程、遇到的问题及解决方案,对理解和学习该项目有重要参考价值。 ...

    自动搜寻

    9. **设计模式**:在构建复杂系统时,应用设计模式如工厂模式、观察者模式或装饰器模式可以提高代码的可读性和可维护性。 10. **测试和调试**:JUnit和Mockito等Java测试框架可以帮助开发者确保搜索功能的正确性和...

    java3年工作经验简历_java简历.doc

    他熟悉装饰器、单例和工厂等主流设计模式,同时对PHP和C语言有所涉猎。 2. **开发工具与版本控制**:熟练使用Eclipse、MyEclipse、IntelliJ IDEA等IDE,能够运用SVN进行版本控制,了解Maven项目构建。 3. **...

    Java个人简历模板26.doc

    - 熟悉Lucene和Compass全文搜索引擎工具包。 - 了解Web Service技术。 - 熟练运用POI开发,处理Excel数据。 - 熟练使用SVN和Maven进行项目管理和构建。 - 熟悉Linux常用命令。 9. **项目经验**: - 在裕隆...

    姓名_javaEE软件工程师_2年_模板(50).doc

    在Java技术方面,景鑫熟练掌握了初级和高级的Java知识,包括反射、泛型和代理等技术,并且熟悉面向对象编程思想和多种设计模式,如单例、装饰、策略、模板、工厂和观察者模式。在Java Web领域,他熟练运用JSP、...

    Java个人简历模板32.doc

    12. **全文搜索引擎**:了解Lucene和Compass,它们是用于实现高效全文搜索的工具。 13. **Web Service**:具备Web服务技术基础,能够创建和消费SOAP或RESTful服务。 14. **POI开发**:熟悉Apache POI库,用于读写...

    Java个人简历模板33.doc

    14. **全文搜索引擎**:Lucene和Compass是全文搜索引擎工具,用于快速索引和搜索文本数据。 15. **Web Service**:一种通过HTTP协议传输数据的服务,用于不同系统间的互操作。 16. **POI**:Apache POI是一个用于...

    Java个人简历模板4.doc

    1. **基础Java知识**:开发者精通Java初级技术,如反射、泛型和代理,同时有面向对象编程经验,并熟知常用设计模式,如单例、装饰、工厂和代理模式。 2. **Java Web技术**:熟练运用JSP、Servlet、Filter、Listener...

    程序员面试个人简历(JAVA).doc

    他具备扎实的面向对象编程思维,熟悉多种Java设计模式,如单例、装饰、策略、模板、工厂和观察者模式。这表明他对Java编程有深入的理解,并能在实际开发中灵活应用。 在JavaWeb技术上,他熟练掌握JSP、Servlet、...

    阿里腾讯京东等互联网面试-高级资深开发工程师P7.pdf

    - 常见设计模式如工厂模式、单例模式、装饰器模式等,代理模式分为静态和动态代理。 19. **面向切面编程(AOP)**: - AOP用于将关注点(如日志、事务管理)与核心业务逻辑分离。 以上知识点是高级开发工程师...

    Java开发个人简历模板27.doc

    他们有强烈的面向对象编程思想,熟悉各种设计模式,如单例、装饰、策略、模板、工厂和观察者模式。 2. **Java Web技术**:掌握JSP、Servlet、Filter、Listener、Cookie、Session、EL表达式和JSTL等,对HTTP协议有...

Global site tag (gtag.js) - Google Analytics