package org.sam.demo.lucene; import java.io.IOException; import java.util.BitSet; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.Term; import org.apache.lucene.index.TermDocs; import org.apache.lucene.search.Filter; /** * @author Sam * @copyright_code 123456789987654321 * @Date 2008-09-16 * */ public class DynamicFilter extends Filter{ public String fieldValue = ""; public String fieldKey = ""; public DynamicFilter(String fieldKey,String security_advanced) { super(); fieldValue = security_advanced; this.fieldKey = fieldKey; } @Override public BitSet bits(IndexReader reader) throws IOException { /* 这个是过滤一个指定Term 返回其他 */ final BitSet bits = new BitSet(reader.maxDoc()); /* 设置一个 bits 的大小 */ bits.set(0,bits.size()-1); Term term = new Term(fieldKey,fieldValue); TermDocs termDocs = reader.termDocs(term); while(termDocs.next()){ bits.set(termDocs.doc(),false); } return bits; /* 这个是返回一个指定的 Term */ /* BitSet result=new BitSet(reader.maxDoc()); Term term = new Term(this.fieldKey,this.fieldValue); TermDocs td=reader.termDocs(term); while (td.next()) { result.set(td.doc()); } return result; */ } } package org.sam.demo.lucene; import java.io.IOException; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.index.CorruptIndexException; import org.apache.lucene.index.Term; import org.apache.lucene.queryParser.ParseException; import org.apache.lucene.queryParser.QueryParser; import org.apache.lucene.search.BooleanClause; import org.apache.lucene.search.BooleanQuery; import org.apache.lucene.search.Hits; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; import org.apache.lucene.search.TermsFilter; /** * @author Sam * @copyright_code 123456789987654321 * @Date 2008-09-16 * */ public class AdvancedSearch { private final String PATH="E:/Lucene/Index6/"; /* 关于搜索lucene提供了很多类,基本上需要用的也不多,所以这里我就写一些比较常用的! */ public static void main(String[] args) throws CorruptIndexException, IOException, ParseException { String[] keys = {"state","city"}; String[] values = {"CA","Oakland"}; new AdvancedSearch().booleanSerach(keys,values); } public void booleanSerach(String[] keys,String[] values) throws CorruptIndexException, IOException, ParseException{ QueryParser qp = null; BooleanQuery bq = null; IndexSearcher search = new IndexSearcher(PATH); for(int i = 0 ; i < keys.length ; i++){ qp = new QueryParser(keys[i],new StandardAnalyzer()); Query tq = qp.parse(values[i]); bq = new BooleanQuery(); bq.add(tq, BooleanClause.Occur.MUST); } Term t = new Term("fname","Dirk"); TermsFilter tf = new TermsFilter(); tf.addTerm(t); Hits hits = search.search(bq,new DynamicFilter("fname","Dirk")); // Hits hits = search.search(bq,tf); System.out.println(hits.length()); for(int i = 0 ; i < hits.length() ;i++){ for(int j = 0 ; j < keys.length ; j++) System.out.print(hits.doc(i).get(keys[j])+" "); System.out.println(); } search.close(); } }