创建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范围查找,举个例子:
private
String[] ids = {
"1"
,
"2"
,
"3"
,
"4"
,
"5"
,
"6"
};
Query query = new TermRangeQuery(“ids”,1,3,true, true);
就会在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);
模糊查找,可以相差一个单词