Lucene3.5自学系列2-查询的建立--IndexSearch
暂时现写个实例,等有时间在慢慢详写
1 package cn.swust.lucene;
2
3 import java.io.File;
4 import java.io.IOException;
5
6 import org.apache.lucene.analysis.Analyzer;
7 import org.apache.lucene.analysis.standard.StandardAnalyzer;
8 import org.apache.lucene.document.Document;
9 import org.apache.lucene.index.CorruptIndexException;
10 import org.apache.lucene.index.IndexReader;
11 import org.apache.lucene.queryParser.MultiFieldQueryParser;
12 import org.apache.lucene.queryParser.ParseException;
13 import org.apache.lucene.queryParser.QueryParser;
14 import org.apache.lucene.search.IndexSearcher;
15 import org.apache.lucene.search.Query;
16 import org.apache.lucene.search.ScoreDoc;
17 import org.apache.lucene.search.TopDocs;
18 import org.apache.lucene.search.TopScoreDocCollector;
19 import org.apache.lucene.store.Directory;
20 import org.apache.lucene.store.RAMDirectory;
21 import org.apache.lucene.store.SimpleFSDirectory;
22 import org.apache.lucene.util.Version;
23
24 public class Search {
25 private static String INDEX_SORT_PATH = "/home/qingfeideyi/文档/indexstore/";
26 private static Directory indexDir = new RAMDirectory();
27 static{
28 try {
29 indexDir = new SimpleFSDirectory(new File(INDEX_SORT_PATH));
30 } catch (IOException e) {
31 System.out.println("目录初始化失败");
32 e.printStackTrace();
33 }
34 }
35 public void indexSearch(String queryKey)
36 {
37 try {
38 /**
39 * indexSearch = new IndexSearcher(dir);<被弃用>
40 */
41 IndexReader reader = IndexReader.open(indexDir);
42 IndexSearcher search = new IndexSearcher(reader);
43
44 String []fields = {"FileName","Content"};
45 Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_35);
46 /**创建QueryParser对象,第一个参数表示Lucene的版本,第二个表示搜索Field的字段,第三个表示搜索使用分词器
47 * 注意 QueryParser构造方法中间的参赛为一个String 字符串,即为待检索的字段
48 * MultiFieldQueryParser构造方法中间的参赛为 String 字符串数组,即为 多个检索的字段
49 */
50 //QueryParser queryParser = new QueryParser(Version.LUCENE_35, field, analyzer);
51 QueryParser queryParser = new MultiFieldQueryParser(Version.LUCENE_35, fields, analyzer);
52 //生成Query对象
53 Query query = queryParser.parse(queryKey);
54
55 /**
56 * 该方法为低水平得搜索,官方说明:search(Query query, Collector results) Lower-level search API.
57 * 该方法没有返回值,搜索结果应该就在TopScoreDocCollector中,这里应该进行了加权得处理API中说:Note: The
58 * score passed to this method is a raw score. In other words, the score will not necessarily
59 * be a float whose value is between 0 and 1.
60 *
61 TopScoreDocCollector result = TopScoreDocCollector.create(10, true);
62 search.search(query, result);
63 TopDocs docs = result.topDocs(0, 1);
64 */
65 /**
66 * 常用下面得方法:其中参数3 API为 Finds the top n hits for query.应该翻译为取查询结果的前n个document;
67 * 即hits 应该是指查询的 document;
68 */
69 //第二个参数表示 每次从索引器中取出记录数量
70 TopDocs docs = search.search(query, 4);
71 //hits.totalHits表示一共搜到多少个
72 System.out.println("共搜索到"+docs.totalHits+"个 '"+queryKey+"'");
73 //循环hits.scoreDocs数据,并使用indexSearch.doc方法把Document还原,再拿出对应的字段的值
74 for(ScoreDoc scoreDoc :docs.scoreDocs)
75 {
76 System.out.println(scoreDoc.doc);
77 Document doc = search.doc(scoreDoc.doc);// Returns the stored fields of document i.
78 System.out.println(doc.get("FileName"));
79 System.out.println(doc.get("Content"));
80 }
81 search.close();
82 } catch (CorruptIndexException e) {
83 // TODO Auto-generated catch block
84 e.printStackTrace();
85 } catch (IOException e) {
86 // TODO Auto-generated catch block
87 e.printStackTrace();
88 } catch (ParseException e) {
89 System.out.println("Query 初始化失败");
90 e.printStackTrace();
91 }
92 }
93 }

浙公网安备 33010602011771号