创建索引之代码开发
Posted zhzcode
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了创建索引之代码开发相关的知识,希望对你有一定的参考价值。
【创建索引库】
使用indexwriter对象创建索引。
【实现步骤】
(1)创建一个java工程,并导入jar包。
(2)创建一个indexwriter对象。
1)指定索引库的存放位置Directory对象。
2)指定一个分析器,对文档内容进行分析。
(3)创建Document对象
(4)创建filed对象,将field添加到Document对象中。
(5)使用indexwriter对象将Document对象写入到索引库,此过程进行索引创建,并将索引和Document对象写入索引库。
(6)关闭IndexWriter对象。
FirstLucene.java:
1 package com.itheima.lucene; 2 3 import static org.junit.Assert.*; 4 import java.io.File; 5 import org.apache.commons.io.FileUtils; 6 import org.apache.lucene.analysis.Analyzer; 7 import org.apache.lucene.analysis.TokenStream; 8 import org.apache.lucene.analysis.cjk.CJKAnalyzer; 9 import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer; 10 import org.apache.lucene.analysis.standard.StandardAnalyzer; 11 import org.apache.lucene.analysis.tokenattributes.CharTermAttribute; 12 import org.apache.lucene.analysis.tokenattributes.OffsetAttribute; 13 import org.apache.lucene.document.Document; 14 import org.apache.lucene.document.Field; 15 import org.apache.lucene.document.Field.Store; 16 import org.apache.lucene.document.LongField; 17 import org.apache.lucene.document.StoredField; 18 import org.apache.lucene.document.TextField; 19 import org.apache.lucene.index.DirectoryReader; 20 import org.apache.lucene.index.IndexReader; 21 import org.apache.lucene.index.IndexWriter; 22 import org.apache.lucene.index.IndexWriterConfig; 23 import org.apache.lucene.index.Term; 24 import org.apache.lucene.search.IndexSearcher; 25 import org.apache.lucene.search.Query; 26 import org.apache.lucene.search.ScoreDoc; 27 import org.apache.lucene.search.TermQuery; 28 import org.apache.lucene.search.TopDocs; 29 import org.apache.lucene.store.Directory; 30 import org.apache.lucene.store.FSDirectory; 31 import org.apache.lucene.store.RAMDirectory; 32 import org.apache.lucene.util.Version; 33 import org.junit.Test; 34 import org.wltea.analyzer.lucene.IKAnalyzer; 35 36 public class FirstLucene { 37 38 // 创建索引 39 @Test 40 public void testIndex() throws Exception { 41 // 第一步:创建一个java工程,并导入jar包。 42 // 第二步:创建一个indexwriter对象。 43 Directory directory = FSDirectory.open(new File("D:\temp\index")); 44 // Directory directory = new RAMDirectory();//保存索引到内存中 (内存索引库) 45 //Analyzer analyzer = new StandardAnalyzer();// 官方推荐 46 Analyzer analyzer = new IKAnalyzer();// 官方推荐 47 IndexWriterConfig config = new IndexWriterConfig(Version.LATEST, analyzer); 48 IndexWriter indexWriter = new IndexWriter(directory, config); 49 // 1)指定索引库的存放位置Directory对象 50 // 2)指定一个分析器,对文档内容进行分析。 51 // 第三步:创建field对象,将field添加到document对象中。 52 File f = new File("D:\Lucene&solr\searchsource"); 53 File[] listFiles = f.listFiles(); 54 for (File file : listFiles) { 55 // 第三步:创建document对象。 56 Document document = new Document(); 57 // 文件名称 58 String file_name = file.getName(); 59 Field fileNameField = new TextField("fileName", file_name, Store.YES); 60 // 文件大小 61 long file_size = FileUtils.sizeOf(file); 62 Field fileSizeField = new LongField("fileSize", file_size, Store.YES); 63 // 文件路径 64 String file_path = file.getPath(); 65 Field filePathField = new StoredField("filePath", file_path); 66 // 文件内容 67 String file_content = FileUtils.readFileToString(file); 68 Field fileContentField = new TextField("fileContent", file_content, Store.NO); 69 70 document.add(fileNameField); 71 document.add(fileSizeField); 72 document.add(filePathField); 73 document.add(fileContentField); 74 // 第四步:使用indexwriter对象将document对象写入索引库,此过程进行索引创建。并将索引和document对象写入索引库。 75 indexWriter.addDocument(document); 76 77 } 78 // 第五步:关闭IndexWriter对象。 79 indexWriter.close(); 80 } 81 82 // 搜索索引 83 @Test 84 public void testSearch() throws Exception { 85 // 第一步:创建一个Directory对象,也就是索引库存放的位置。 86 Directory directory = FSDirectory.open(new File("D:\temp\index"));// 磁盘 87 // 第二步:创建一个indexReader对象,需要指定Directory对象。 88 IndexReader indexReader = DirectoryReader.open(directory); 89 // 第三步:创建一个indexsearcher对象,需要指定IndexReader对象 90 IndexSearcher indexSearcher = new IndexSearcher(indexReader); 91 // 第四步:创建一个TermQuery对象,指定查询的域和查询的关键词。 92 Query query = new TermQuery(new Term("fileName", "lucene")); 93 // 第五步:执行查询。 94 TopDocs topDocs = indexSearcher.search(query, 10); 95 // 第六步:返回查询结果。遍历查询结果并输出。 96 ScoreDoc[] scoreDocs = topDocs.scoreDocs; 97 for (ScoreDoc scoreDoc : scoreDocs) { 98 int doc = scoreDoc.doc; 99 Document document = indexSearcher.doc(doc); 100 // 文件名称 101 String fileName = document.get("fileName"); 102 System.out.println(fileName); 103 // 文件内容 104 String fileContent = document.get("fileContent"); 105 System.out.println(fileContent); 106 // 文件大小 107 String fileSize = document.get("fileSize"); 108 System.out.println(fileSize); 109 // 文件路径 110 String filePath = document.get("filePath"); 111 System.out.println(filePath); 112 System.out.println("------------"); 113 } 114 // 第七步:关闭IndexReader对象 115 indexReader.close(); 116 117 } 118 119 // 查看标准分析器的分词效果 120 @Test 121 public void testTokenStream() throws Exception { 122 // 创建一个标准分析器对象 123 // Analyzer analyzer = new StandardAnalyzer(); 124 // Analyzer analyzer = new CJKAnalyzer(); 125 // Analyzer analyzer = new SmartChineseAnalyzer(); 126 Analyzer analyzer = new IKAnalyzer(); 127 // 获得tokenStream对象 128 // 第一个参数:域名,可以随便给一个 129 // 第二个参数:要分析的文本内容 130 // TokenStream tokenStream = analyzer.tokenStream("test", 131 // "The Spring Framework provides a comprehensive programming and configuration model."); 132 TokenStream tokenStream = analyzer.tokenStream("test", 133 "高富帅可以用二维表结构来逻辑表达实现的数据"); 134 // 添加一个引用,可以获得每个关键词 135 CharTermAttribute charTermAttribute = tokenStream.addAttribute(CharTermAttribute.class); 136 // 添加一个偏移量的引用,记录了关键词的开始位置以及结束位置 137 OffsetAttribute offsetAttribute = tokenStream.addAttribute(OffsetAttribute.class); 138 // 将指针调整到列表的头部 139 tokenStream.reset(); 140 // 遍历关键词列表,通过incrementToken方法判断列表是否结束 141 while (tokenStream.incrementToken()) { 142 // 关键词的起始位置 143 System.out.println("start->" + offsetAttribute.startOffset()); 144 // 取关键词 145 System.out.println(charTermAttribute); 146 // 结束位置 147 System.out.println("end->" + offsetAttribute.endOffset()); 148 } 149 tokenStream.close(); 150 } 151 152 }
以上是关于创建索引之代码开发的主要内容,如果未能解决你的问题,请参考以下文章
我的Android进阶之旅NDK开发之在C++代码中使用Android Log打印日志,打印出C++的函数耗时以及代码片段耗时详情