码迷,mamicode.com
首页 > 其他好文 > 详细

创建索引之代码开发

时间:2018-10-14 00:12:53      阅读:232      评论:0      收藏:0      [点我收藏+]

标签:start   exception   com   fse   common   while   使用   表结构   setattr   

【创建索引库】

使用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 }

 

创建索引之代码开发

标签:start   exception   com   fse   common   while   使用   表结构   setattr   

原文地址:https://www.cnblogs.com/zhzcode/p/9784241.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!