对照着lucene官方DEMO做了个例子,自己简化了一下:
我用的是lucene-2.2.0
首先产生索引文件:
IndexFile
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.Term;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Date;
/** Index all text files under a directory. */
public class IndexFiles {
private IndexFiles() {}
//索引文件存放的目录
static final File INDEX_DIR = new File("D://luceneindex");
/** Index all text files under a directory. */
public static void main(String[] args) {
//被索引的文件存放的目录,可以在这个目录里放一些文本文件.
final File docDir = new File("D://lucenedata");
if (!docDir.exists() || !docDir.canRead()) {
System.out.println("Document directory '" +docDir.getAbsolutePath()+
"' does not exist or is not readable, please check the path");
System.exit(1);
}
Date start = new Date();
try {
/*
* 这个类作用是产生索引的,构造函数有三个参数,第一个参数INDEX_DIR是所产生的索引文件存放的目录,
* 第二个参数是一个分析器,第三个参数是意思是新建索引.
* */
IndexWriter writer = new IndexWriter(INDEX_DIR, new StandardAnalyzer(), true);
System.out.println("Indexing to directory '" +INDEX_DIR+ "'...");
indexDocs(writer, docDir);
System.out.println("Optimizing...");
writer.optimize();//
writer.close();
Date end = new Date();
System.out.println(end.getTime() - start.getTime() + " total milliseconds");
} catch (IOException e) {
System.out.println(" caught a " + e.getClass() +
"\n with message: " + e.getMessage());
}
}
static void indexDocs(IndexWriter writer, File file)
throws IOException {
// do not try to index files that cannot be read
if (file.canRead()) {
if (file.isDirectory()) {
String[] files = file.list();
// an IO error could occur
if (files != null) {
for (int i = 0; i < files.length; i++) {
indexDocs(writer, new File(file, files[i]));
}
}
} else {
System.out.println("adding " + file);
try {
writer.addDocument(FileDocument.Document(file));//添加被索引的文本文件
}
// at least on windows, some temporary files raise this exception with an "access denied" message
// checking if the file can be read doesn't help
catch (FileNotFoundException fnfe) {
;
}
}
}
}
}
SearchFiles这个文件利用所产生的索引文件进行搜索:
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.FilterIndexReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.Searcher;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Date;
public class SearchFiles {
public static void main(String[] args) throws Exception {
String index = "D://luceneindex";
String field = "contents";
IndexReader reader = IndexReader.open(index);
Searcher searcher = new IndexSearcher(reader);
Analyzer analyzer = new StandardAnalyzer();
BufferedReader in = null;
in = new BufferedReader(new InputStreamReader(System.in, "UTF-8"));
QueryParser parser = new QueryParser(field, analyzer);
System.out.println("");
while (true) {
System.out.println("Enter query: ");
String line = in.readLine();
if (line == null || line.length() == -1)
break;
line = line.trim();
if (line.length() == 0)
break;
Query query = parser.parse(line);
System.out.println("Searching for: " + query.toString(field));
Hits hits = searcher.search(query);
System.out.println(hits.length() + " total matching documents");
final int HITS_PER_PAGE = 10;
for (int start = 0; start < hits.length(); start += HITS_PER_PAGE) {
int end = Math.min(hits.length(), start + HITS_PER_PAGE);
for (int i = start; i < end; i++) {
Document doc = hits.doc(i);
String path = doc.get("path");
if (path != null) {
System.out.println((i + 1) + ". " + path);
System.out.println("modify time :"
+ doc.get("modified"));
String title = doc.get("title");
if (title != null) {
System.out.println(" Title: " + doc.get("title"));
}
} else {
System.out.println((i + 1) + ". "
+ "No path for this document");
}
}
if (hits.length() > end) {
System.out.println("more (y/n) ? ");
line = in.readLine();
if (line.length() == 0 || line.charAt(0) == 'n')
break;
}
}
}
reader.close();
}
}
分享到:
相关推荐
《Lucene 4.9初体验:深入源码解析》 Apache Lucene 是一个高性能、全文本搜索引擎库,被广泛应用于各种搜索应用中。本文主要针对Lucene 4.9版本进行探讨,通过源码阅读,帮助读者深入了解其内部工作原理和机制。 ...
通过学习和实践"SearchDemo",开发者可以深入了解Lucene.NET的工作原理,掌握如何在自己的项目中有效利用这个强大的搜索引擎库,从而提升信息检索的效率和用户体验。无论你是初涉全文搜索,还是希望进一步提升搜索...
到了20世纪90年代末至21世纪初,Infoseek、AltaVista以及Google和百度等搜索引擎的兴起标志着搜索引擎行业的繁荣期。 - **全文检索系统**:全文检索系统是指通过对文档中的每个词汇建立索引的方式,实现对文档内容...
《Nutch初体验:深入解析开源搜索引擎框架》 Nutch是一个开源的全文搜索引擎项目,它主要专注于网络爬虫和信息提取。Nutch以其强大的可扩展性和灵活性,被广泛用于构建大规模的网页抓取和索引系统。在这个初体验中...
Solr初体验 Apache Solr 是一款开源的全文搜索引擎,基于 Lucene 库,提供了高效、可扩展的搜索和分析功能。它不仅用于网站的全文检索,还广泛应用于企业级的文档检索、商品搜索以及数据挖掘等领域。这篇博客将带你...
Solr初体验:深入理解开源全文搜索引擎 Solr,全称Apache Solr,是一个高度可扩展的、开源的全文搜索引擎平台。它允许开发者通过HTTP接口对大量文本数据进行高效的搜索和分析。Solr由Java编写,是Apache软件基金会...
ES作为MySQL等关系型数据库的LIKE功能出现(当然这只是简单的类比),基于Apache的Lucene实现,提供RESTful风格的操作(增删改查)。随着ES生态的不断繁荣,结合ELK(ElasticSearch, Logstash, Kibana
Nutch初体验包括爬行企业内部网和爬行全网,两种模式均有详细的步骤说明,包括配置、执行抓取命令和测试结果。Nutch提供的数据集基本组成,以及爬行"官方"网址和中文网址的具体操作。 6. Nutch基本原理分析 Nutch的...
7. **Lucene和Solr**: Lucene是Java的全文检索库,而Solr是在Lucene基础上构建的搜索引擎服务器。它们用于实现高效的文本搜索功能,理解和掌握这些技术对于提升网站和应用的搜索体验至关重要。 8. **综合案例知识点...
Nutch初体验部分涉及爬行企业内部网和爬行全网。这一部分详细介绍了如何配置Nutch以及Tomcat,执行抓取命令,并对结果进行测试。其中,爬行企业内部网涉及到IntranetRecrawl,而爬行全网则详细讨论了爬行官方网址和...
以上内容构成了Nutch入门教程的核心知识点,从简介、安装配置、初体验、基本原理、分析方法、分布式文件系统以及应用等多方面,详细介绍了Nutch框架及其使用方法,为对搜索引擎感兴趣的用户提供了一个全面的学习资源...
Elasticsearch设计之初就考虑了分布式场景,它支持数据的自动分片和复制,能够轻松扩展到数百甚至上千个节点,处理PB级别的数据。每个节点都可以独立工作,并且可以通过添加更多节点来提高系统的容错性和可扩展性。...
3. nutch初体验7 3.1 爬行企业内部网....7 3.1.1 配置nutch....7 3.1.2 配置tomcat..8 3.1.3 执行抓取命令......9 3.1.4 测试结果...11 3.1.5 Intranet Recrawl..13 3.2 爬行全网.....18 3.2.1 nutch数据集...
3. nutch初体验7 3.1 爬行企业内部网....7 3.1.1 配置nutch....7 3.1.2 配置tomcat..8 3.1.3 执行抓取命令......9 3.1.4 测试结果...11 3.1.5 Intranet Recrawl..13 3.2 爬行全网.....18 3.2.1 nutch数据集的基本...
Nutch初体验 **3.1 爬行企业内部网** 初次使用Nutch时,可以先尝试爬行企业内部网络,熟悉Nutch的抓取流程。这涉及到配置Nutch的抓取策略,如定义起始URL,设置抓取深度,以及配置过滤规则避免抓取不必要的页面。...
nutch初体验 在初步接触Nutch时,用户可以通过以下几种方式实践: - **爬行企业内部网**:通过配置Nutch,可以抓取公司内网的网页,了解Nutch的基本操作流程。 - **爬行全网**:了解Nutch的数据集构成,尝试抓取...
Nutch 初体验 - **爬行企业内部网**: - **配置 Nutch**: 设置抓取规则、URL 范围等。 - **配置 Tomcat**: 适配 Nutch 的 Web 界面设置。 - **执行抓取命令**: 使用 `bin/nutch crawl` 命令开始抓取。 - **测试...
Kibana是Elastic Stack中的一个重要组件,版本6.2.4是其在2018年初发布的一个稳定版本。它是一个基于Web的界面,专为Elasticsearch设计,旨在帮助用户对收集到的海量数据进行可视化分析和交互式探索。通过Kibana,你...