来源:互联网
Filter顾名思义 就是用来过虑搜索结果的,在Lucene中有3个过虑器
1,DateFilter constrains the document space to only documents with a specified date field within a given range of dates.
2,QueryFilter uses the results of query as the searchable document space for a new query.
3,CachingWrapperFilter is a decorator over another filter caching its results to increase performance when used again.
import lia.common.LiaTestCase;
import org.apache.lucene.document.DateField;
005 import org.apache.lucene.index.Term;
006 import org.apache.lucene.search.BooleanQuery;
007 import org.apache.lucene.search.CachingWrapperFilter;
008 import org.apache.lucene.search.DateFilter;
009 import org.apache.lucene.search.Filter;
010 import org.apache.lucene.search.Hits;
011 import org.apache.lucene.search.IndexSearcher;
012 import org.apache.lucene.search.Query;
013 import org.apache.lucene.search.QueryFilter;
014 import org.apache.lucene.search.RangeQuery;
015 import org.apache.lucene.search.TermQuery;
016
017 import java.util.Date;
018
019 public class FilterTest extends LiaTestCase {
020 private Query allBooks;
021 private IndexSearcher searcher;
022 private int numAllBooks;
023 private CachingWrapperFilter cachingFilter;
024
025 protected void setUp() throws Exception {
026 super.setUp();
027
028 allBooks = new RangeQuery(new Term("pubmonth","190001"),
029 new Term("pubmonth", "200512"),
030 true);
031 searcher = new IndexSearcher(directory);
032 Hits hits = searcher.search(allBooks);
033 numAllBooks = hits.length();
034 }
035
036 public void testDateFilter() throws Exception {
037 Date jan1 = parseDate("2004-01-01");
038 Date jan31 = parseDate("2004-01-31");
039 Date dec31 = parseDate("2004-12-31");
040
041 DateFilter filter = new DateFilter("modified", jan1, dec31);
042
043 Hits hits = searcher.search(allBooks, filter);
044 assertEquals("all modified in 2004",
045 numAllBooks, hits.length());
046
047 filter = new DateFilter("modified", jan1, jan31);
048 hits = searcher.search(allBooks, filter);
049 assertEquals("none modified in January",
050 0, hits.length());
051 }
052
053 public void testQueryFilter() throws Exception {
054 TermQuery categoryQuery =
055 new TermQuery(new Term("category", "/philosophy/eastern"));
056
057 Filter categoryFilter = new QueryFilter(categoryQuery);////QueryFilter
058
059 Hits hits = searcher.search(allBooks, categoryFilter);
060 assertEquals("only tao te ching", 1, hits.length());
061 }
062
063 public void testFilterAlternative() throws Exception {
064 TermQuery categoryQuery =
065 new TermQuery(new Term("category", "/philosophy/eastern"));
066
067 BooleanQuery constrainedQuery = new BooleanQuery();
068 constrainedQuery.add(allBooks, true, false);
069 constrainedQuery.add(categoryQuery, true, false);
070
071 Hits hits = searcher.search(constrainedQuery);
072 assertEquals("only tao te ching", 1, hits.length());
073 }
074
075
076 public void testQueryFilterWithRangeQuery() throws Exception {
077 Date jan1 = parseDate("2004-01-01");
078 Date dec31 = parseDate("2004-12-31");
079
080 Term start = new Term("modified",
081 DateField.dateToString(jan1));
082 Term end = new Term("modified",
083 DateField.dateToString(dec31));
084
085 Query rangeQuery = new RangeQuery(start, end, true);
086
087 Filter filter = new QueryFilter(rangeQuery);
088 Hits hits = searcher.search(allBooks, filter);
089 assertEquals("all of 'em", numAllBooks, hits.length());
090 }
091
092 public void testCachingWrapper() throws Exception {
093 Date jan1 = parseDate("2004-01-01");
094 Date dec31 = parseDate("2004-12-31");
095
096 DateFilter dateFilter =
097 new DateFilter("modified", jan1, dec31);
098
099 cachingFilter =
100 new CachingWrapperFilter(dateFilter);
101 Hits hits = searcher.search(allBooks, cachingFilter);
102 assertEquals("all of 'em", numAllBooks, hits.length());
103 }
104 }