分享

lucene--过滤器- 对搜索结果进行过滤

 CevenCheng 2012-05-12
lucene--过滤器--转


http://hi.baidu.com/lewutian

1、使用过滤可以缩小搜索空间,把可能的搜索匹配结果限制在所有文档的一个子集中。

2、内置了三个Filter子类:

1)DateFilter使搜索只限于指定的日期域的值在某一时间范围内的文档空间里

2)QueryFilter把查询结果做为另一个新查询可搜索的文档空间

3)CachingWrappperFilter是其他过滤器的装饰器,将结果缓存起来以便再次使用,从而提高性能。

3、DateFiler

此过滤器仅过滤,但不能缓存,如果重复使用DateFilter,Lucene每次都会重新进行日期过滤.导致性能下降.

下例中modified域索引为Keyword

public class FilterTest extends testcase{

private Query allBooks;

private Indexsearcher searcher;

private int numAllBooks;

protected void setUp() throws Exception{

super.setUp();

allBooks=new RangeQuery(new Term("pubmonth","190001"),new Term("pubmonth","200512"),true);

searcher=new IndexSearcher(directory);

Hits hits=searcher.search(allBooks);

numAllBooks=hits.length();
}

public void testDateFilter() throws Exception{

Date jan1=parseDate("2004 Jan 01");

Date jan31=parseDate("2004 Jan 31");

Date dec31=parseDate("2004 Dec 31");

//过滤指定日期范围

DateFilter filter=new DateFilter("modified",jan1,dec31);

Hits hits=searcher.search(allBooks,filter);

assertEquals("all modified in 2004",numAllBooks,hits.length());

//过滤某一端日期边界不确定,使用静态方法

filter=DateFilter.Before("modified",jan31);//在jan31结束的结果

filter=DateFilter.After("modified",jan31);//从jan31开始的结果

}

}

4、QueryFilter

提供缓存功能,做为过滤结果将被缓存起来,以后使用同一个QueryFilter对象或IndexSearcher对象进行搜索时,优化性能。

public void testQueryFilter() throws Exception{

TermQuery categoryQuery=new TermQuery(new Term("category","/philosophy/eastern"));

Filter categoryFilter=new QueryFilter(categoryQuery);

Hits hits=searcher.search(allBooks,categoryFilter);

}

下面使用QueryFilter完成DateFilter功能,并且具有缓存功能

public void testQueryFilterRange() throws Exception{

Date jan1=parseDate("2004 Jan 01");//返回date对象;

Date dec31=parseDate("2004 Dec 31");

Term start=new Term("modified",DateField.dateToString(jan1));

Term end=new Term("modified",DateField.dateToString(dec31));

Query rangeQuery=new RangeQuery(start,end,true);

Filter filter=new QueryFilter(rangeQuery) ;

Hits hits=searcher.search(allBooks,filter);
}

下面使用QueryFilter完成通过过滤器使搜索结果文档限定在指定范围内

public void testrangefilter throws Exception{

directory=new RAMDirectory();

setUp();

TermQuery query=new TermQuery(new Term("kword","info"));

IndexSearcher searcher=new IndexSearcher(directory);

Hits hits=searcher.search(query);//所以kword域含info的文档

QueryFilter jakeFilter=new QueryFilter(new TermQuery(new Term("owner","jake")));

hits=searcher.search(query,jakeFilter);//所有owner域为jake的且kword域含info的文档

}

5、QueryFilter的替代方案

public void testFilter throws Exception{

TermQuery categoryQuery=new TermQuery(new Term("category","/philosophy/eastern"));

BooleanQuery conQuery=new BooleanQuery();

conQuery.add(allBooks,true,false);

conQuery.add(categoryQuery,true,false);

Hits hits=searcher.search(con1uery);

}

6、缓存过滤器结果

对于某此不具有缓存功能的过滤器来说,将它们馐到CachingWrapperFilter中后,Lucene会自动对非缓存过滤器的结果进行缓存(没有被引用的条目会被垃圾收集器清理)。

使用同一个IndexReader实例是使用过滤器缓存的关键。当索引的改变需要体现在搜索过程中时,就需要丢弃原来创建的IndexSearcher实现和IndexReader实例,将它们重新实例化

public void testcachingWrappper() throws Exception{

Date jan1=parseDate("2004 Jan 01");

Date dec31=parseDate("2004 Dec 31");

DateFilter datefilter=new DateFiler("modified",jan1,dec31);

cachingFilter=new CachingWrapperFilter(datefilter);

Hits hits=searcher.search(allBooks,cachingFilter);

}

7、其他非内置的过滤器,在SandBox工具包中提供

1)ChainedFilter组成复杂的过滤器链。

2)FilteredQuery可以对某个查询进行过滤,因为在BooleanQuery对象中,它可做为一个单独查询子句,在不表示查询子句时,它又跟普通的search(Query,Filter)方法所具备的功能是一样的


http://hi.baidu.com/lewutian推荐文章:
1. 翻译:如何提高和优化Lucene索引速度
2. lucene检索txt文件
3. Apache Lucene - 构建和安装演示
4. lucene demo
5. lucene 全文检索数据库
6. Lucene 索引数据库(转载)
7. Lucene通过缩小搜索结果集来提升性能
8. lucene的例子.请学习的朋友来看看.
9. 1
10. 1
11. 1
12. 使用领域模型(domain object)来进行索引、搜索
13. Web内容挖掘——文本分类
14. PHP开源免费的简易中文分词系统
15. VC MFC中设置对话框的背景色、背景图片

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多