2012-10-09 17:52:57.0|分类: lucene|浏览量: 1764
|
创建searcher的过程 1、创建Directory 2、根据directory创建indexReader 3、根据indexReader创建indexSearcher 4、创建搜索的Query 5、根据searcher搜索并且返回TopDocs 6、根据TopDocs获取ScordDoc对象获取具体的Document对象 7、根据searcher和ScordDoc对象获取具体的Document对象 8、根据Document对象获取需要的值 9、关闭reader * 搜索
* */
public void searcher(){
try {
//1、创建Directory
Directory directory = FSDirectory.open(new File("D:/tools/lucene/index01"));
//2、根据directory创建indexReader
IndexReader indexReader = IndexReader.open(directory);
//3、根据indexReader创建indexSearcher
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
//4、创建搜索的Query
//创建parser来确定搜索文件的内容,第二个参数便是搜索的域
QueryParser parser = new QueryParser(Version.LUCENE_35, "context",new StandardAnalyzer(Version.LUCENE_35));
//创建query,表示搜索的域为context中的java的文档 。
String java = "java";
Query query = parser.parse("helloLucene");
//5、根据searcher搜索并且返回TopDocs
TopDocs tds = indexSearcher.search(query, 10);
//6、根据TopDocs获取ScordDoc对象获取具体的Document对象
ScoreDoc[] sds = tds.scoreDocs;
for(ScoreDoc scoreDoc : sds){
//7、根据searcher和ScordDoc对象获取具体的Document对象
Document d = indexSearcher.doc(scoreDoc.doc);
//8、根据Document对象获取需要的值
System.err.println(d.get("name")+"[]"+d.get("path"));
}
//9、关闭reader
indexReader.clone();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
上面的4步还可以写成下面的集中形式,但是他们对应的需求就会不同,要灵活运用。 (1) Query query = new TermQuery(new Term(field,name)); TopDocs tds = IndexSearcher.search(query, num);
TermQuery是精确查找,也就是说在Field中查找name (2) Query query = new TermRangeQuery(field,start,end,true, true); TopDocs tds = indexSearcher.search(query, num); term范围查找,举个例子:
就会在ids域中查找1到3的值,第三个参数表示是否包括1,第四个参数表示是否包括3,总起来说就是是否是闭区间。 注意:这种方法不能chazha (3) Query query = new PrefixQuery(new Term(field,value)); TopDocs tds = searcher.search(query, num);
根据前缀在域中查找 (4) Query query = new WildcardQuery(new Term(field,value)); TopDocs tds = searcher.search(query, num); 通配符查找:在传入的value中可以使用通配符:?和*,?表示匹配一个字符,*表示匹配任意多个字符 (5) BooleanQuery query = new BooleanQuery();
query.add(new TermQuery(new Term("name","zhangsan")), Occur.MUST_NOT);
query.add(new TermQuery(new Term("content","game")),Occur.SHOULD);
TopDocs tds = searcher.search(query, num);
BooleanQuery可以连接多个子查询
* Occur.MUST表示必须出现 * Occur.SHOULD表示可以出现 * Occur.MUSE_NOT表示不能出现 (6) FuzzyQuery query = new FuzzyQuery(new Term("name","mase"));
System.out.println(query.getPrefixLength());
System.out.println(query.getMinSimilarity());
TopDocs tds = searcher.search(query, num);
模糊查找,可以相差一个单词
|
