lucene--创建searcher

创建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);

模糊查找,可以相差一个单词

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(Lucene,search)