1,信息检索与数据库的搜索对比 -- DB就不是为全文检索而设计的
a> 数据库的搜索不能实现我们的全文检索的要求,原因如下: 匹配效果:如搜索 ant,在 sql 中使用 like %ant%'是会搜索出 planting 的,但他不应出现.
b> 查出的结果没有相关度排序,不知道有用的结果在哪一页.
c> 搜索速度太慢,达不到毫秒级的要求
2, 整体流程
3, 主要概念
索引, 分词器, 高亮器, 过滤器
4, 代码
package cn.itcast.lucene.helloworld;
import jeasy.analysis.MMAnalyzer;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriter.MaxFieldLength;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.Filter;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.junit.Test;
import cn.itcast.lucene.utils.File2DocumentUtils;
public class HelloWorld2 {
String filePath = "luceneDatasource\\ch1.txt";
String filePath2 = "luceneDatasource\\ch2.txt";
String filePath3 = "luceneDatasource\\ch3.txt";
String filePath4 = "luceneDatasource\\ch4.txt";
String indexPath = "luceneIndex2";
Analyzer analyzer = new MMAnalyzer();
/**
* 创建索引
*
* IndexWriter 是用来操作(增、删、改)索引库的
*/
@Test
public void createIndex() throws Exception {
// file --> doc
Document doc = File2DocumentUtils.file2Document(filePath);
Document doc2 = File2DocumentUtils.file2Document(filePath2);
Document doc3 = File2DocumentUtils.file2Document(filePath3);
Document doc4 = File2DocumentUtils.file2Document(filePath4);
// 建立索引
IndexWriter indexWriter = new IndexWriter(indexPath, analyzer, true,
MaxFieldLength.LIMITED);
indexWriter.addDocument(doc);
indexWriter.addDocument(doc2);
indexWriter.addDocument(doc3);
indexWriter.addDocument(doc4);
indexWriter.close();
}
/**
* 搜索
*
* IndexSearcher 是用来在索引库中进行查询的
*/
@Test
public void search() throws Exception {
// String queryString = "document";
String queryString = "商品";
// 1,把要搜索的文本解析为 Query
String[] fields = { "content" };
QueryParser queryParser = new MultiFieldQueryParser(fields, analyzer);
Query query = queryParser.parse(queryString);
// 2,进行查询
IndexSearcher indexSearcher = new IndexSearcher(indexPath);
Filter filter = null;
TopDocs topDocs = indexSearcher.search(query, filter, 10000);
System.out.println("总共有【" + topDocs.totalHits + "】条匹配结果");
// 3,打印结果
for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
int docSn = scoreDoc.doc; // 文档内部编号
Document doc = indexSearcher.doc(docSn); // 根据编号取出相应的文档
File2DocumentUtils.printDocumentInfo(doc); // 打印出文档信息
}
}
}
package cn.itcast.lucene.utils;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.NumberTools;
import org.apache.lucene.document.Field.Index;
import org.apache.lucene.document.Field.Store;
public class File2DocumentUtils {
// 文件:name, content, size, path
public static Document file2Document(String path) {
File file = new File(path);
Document doc = new Document();
doc.add(new Field("name", file.getName(), Store.YES, Index.ANALYZED));
doc.add(new Field("content", readFileContent(file), Store.YES, Index.ANALYZED));
doc.add(new Field("size", NumberTools.longToString(file.length()), Store.YES, Index.NOT_ANALYZED));
doc.add(new Field("path", file.getAbsolutePath(), Store.YES, Index.NOT_ANALYZED));
return doc;
}
// public static void document2File(Document doc ){
//
// }
/**
* 读取文件内容
*/
public static String readFileContent(File file) {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
StringBuffer content = new StringBuffer();
for (String line = null; (line = reader.readLine()) != null;) {
content.append(line).append("\n");
}
return content.toString();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* <pre>
* 获取 name 属性的值的两种方法:
* 1,Field f = doc.getField("name");
* f.stringValue();
* 2,doc.get("name");
* </pre>
*
* @param doc
*/
public static void printDocumentInfo(Document doc) {
// Field f = doc.getField("name");
// f.stringValue();
System.out.println("------------------------------");
System.out.println("name = " + doc.get("name"));
System.out.println("content = " + doc.get("content"));
System.out.println("size = " + NumberTools.stringToLong(doc.get("size")));
System.out.println("path = " + doc.get("path"));
}
}
5, 相关查询文件 & JAR包
见附件
- 大小: 24.2 KB
- 大小: 79.3 KB
分享到:
相关推荐
**Lucene全文检索引擎** Lucene是Apache软件基金会的一个开源项目,它是一个高性能、全文本搜索引擎库,可以被集成到各种应用中实现全文检索功能。Lucene提供了完整的搜索功能实现,包括索引创建、文档存储、查询...
**Lucene 全文检索详解** Lucene 是一个开源的全文检索库,由Apache软件基金会维护,它提供了高效的全文检索和分析功能。Lucene 广泛应用于网站搜索、文档检索、信息提取等领域,是Java开发人员实现全文搜索引擎的...
**Lucene全文检索全面教程** Lucene是一款由Apache软件基金会开发的开源全文检索库,它为开发者提供了在Java应用程序中实现高性能、可扩展的全文检索功能。本教程将深入探讨Lucene的核心概念、架构和使用方法,帮助...
**使用Lucene全文检索数据库** Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发。它是Java编写的,能够帮助开发者在各种应用程序中实现强大的全文检索功能。在这个项目中,我们将探讨如何利用Lucene ...
lucene全文检索,适用于ppt,word,pdf,excel等
**Lucene全文检索框架** Lucene是一个开源的Java全文检索库,由Apache软件基金会开发。它提供了文本分析、索引创建、文档检索等核心功能,是构建高效、可扩展搜索应用的基础。Lucene的主要特点包括: 1. **高速...
资料包中的"lucene全文检索引擎"可能包含示例代码、教程或者实际的项目案例,这可以帮助你理解如何在实际应用中使用Lucene。你可以通过这些资源学习: - 如何创建和管理索引。 - 如何编写查询解析器和定制查询行为...
**Lucene全文检索Word2007** Lucene是一个开源的全文搜索引擎库,由Apache软件基金会开发并维护。它提供了一个高效、可扩展的搜索框架,使得开发者能够在其应用程序中集成高级的搜索功能。在本示例中,我们讨论的是...
《深入剖析Lucene全文检索案例源码》 在信息技术领域,全文检索技术是搜索引擎的核心,而Lucene作为Java平台上的一个开源全文检索库,被广泛应用于各种搜索应用中。本篇将围绕“lucene全文检索案例源码”展开,深入...
**Lucene全文检索教程** Lucene是一个开源的全文搜索引擎库,由Apache软件基金会开发并维护。这个教程,"Lucene In Action, 2nd Edition MEAP"(预先发行版),提供了一个深入理解如何利用Lucene进行全文检索的宝贵...
《Lucene全文检索:简单索引与搜索实例详解》 Lucene是Apache软件基金会的开源项目,是一款强大的全文检索库,被广泛应用于Java开发中,为开发者提供了构建高性能搜索引擎的能力。在本文中,我们将深入探讨如何基于...
**Lucene 全文检索案例** Lucene 是一个高性能、可扩展的信息检索库,由Apache软件基金会开发。它提供了一个简单但功能强大的API,用于在各种数据源中实现全文搜索。这个案例将深入探讨如何使用Lucene进行全文检索...
**Spring MVC + Lucene 全文检索** 在现代Web应用中,实现高效的全文检索功能是提升用户体验的关键之一。本文将详细介绍如何使用Spring MVC框架结合Apache Lucene库来构建一个强大的全文检索系统。首先,让我们了解...
**Lucene 全文检索资源包详解** Lucene 是一个由 Apache 软件基金会开发的开源全文检索库,主要用于构建高效、可扩展的信息检索应用。这个“lucene全文检索资源包”包含了 Lucene 的一个早期版本——1.4.3,虽然...
视频详细讲解,需要的小伙伴自行网盘下载,链接见附件,永久有效。 目前业界流行的ElasticSearch和Solr搜索...系统的学习Lucene全文检索技术,全面掌握搜索原理和底层知识,为学习其他应用层面搜索技术打下坚实的基础。
### Lucene全文检索实践知识点详解 #### 一、Lucene简介与特性 Lucene是Apache Jakarta项目中的一个子项目,它提供了一套高效、灵活的全文检索解决方案。作为一个开源的文本搜索库,Lucene允许开发者轻松地为各种...