Lucene之Java实战
生活随笔
收集整理的這篇文章主要介紹了
Lucene之Java实战
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.導包
2.索引的創建
2.1首先,我們需要定義一個詞法分析器。
Analyzer analyzer = new IKAnalyzer();//官方推薦 Analyzer analyzer = new StandardAnalyzer();2.2第二步,確定索引文件存儲的位置,Lucene提供給我們兩種方式:
2.2.1本地文件存儲?
?Directory directory = FSDirectory.open(new File("D:\\JavaWeb\\Lucene"));2.2.2 內存存儲
Directory directory = new RAMDirectory();2.3第三步,創建IndexWriter,進行索引文件的寫入。
IndexWriterConfig config = new IndexWriterConfig(Version.LATEST, analyzer); IndexWriter indexWriter = new IndexWriter(directory, config);2.4第四步,內容提取,進行索引的存儲。
Document doc = new Document();//申請了一個document對象,這個類似于數據庫中的表中的一行。 String text = "This is the text to be indexed.";//即將索引的字符串 Field fileNameField = new TextField("fileName", text, Store.YES); doc.add(fileNameField);//把字符串存儲起來 indexWriter.addDocument(doc);//把doc對象加入到索引創建中 indexWriter.close();//關閉IndexWriter,提交創建內容lucene常見Field
| LongField | 主要處理Long類型的字段的存儲,排序使用SortField.Type.Long,如果進行范圍查詢或過濾利用NumericRangeQuery.newLongRange(),LongField常用來進行時間戳的排序,保存System.currentTimeMillions() |
| FloatField | 對Float類型的字段進行存儲,排序采用SortField.Type.Float,范圍查詢采用NumericRangeQuery.newFloatRange() |
| BinaryDocVluesField | 只存儲不共享值,如果需要共享值可以用SortedDocValuesField |
| NumericDocValuesField? | 用于數值類型的Field的排序(預排序),需要在要排序的field后添加一個同名的NumericDocValuesField |
| SortedDocValuesField | 用于String類型的Field的排序,需要在StringField后添加同名的SortedDocValuesField |
| StringField | 用戶String類型的字段的存儲,StringField是只索引不分詞 |
| TextField | 對String類型的字段進行存儲,TextField和StringField的不同是TextField既索引又分詞 |
| StoredField | 存儲Field的值,可以用IndexSearcher.doc和IndexReader.document來獲取此Field和存儲的值 |
實戰代碼
@Testpublic void testIndex() throws Exception {ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");BooksMapper booksMapper = ac.getBean(BooksMapper.class);/*Books book= booksMapper.selectByPrimaryKey(4939);System.out.println(book.getTitle());*/List<Books> listBooks=booksMapper.selectBookList();System.out.println(listBooks.size());Analyzer analyzer = new IKAnalyzer();Directory directory = FSDirectory.open(new File("D:\\JavaWeb\\Lucene"));IndexWriterConfig config = new IndexWriterConfig(Version.LATEST, analyzer);IndexWriter indexWriter = new IndexWriter(directory, config);for (int i = 0; i < listBooks.size(); i++) {Document doc = new Document();//申請了一個document對象,這個類似于數據庫中的表中的一行。 String title = listBooks.get(i).getTitle();Field filedTitle = new TextField("title", title, Store.YES);doc.add(filedTitle);String isbn = listBooks.get(i).getIsbn();Field filedISBN = new TextField("isbn", isbn, Store.YES);doc.add(filedISBN);int wordsCount = listBooks.get(i).getWordscount();Field filedWordsCount = new LongField("WordsCount", wordsCount, Store.YES);doc.add(filedWordsCount);indexWriter.addDocument(doc);//把doc對象加入到索引創建中 }indexWriter.close();//關閉IndexWriter,提交創建內容}luke-5.0查看索引結果 (定位到luke-5.0所在的目錄,然后輸入碼命令java -jar luke-5.0.jar)
3.索引的查詢
@Testpublic void testSearch() throws Exception {// 第一步:創建一個Directory對象,也就是索引庫存放的位置。Directory directory = FSDirectory.open(new File("D:\\temp\\index"));// 磁盤// 第二步:創建一個indexReader對象,需要指定Directory對象。IndexReader indexReader = DirectoryReader.open(directory);// 第三步:創建一個indexsearcher對象,需要指定IndexReader對象IndexSearcher indexSearcher = new IndexSearcher(indexReader);// 第四步:創建一個TermQuery對象,指定查詢的域和查詢的關鍵詞。Query query = new TermQuery(new Term("fileName", "lucene"));// 第五步:執行查詢。TopDocs topDocs = indexSearcher.search(query, 10);// 第六步:返回查詢結果。遍歷查詢結果并輸出。ScoreDoc[] scoreDocs = topDocs.scoreDocs;for (ScoreDoc scoreDoc : scoreDocs) {int doc = scoreDoc.doc;Document document = indexSearcher.doc(doc);// 文件名稱String fileName = document.get("fileName");System.out.println(fileName);// 文件內容String fileContent = document.get("fileContent");System.out.println(fileContent);// 文件大小String fileSize = document.get("fileSize");System.out.println(fileSize);// 文件路徑String filePath = document.get("filePath");System.out.println(filePath);System.out.println("------------");}// 第七步:關閉IndexReader對象 indexReader.close();}?4.查看標準分析器的分詞效果
@Testpublic void testTokenStream() throws Exception {// 創建一個標準分析器對象//Analyzer analyzer = new StandardAnalyzer();//Analyzer analyzer = new CJKAnalyzer();//Analyzer analyzer = new SmartChineseAnalyzer();Analyzer analyzer = new IKAnalyzer();// 獲得tokenStream對象// 第一個參數:域名,可以隨便給一個// 第二個參數:要分析的文本內容//TokenStream tokenStream = analyzer.tokenStream("test",//"The Spring Framework provides a comprehensive programming and configuration model.");TokenStream tokenStream = analyzer.tokenStream("test","高富帥可以用二維表結構來邏輯表達實現的數據");// 添加一個引用,可以獲得每個關鍵詞CharTermAttribute charTermAttribute = tokenStream.addAttribute(CharTermAttribute.class);// 添加一個偏移量的引用,記錄了關鍵詞的開始位置以及結束位置OffsetAttribute offsetAttribute = tokenStream.addAttribute(OffsetAttribute.class);// 將指針調整到列表的頭部 tokenStream.reset();// 遍歷關鍵詞列表,通過incrementToken方法判斷列表是否結束while (tokenStream.incrementToken()) {// 關鍵詞的起始位置System.out.println("start->" + offsetAttribute.startOffset());// 取關鍵詞 System.out.println(charTermAttribute);// 結束位置System.out.println("end->" + offsetAttribute.endOffset());}tokenStream.close();}5.IKAnalyzer分詞
5.1IKAnalyzer.cfg.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> <properties> <comment>IK Analyzer 擴展配置</comment><!--用戶可以在這里配置自己的擴展字典 --><entry key="ext_dict">ext.dic;</entry> <!--用戶可以在這里配置自己的擴展停止詞字典--><entry key="ext_stopwords">stopword.dic;</entry> </properties>?5.2擴展ext.dic
高富帥 二維表5.3停止stopword.dic
我 是 用 的 二 維 表 來 a an and are as at be but by for if in into is it no not of on or such that the their then there these they this to was will with?6.封裝LuceneHelper
package com.mf.lucene;import java.io.File;import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.TextField; import org.apache.lucene.document.Field.Store; import org.apache.lucene.index.DirectoryReader; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.IndexWriterConfig; import org.apache.lucene.index.Term; import org.apache.lucene.queryparser.classic.MultiFieldQueryParser; import org.apache.lucene.queryparser.classic.QueryParser; import org.apache.lucene.search.BooleanQuery; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.MatchAllDocsQuery; import org.apache.lucene.search.NumericRangeQuery; import org.apache.lucene.search.Query; import org.apache.lucene.search.ScoreDoc; import org.apache.lucene.search.TermQuery; import org.apache.lucene.search.TopDocs; import org.apache.lucene.search.BooleanClause.Occur; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; import org.apache.lucene.util.Version; import org.junit.Test; import org.wltea.analyzer.lucene.IKAnalyzer;public class LuceneHelper {public IndexWriter getIndexWriter() throws Exception {Directory directory = FSDirectory.open(new File("D:\\JavaWeb\\Lucene"));// Directory directory = new RAMDirectory();//保存索引到內存中 (內存索引庫)Analyzer analyzer = new IKAnalyzer();IndexWriterConfig config = new IndexWriterConfig(Version.LATEST,analyzer);return new IndexWriter(directory, config);}//全刪除 @Testpublic void testAllDelete() throws Exception {IndexWriter indexWriter = getIndexWriter();indexWriter.deleteAll();indexWriter.close();}//根據條件刪除 @Testpublic void testDelete() throws Exception {IndexWriter indexWriter = getIndexWriter();Query query = new TermQuery(new Term("title","c#"));indexWriter.deleteDocuments(query);indexWriter.close();}//修改 @Testpublic void testUpdate() throws Exception {IndexWriter indexWriter = getIndexWriter();Document doc = new Document();doc.add(new TextField("fileN", "測試文件名",Store.YES));doc.add(new TextField("fileC", "測試文件內容",Store.YES));indexWriter.updateDocument(new Term("isbn","9787115155108"), doc, new IKAnalyzer());indexWriter.close();}//IndexReader IndexSearcherpublic IndexSearcher getIndexSearcher() throws Exception{// 第一步:創建一個Directory對象,也就是索引庫存放的位置。Directory directory = FSDirectory.open(new File("D:\\JavaWeb\\Lucene"));// 磁盤// 第二步:創建一個indexReader對象,需要指定Directory對象。IndexReader indexReader = DirectoryReader.open(directory);// 第三步:創建一個indexsearcher對象,需要指定IndexReader對象return new IndexSearcher(indexReader);}//執行查詢的結果public void printResult(IndexSearcher indexSearcher,Query query)throws Exception{// 第五步:執行查詢。TopDocs topDocs = indexSearcher.search(query, 10);// 第六步:返回查詢結果。遍歷查詢結果并輸出。ScoreDoc[] scoreDocs = topDocs.scoreDocs;for (ScoreDoc scoreDoc : scoreDocs) {int doc = scoreDoc.doc;Document document = indexSearcher.doc(doc);// 文件名稱String title = document.get("title");System.out.println(title);//WordsCountString WordsCount = document.get("WordsCount");System.out.println(WordsCount);System.out.println("------------");}}//查詢所有 @Testpublic void testMatchAllDocsQuery() throws Exception {IndexSearcher indexSearcher = getIndexSearcher();Query query = new MatchAllDocsQuery();System.out.println(query);printResult(indexSearcher, query);//關閉資源 indexSearcher.getIndexReader().close();}//根據數值范圍查詢 @Testpublic void testNumericRangeQuery() throws Exception {IndexSearcher indexSearcher = getIndexSearcher();Query query = NumericRangeQuery.newLongRange("WordsCount", 0L, 10000L, true, true);System.out.println(query);printResult(indexSearcher, query);//關閉資源 indexSearcher.getIndexReader().close();}//可以組合查詢條件 @Testpublic void testBooleanQuery() throws Exception {IndexSearcher indexSearcher = getIndexSearcher();BooleanQuery booleanQuery = new BooleanQuery();Query query1 = new TermQuery(new Term("title","c#"));Query query2 = new TermQuery(new Term("WordsCount","660000"));// select * from user where id =1 or name = 'safdsa' booleanQuery.add(query1, Occur.MUST);booleanQuery.add(query2, Occur.MUST);System.out.println(booleanQuery);printResult(indexSearcher, booleanQuery);//關閉資源 indexSearcher.getIndexReader().close();}//條件解釋的對象查詢 @Testpublic void testQueryParser() throws Exception {IndexSearcher indexSearcher = getIndexSearcher();//參數1: 默認查詢的域 //參數2:采用的分析器QueryParser queryParser = new QueryParser("title",new IKAnalyzer());// *:* 域:值Query query = queryParser.parse("title:c#");printResult(indexSearcher, query);//關閉資源 indexSearcher.getIndexReader().close();}//條件解析的對象查詢 多個默念域 @Testpublic void testMultiFieldQueryParser() throws Exception {IndexSearcher indexSearcher = getIndexSearcher();String[] fields = {"title","isbn"};//參數1: 默認查詢的域 //參數2:采用的分析器MultiFieldQueryParser queryParser = new MultiFieldQueryParser(fields,new IKAnalyzer());// *:* 域:值Query query = queryParser.parse("c#");printResult(indexSearcher, query);//關閉資源 indexSearcher.getIndexReader().close();}}?
轉載于:https://www.cnblogs.com/cnki/p/6746527.html
總結
以上是生活随笔為你收集整理的Lucene之Java实战的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ASP.NET MVC4 微信公众号开发
- 下一篇: 正则-元字符 注意正则表达式中间不要随意