今天看了搜索的相关知识,了解了几种搜索方法。下面来总结一下:
主要有两类方法:一类是创建Term,然后以Term为参数构建****Term
1、词条搜索:TermQue
方法示例:Term t=new Term(String field,String keyword);
TermQuery q=new TermQuery(t);
2、组合搜索:BooleanQuery
方法实例:Term t1=new Term(String field,String keyword);
TermQuery q1=new TermQuery(t1);
Term t2=new Term(String field,String keyword);
TermQuery q2=new TermQuery(t2);
BooleanQuery q=new BooleanQuery();
q.add(q1,BooleanClause.Occur.MUST)MUST代表必须含有;
q.add(q2,BooleanClause.Occur.Not_MUST);Not_MUST代表一定不含有;SHOULD表可以有
3、范围搜索:RangeQuery
方法实例:Query query=new TermRangeQuery(String field,String start,String end,Boolean inclusive,Boolean inclusive);
4、前缀搜索:PrefixQuery
方法实例:Term t=new Term(String field,String keyword);
Query q=new PrefixQuery(t);
5、短语搜索:PhraseQuery(可以设置匹配度)
方法示例:Term t1=new Term(String field,String keyword);
Term t2=new Term(String field,String keyword);
PhraseQuery q=new PhraseQuery();
q.setslop(int num);//设置t1中的keyword和t2中的keyword之间的单词数
q.add(t1);
q.add(t2);
6、多短语搜索:MultiPhraseQuery
方法示例:Term t=new Term(String field,String keyword);
Term t1=new Term(String field,String keyword);
Term t2=new Term(String field,String keyword);
MultiPhraseQuery q=new MultiPhraseQuery();
q.add(t);//统一前缀
q.add(new Term[]{t1,t2});//后缀
7、模糊搜索:FuzzyQuery
方法实例: Term t=new Term(String field,String keyword);
FuzzyQuery q=new FuzzyQuery(t,float f);
8、通配符搜索:WildcardQuery
方法实例:Term t=new Term(String field,String keyword*);
WildcardQuery q=new WildcardQuery(t);
常用*表示任意多个字符,用?表示任意一个字符
恩,今天有点晚了,另一类方法明天写。
我用TermQuery和FuzzyQuery写了一个程序,可是运行不出结果来,郁闷啊!
以下是代码,帮忙找找错哈!
package MySearcher;
import java.io.File;
import java.io.IOException;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.FuzzyQuery;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.store.LockObtainFailedException;
import org.apache.lucene.util.Version;
import org.wltea.analyzer.lucene.IKAnalyzer;
public class FuzzySearcher
{
private final static Analyzer analyzer=new IKAnalyzer();
private static String ids[]={"01","02","03","04","05","06","07","08","09","10"};
private static String names[]={"Lucy","Lily","Jerry","Mike","Tom","王琪琪","李木子","王聪聪","张小花","猪猪"};
private static String address[]={"王大街","Green Street","White Streen","主大街","金晶大道","王府井","House Avenue","洪沟小区","张家界","Living Avenue"};
public static void main(String[] args) throws IOException ,CorruptIndexException
{
String f="address";
String s="王大街";
int num=10;
index();
System.out.println("精确搜索的结果为");
searcher1(f,s, num);
System.out.println("模糊搜索的结果为");
searcher2(f,s,num);
}
public static void index() throws CorruptIndexException, LockObtainFailedException, IOException
{
Directory directory=FSDirectory.open(new File("f:Lucene/Index_04"));
IndexWriterConfig iwc=new IndexWriterConfig(Version.LUCENE_35,analyzer);
IndexWriter writer=new IndexWriter(directory,iwc);
for(int i=0;i<ids.length;i++)
{
Document doc=new Document();
doc.add(new Field("id",ids[i],Field.Store.YES,Field.Index.NOT_ANALYZED));
doc.add(new Field("name",names[i],Field.Store.YES,Field.Index.ANALYZED));
doc.add(new Field("address",address[i],Field.Store.YES,Field.Index.ANALYZED));
writer.addDocument(doc) ;
}
writer.close();
}
public static void searcher1(String f,String s,int num) throws IOException,CorruptIndexException
{
Directory directory=FSDirectory.open(new File("f:Lucene/Index_04"));
IndexReader reader= IndexReader.open(directory);
IndexSearcher searcher=new IndexSearcher(reader);
Term t=new Term(f,s);
TermQuery query=new TermQuery(t);
TopDocs tds=searcher.search(query,num);
int total=tds.totalHits;
System.out.println("共搜索到"+total+"条结果");
ScoreDoc[] sds=tds.scoreDocs;
for(ScoreDoc sd:sds)
{
Document doc=searcher.doc(sd.doc);
System.out.println(doc.get("id")+doc.get("name")+doc.get("address"));
}
searcher.close();
}
public static void searcher2(String f,String s,int num) throws CorruptIndexException, IOException
{
Directory directory=FSDirectory.open(new File("e:Lucene实例/Index_01"));
IndexReader reader= IndexReader.open(directory);
IndexSearcher searcher=new IndexSearcher(reader);
Term t=new Term(f,s);
FuzzyQuery query=new FuzzyQuery(t,0.3f);
TopDocs tds=searcher.search(query,num);
int total=tds.totalHits;
System.out.println("共搜索到"+total+"条结果");
ScoreDoc[] sds=tds.scoreDocs;
for(ScoreDoc sd:sds)
{
Document doc=searcher.doc(sd.doc);
System.out.println(doc.get("id")+doc.get("name")+doc.get("address"));
}
reader.close();
searcher.close();
}
}