Lucene的入门

Lucene的入门搭建以及一个添加的Demo,这次写了一个包含增删改查比较完整的例子,以供各位入门新手的道友们参考,当然这个只是最简单的封装,有很多参数都是写死的 ,所以有点不灵活,各位朋友也可以自己试着参考笔者的Demo封装一个比较通用的例子,在实际的项目环境中,封装一定要做到既通用又灵活,这个看各位的业务的需求了,不同的业务需求可能不一样。


在入门,搭建好最基本的环境之后,增删改查只是一个最基础层次也是不可或缺的必要的一部分,后续根据业务的复杂层次不一样,可能需要用到各种技术,包括分词,评分,分组,排序,增量,高亮,拼写检查,文本聚类,各种复杂的检索等等,这些都是构成一个成熟的全文检索技术的基础,这些东西,笔者会在后续的文章中发表出来,共同分享学习下Lucene这个优秀的开源的全文检索技术的强大。

下面不在废话,给出这个demo完整的源码。如有疑问,错误之处欢迎指出,期待与你的共同交流 。






Java代码 复制代码 收藏代码
1.package com.serviceimpl; 
2. 
3.import java.io.File; 
4.import java.io.IOException; 
5.import java.util.HashMap; 
6.  
7.import org.apache.lucene.analysis.Analyzer; 
8.import org.apache.lucene.analysis.standard.StandardAnalyzer; 
9.import org.apache.lucene.document.Document; 
10.import org.apache.lucene.document.Field.Store; 
11.import org.apache.lucene.document.StringField; 
12.import org.apache.lucene.document.TextField; 
13.import org.apache.lucene.index.DirectoryReader; 
14.import org.apache.lucene.index.IndexReader; 
15.import org.apache.lucene.index.IndexWriter; 
16.import org.apache.lucene.index.IndexWriterConfig; 
17.import org.apache.lucene.index.Term; 
18.import org.apache.lucene.queryparser.classic.QueryParser; 
19.import org.apache.lucene.search.IndexSearcher; 
20.import org.apache.lucene.search.PhraseQuery; 
21.import org.apache.lucene.search.Query; 
22.import org.apache.lucene.search.ScoreDoc; 
23.import org.apache.lucene.search.TermQuery; 
24.import org.apache.lucene.search.TopDocs; 
25.import org.apache.lucene.search.WildcardQuery; 
26.import org.apache.lucene.store.Directory; 
27.import org.apache.lucene.store.FSDirectory; 
28.import org.apache.lucene.util.Version; 
29. 
30.import com.service.LuceneDao; 
31. 
32./**
33. * @author 三劫散仙
34. * LuceneDao接口的实现类
35. * **/ 
36.public class LuceneDaoImpl implements LuceneDao { 
37.     
38.     
39.     
40.     
41.     
42.    /**
43.     * 抽象的父类文件夹
44.     * */ 
45.    public static Directory directory; 
46.      /**
47.       * 返回IndexWriter
48.       * */ 
49.      public static IndexWriter getWriter() throws Exception{ 
50.          Analyzer analyzer=new StandardAnalyzer(Version.LUCENE_43);//设置标准分词器 ,默认是一元分词 
51.          IndexWriterConfig iwc=new IndexWriterConfig(Version.LUCENE_43, analyzer);//设置IndexWriterConfig 
52.         //  iwc.setRAMBufferSizeMB(3);//设置缓冲区大小 
53.          return new IndexWriter(directory,iwc); 
54.      } 
55.       
56.      /***
57.       * @param indexPath 查询的路径
58.       * @param field     查询的字段类型
59.       * @param searchText  搜索的文本
60.       * 
61.       * 
62.       * **/ 
63.       public void searchTermQuery(String indexPath,String field,String searchText){ 
64.            
65.           try { 
66.            directory=FSDirectory.open(new File(indexPath));//打开索引库 
67.            IndexReader reader=DirectoryReader.open(directory);//流读取 
68.            IndexSearcher search=new IndexSearcher(reader);//搜索 
69.            //Query q=new PhraseQuery();//查询实例 
70.            Query  q=new TermQuery(new Term(field, searchText)); 
71.            //q.add(); 
72.            TopDocs td=search.search(q, 1000);//获取最高得分命中 
73.            for(ScoreDoc doc:td.scoreDocs){ 
74.                Document d=search.doc(doc.doc); 
75.                System.out.println("id:"+d.get("id")); 
76.                System.out.println("name:"+d.get("name")); 
77.                System.out.println("content:"+d.get("content")); 
78.                 
79.            } 
80.            reader.close();//关闭读取流 
81.            directory.close();//文件夹 
82.             
83.             
84.        } catch (IOException e) { 
85.            // TODO Auto-generated catch block 
86.            e.printStackTrace(); 
87.        } 
88.            
89.            
90.            
91.            
92.            
93.       } 
94.       
95.       
96.      /**
97.       * 添加的方法
98.       * */ 
99.    @Override 
100.    public void add(String indexWriterPath) { 
101.         IndexWriter writer=null; 
102.          try{ 
103.         directory=FSDirectory.open(new File(indexWriterPath));//打开存放索引的路径 
104.         writer=getWriter(); 
105.         Document doc=new Document(); 
106.         doc.add(new StringField("id", "5", Store.YES));//ID类型不分词存储 
107.         doc.add(new TextField("name", "秋去春来,几多愁", Store.YES));//name使用默认一元分词 
108.         doc.add(new TextField("content", "命运总是颠沛流离,命运总是崎岖厉害", Store.YES));//存储 
109.//       doc.add(new StringField("id", "1", Store.YES));//存储 
110.//       doc.add(new StringField("name", "张飞", Store.YES));//存储 
111.//       doc.add(new StringField("content", "也许放弃,才能靠近你!", Store.YES));//存储 
112.         writer.addDocument(doc);//添加进写入流里 
113.         writer.forceMerge(1);//优化压缩段,大规模添加数据的时候建议,少使用本方法,会影响性能 
114.         writer.commit();//提交数据  
115.         System.out.println("添加成功"); 
116.          }catch(Exception e){ 
117.               
118.              e.printStackTrace(); 
119.               
120.          }finally{ 
121.               
122.              if(writer!=null){ 
123.                  try{ 
124.                  writer.close();//关闭流 
125.                  }catch(Exception e){ 
126.                      e.printStackTrace(); 
127.                  } 
128.              } 
129.               
130.               
131.          } 
132.         
133.    } 
134.    
135.    /***
136.     *  简单查询的方法
137.     *  @param indexReadPath 读取的索引路径
138.     *  @param  filed 查询的字段类型
139.     *  @param  searchText查询的文本
140.     * */ 
141.  
142.    public void simpleSearch1(String indexReadPath, String field, 
143.            String searchText) { 
144.        try{ 
145.        directory=FSDirectory.open(new File(indexReadPath));//打开索引文件夹 
146.        IndexReader  reader=DirectoryReader.open(directory);//读取目录 
147.        IndexSearcher search=new IndexSearcher(reader);//初始化查询组件 
148.         
149.        //Query query=new TermQuery(new Term(field, searchText));//查询 
150.         
151.          QueryParser parser=new QueryParser(Version.LUCENE_43, field, new StandardAnalyzer(Version.LUCENE_43));//标准分析器查询时候一元分词效果 
152.          Query query=parser.parse(searchText); 
153.           
154.         TopDocs td=search.search(query, 10000);//获取匹配上元素的一个docid 
155.        ScoreDoc[] sd=td.scoreDocs;//加载所有的Documnet文档 
156.        System.out.println("本次命中数据:"+sd.length); 
157.        for(int i=0;i<sd.length;i++){ 
158.             
159.            int z=sd[i].doc;//获取每一个文档编号 
160.            Document doc=search.doc(z);//获取文档 
161.            System.out.println("id:"+doc.get("id")); 
162.            System.out.println("name:"+doc.get("name")); 
163.            System.out.println("content:"+doc.get("content")); 
164.        } 
165.         
166.         reader.close();//关闭资源 
167.         directory.close();//关闭连接 
168.         
169.        }catch(Exception e){ 
170.            e.printStackTrace(); 
171.        } 
172.         
173.    } 
174.  
175.     
176. 
177.    /***
178.     * 查询数据总量
179.     * @param indexFile 索引路径
180.     * */ 
181.    public int findIndexDbCount(String indexFile) { 
182.        int total = 0; 
183.        try { 
184.            Directory dir = FSDirectory.open(new File(indexFile));//打开文件夹 
185.            IndexReader reader = DirectoryReader.open(dir);//读取数据 
186.            total = reader.numDocs();//数据总量 
187.            reader.close();//释放资源 
188.            dir.close();//释放资源 
189.        } catch (Exception e) { 
190.            e.printStackTrace(); 
191.        } 
192. 
193.        return total; 
194. 
195.    } 
196. 
197. 
198.    /***
199.     * 删除方法
200.     * @param indexPath 索引路径
201.     * @param id 根据ID删除
202.     * */ 
203.    @Override 
204.    public void delete(String indexPath, String id) { 
205.        try{ 
206.            directory=FSDirectory.open(new File(indexPath));//打开文件索引目录 
207.        IndexWriter writer=getWriter(); 
208.         
209.        IndexReader  reader=DirectoryReader.open(directory);//读取目录 
210.        Query q=new TermQuery(new Term("id", id)); 
211.        writer.deleteDocuments(q);//删除指定ID的Document 
212.        writer.commit();//提交 
213.        writer.close();//关闭 
214.        reader.close();//关闭 
215.        System.out.println("删除id为"+id+"的记录成功"); 
216.         
217.        }catch(Exception e){ 
218.            e.printStackTrace(); 
219.        } 
220.         
221.    } 
222.     
223.    /***
224.     * 根据ID进行更行的方法
225.     * 
226.     * */ 
227.    @Override 
228.    public void updateByID(String indexPath, String docID, 
229.            HashMap<String, String> map) { 
230.        try{ 
231.        directory=FSDirectory.open(new File(indexPath));//打开文件索引目录 
232.        IndexWriter writer=getWriter(); 
233.         
234.        //IndexReader  reader=DirectoryReader.open(directory);//读取目录 
235.         //Document doc=reader.document(Integer.parseInt(docID)); 
236.         Document d=new Document(); 
237.         d.add(new StringField("id",map.get("id").toString(),Store.YES)); 
238.         d.add(new TextField("name",map.get("name").toString(),Store.YES)); 
239.         d.add(new TextField("content",map.get("content").toString(),Store.YES)); 
240.          writer.updateDocument(new Term("id", docID), d); 
241.          
242.          writer.commit(); 
243.          writer.close();//关闭 
244.          directory.close();//关闭 
245.          System.out.println("更新成功!"); 
246.         
247.        }catch(Exception e){ 
248.            e.printStackTrace(); 
249.             
250.        } 
251.    } 
252. 
253.} 

猜你喜欢

转载自weitao1026.iteye.com/blog/2265617