建立查找方法使用8步:
1.创建Directory
这里的Directory跟建立索引的时候使用的是一样的,都是要指向索引文件,不同的是建立索引的时候指向的是未建立的文件夹?(如果已经存在会出现什么情况我还没有检验过),查找这里的Directory指向的是已经建立好的索引文件,即已经存在的的索引文件。
2.创建IndexReader
这相当于一个读“流”,用来读取索引文件的流。
3.使用IndexReader创建searcher
得到“流”之后,要建立查找类IndexSearcher,即我们使用IndexSearcher这个类来进行查找。就好像我们使用Connection连接数据库一样。
Implements search over a single IndexReader.–来自源码中IndexSearcher的注释,意即:在单个IndexReader流上面实现搜索。
4.创建Query
创建Query的原因是searcher进行搜索的时候我们需要统一提问的格式(纯粹个人描述),因此要给searcher传递一个query然后进行相应的查询。
5.使用seacher返回topDoc
例如下面的语句
TopDocs topdocs = searcher.search(query, 5);
这里的topDoc相当于查询结果,例如,上面我们就列出了前五条。
6.通过topDoc得到数组
7.遍历数组,得到document对象
8.从document对象得到信息
下面是代码:
public void search()
{
try
{
// 1.创建Directory
Directory directory = FSDirectory.open(Paths.get("d:/index01"));
// 2.创建IndexReader
IndexReader reader = DirectoryReader.open(directory);
// 3.根据IndexReader创建Searcher
IndexSearcher searcher = new IndexSearcher(reader);
// 4.创建Query
QueryParser parser = new QueryParser("content", new StandardAnalyzer());
// 5.使用Searcher使用返回TopDocs
Query query = parser.parse("Licensed");
System.out.println("Searching for: " + query.toString("contents"));
TopDocs topdocs = searcher.search(query, 5);
// 6.根据TopDocs得到ScoreDoc
ScoreDoc[] sds = topdocs.scoreDocs;
// 7.根据ScoreDoc得到具体的Document
for (ScoreDoc sd : sds)
{
Document d = searcher.doc(sd.doc);
System.out.println(d.toString());
System.out.println("end "+d.get("filename"));
}
// 8.根据Document对象获取具体的值
} catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}