本帖最后由 小石姐姐 于 2018-8-30 21:20 编辑
【石家庄校区】就业班_JAVAEE_Lucene
一 概述
结构化数据 格式和长度固定,比如数据库表
非结构化数据 格式和长度不固定,比如word
全文检索 针对非结构化数据,采用先建立索引,然后再索引的基础上进行查询
java全文检索技术lucene 全文检索的工具包
应用场景:针对大数据量的情况下,对数据的模糊查询或者自然语言的检索。
二 创建索引
1 获取原始文档 爬虫Nutch jsoup
2 创建文档对象 document 相当于表中一条记录 field 属于document 相当于表中的字段 field中存储内容
filed的属性判断原则:
是否需要分词 需要在也页面进行查询的大部分都需要进行分词,除了一些拥有特殊业务含义,分割后会失去原有含义的不需要进行分词。比如订单编号,身份证号。
是否需要索引 需要在页面进行查询的就需要进行索引
是否需要存储 需要在页面显示的就需要存储
3 分析文档
对存放在field中的内容进行分析,得到term列表。
过程:对原始文档提取单词、将字母转为小写、去除标点符号、去除停用词
4 创建索引
对term列表进行索引,每个term执行文档的id列表。
三 查询索引
1 查询接口
2 创建查询
3 执行查询
4 渲染结果
四 IK分词器
ik分词器即支持中文也支持英文。
使用方法:
第一步:把jar包添加到工程中
第二步:把配置文件和扩展词典和停用词词典添加到classpath下
注意:mydict.dic和ext_stopword.dic文件的格式为UTF-8,注意是无BOM 的UTF-8 编码。
分词器的应用时机: 创建索引时和查询索引时针对查询内容先进行分词。
五 代码实现
//创建索引
[Java] 纯文本查看 复制代码 public void createIndex()throws Exception{
IndexWriter indexWriter = getIndexWriter();
File sourceFile = new File("E:\\项目二\\lucene\\day06\\资料\\searchsource");
for (File file :sourceFile.listFiles() ) {
String fileName = file.getName();
String filePath = file.getPath();
long size = FileUtils.sizeOf(file);
String fileContent = FileUtils.readFileToString(file);
Document document = new Document();
TextField fileNameField = new TextField("name", fileName, Store.YES);
StoredField pathField = new StoredField("path", filePath);
LongField sizeField = new LongField("size", size, Store.YES);
TextField contentFeild = new TextField("content",fileContent,Store.NO);
document.add(fileNameField);
document.add(pathField);
document.add(sizeField);
document.add(contentFeild);
indexWriter.addDocument(document);
}
indexWriter.close();
}
//查询索引
[Java] 纯文本查看 复制代码 public void queryIndex() throws Exception{
Directory directory = FSDirectory.open(new File("E:\\index"));
IndexReader indexReader = DirectoryReader.open(directory);
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
//term查询相当于等值查询
Query query = new TermQuery(new Term("name", "lucene"));
TopDocs topDocs = indexSearcher.search(query , 10);
for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
int id = scoreDoc.doc;
Document document = indexSearcher.doc(id);
System.out.println(document.getField("name"));
System.out.println(document.getField("path"));
System.out.println(document.getField("content"));
System.out.println(document.getField("size"));
}
indexReader.close();
}
// 添加文档
[Java] 纯文本查看 复制代码 public void addDocument() throws Exception {
IndexWriter indexWriter = this.getIndexWriter();
Document document = new Document();
TextField fileNameField = new TextField("name", "测试文档.txt", Store.YES);
StoredField pathField = new StoredField("path", "c:\\temp");
LongField sizeField = new LongField("size", 1111, Store.YES);
document.add(fileNameField);
document.add(pathField);
document.add(sizeField);
indexWriter.addDocument(document);
indexWriter.close();
}
// 根据query删除文档
[Java] 纯文本查看 复制代码 public void deleteByQuery()throws Exception {
IndexWriter indexWriter = this.getIndexWriter();
Query query = new TermQuery(new Term("name","测试"));
indexWriter.deleteDocuments(query);
indexWriter.close();
}
// 删除全部文档
[Java] 纯文本查看 复制代码 public void deleteAll()throws Exception {
IndexWriter indexWriter = this.getIndexWriter();
indexWriter.deleteAll();
indexWriter.close();
}
//更新文档
//先删除,然后再添加
[AppleScript] 纯文本查看 复制代码 public void update() throws Exception{
IndexWriter indexWriter = this.getIndexWriter();
Term term = new Term("name","spring");
Document doc = new Document();
TextField fileNameField = new TextField("name", "测试文档111.txt", Store.YES);
StoredField pathField = new StoredField("path", "c:\\temp");
LongField sizeField = new LongField("size", 1111, Store.YES);
doc.add(fileNameField);
doc.add(pathField);
doc.add(sizeField);
indexWriter.updateDocument(term, doc);
indexWriter.close();
}
//创建索引写入器
[Java] 纯文本查看 复制代码 private IndexWriter getIndexWriter() throws IOException {
//指定索引库存放路径 ,可以存放在内存也可以存放在硬盘,一般存放在硬盘上。
Directory directory = FSDirectory.open(new File("E:\\index"));
//创建ik分词器 ik分词器即支持中文也支持英文
Analyzer analyzer = new IKAnalyzer();
IndexWriterConfig config = new IndexWriterConfig(Version.LATEST, analyzer);
//创建索引写入器
IndexWriter indexWriter = new IndexWriter(directory, config);
return indexWriter;
} |