创建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);
模糊查找,可以相差一个单词