热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

lucen入门学习之一(初识Lucene)

Lucen最主要用到的又两个部分,一个是创建索引,一个是查询索引说明下下面的代码注意事项:1、如果自己比较懒的话,就把文档路径和索引路径创建到项目下,方便查看2、我下面的两个例子都是在D盘下创建Luc

Lucen最主要用到的又两个部分,一个是创建索引,一个是查询索引


说明下下面的代码注意事项:

1、如果自己比较懒的话,就把文档路径和索引路径创建到项目下,方便查看

2、我下面的两个例子都是在D盘下创建Lucene,然后分别在D:/Lucene下创建Index和Data两个文件夹

3、在Data中我创建了两个文件:record1.txt和record2.txt,内容分别为txt1和txt2,当然你也可以创建更多和更复杂的内容的文本

4、在搜索的时候我搜的是txt2所以能查到record2.txt。。-_-


一、创建索引

1、创建索引常用到的类有以下几个(有些事基类,其子类就不过多列举了,具体使用的时候再查)

IndexWriter

Direcory

Analyzer

Document

Field

具体意思就不多说了,如果你不清楚,点击这个链接http://pan.baidu.com/s/1pLrZzWB下载《lucene in action_中文版.pdf》,在第25页可以看到解释,

下面是关于创建索引的一个例子:

package com.burns.lucene_in_action;

import java.io.File;
import java.io.FileFilter;
import java.io.FileReader;
import java.io.IOException;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.Field.Index;
import org.apache.lucene.document.FieldSelectorResult;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexFileNameFilter;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;

import com.yiibai.lucene.TextFileFilter;

public class Indexer {


public static void main(String[] args) throws IOException {
//if (args.length != 2) {
//throw new IllegalArgumentException("Usage:java" + Index.class.getName() + " ");
//}
// String indexDir = args[0];
// String dataDir = args[1];
String indexDir = "D:\\Lucene\\Index";
String dataDir = "D:\\Lucene\\Data";

long start = System.currentTimeMillis();
Indexer indexer = new Indexer(indexDir);
int numIndexed;
try {
numIndexed = indexer.index(dataDir, new TextFileFilter());
} finally {
indexer.close();
}

long end = System.currentTimeMillis();
System.out.println("Indexing" + numIndexed + "files took" + (end - start) + "milliseconds");

}

public IndexWriter writer;

@SuppressWarnings("deprecation")
public Indexer(String indexDir) throws IOException {
Directory dir = FSDirectory.open(new File(indexDir));
writer = new IndexWriter(dir, new StandardAnalyzer(Version.LUCENE_30), true,
IndexWriter.MaxFieldLength.UNLIMITED);
}

public void close() throws CorruptIndexException, IOException {// 关闭Index
// Writer
writer.close();

}

public int index(String dataDir, FileFilter filter) throws IOException {
File[] files = new File(dataDir).listFiles();
for (File file : files) {
if (!file.isDirectory() && !file.isHidden() && file.exists() && file.canRead()
&& (filter == null || filter.accept(file))) {
indexFile(file);
}
}
return writer.numDocs();
}

private static class TextFileFilter implements FileFilter {
@Override
public boolean accept(File pathname) {
return pathname.getName().toLowerCase().endsWith(".txt");
}
}

protected Document getDocument(File f) throws IOException {
Document doc = new Document();
doc.add(new Field("contents", new FileReader(f)));
doc.add(new Field("filename", f.getName(), Field.Store.YES, Field.Index.NOT_ANALYZED));
doc.add(new Field("fullpath", f.getCanonicalPath(), Field.Store.YES, Field.Index.NOT_ANALYZED));
return doc;
}

private void indexFile(File f) throws IOException {
System.out.println("Indexing" + f.getCanonicalPath());
Document doc = getDocument(f);
writer.addDocument(doc);
}
}

執行結果如下:

IndexingD:\Lucene\Data\record1.txt
IndexingD:\Lucene\Data\record2.txt
Indexing2files took1954milliseconds
二、搜索/查询索引

常用的类如下:

IndexSearcher

Term

Query

TermQuery

TopDocs


例子代码如下:

package com.burns.lucene_in_action;

import java.io.File;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.queryParser.QueryParser;
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.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;

public class Searcher {

public static void main(String[] args) throws Exception {
// if (args.length != 2) {
// throw new IllegalArgumentException("Usage: java" +
// Searcher.class.getName() + " ");
// }
//
// String indexDir = args[0];
// String q = args[1];
String indexDir = "D:\\Lucene\\Index";
String q = "txt2";
search(indexDir, q);
}

private static void search(String indexDir, String q) throws Exception {
Directory dir = FSDirectory.open(new File(indexDir));
IndexSearcher is = new IndexSearcher(dir);
QueryParser parser = new QueryParser(Version.LUCENE_30, "contents", new StandardAnalyzer(Version.LUCENE_30));
Query query = parser.parse(q);
long start = System.currentTimeMillis();
TopDocs hits = is.search(query, 10);
long end = System.currentTimeMillis();

System.err.print("Found" + hits.totalHits + "document(s) (in " + (end - start)
+ "milliseconds that matched query'" + q + "':");

for (ScoreDoc scoreDoc : hits.scoreDocs) {
Document doc = is.doc(scoreDoc.doc);
System.out.println(doc.get("fullpath"));

}
is.close();
}
}

执行结果如下:

Found1document(s) (in 9milliseconds that matched query'txt2':D:\Lucene\Data\record2.txt




推荐阅读
  • 深入解析Android Activity生命周期
    本文详细探讨了Android中Activity的生命周期,通过实例代码和详细的步骤说明,帮助开发者更好地理解和掌握Activity各个阶段的行为。 ... [详细]
  • Mac环境下Java与Ant自动化构建环境搭建指南
    本文详细介绍了如何在Mac操作系统上为测试工程师搭建Java和Ant开发环境,包括环境变量配置等关键步骤。 ... [详细]
  • 如何高效学习鸿蒙操作系统:开发者指南
    本文探讨了开发者如何更有效地学习鸿蒙操作系统,提供了来自行业专家的建议,包括系统化学习方法、职业规划建议以及具体的开发技巧。 ... [详细]
  • VS Code 中 .vscode 文件夹配置详解
    本文介绍了 VS Code 中 .vscode 文件夹下的配置文件及其作用,包括常用的预定义变量和三个关键配置文件:launch.json、tasks.json 和 c_cpp_properties.json。 ... [详细]
  • 本文详细介绍如何在Spring Boot项目中集成和使用JPA,涵盖JPA的基本概念、Spring Data JPA的功能以及具体的操作步骤,帮助开发者快速掌握这一强大的持久化技术。 ... [详细]
  • 本文详细介绍了如何在Ubuntu操作系统中安装和配置Maven,包括必要的环境准备和验证步骤。 ... [详细]
  • 本文介绍了如何在Spring框架中配置和使用定时任务,包括初始化配置和动态启动定时器的方法。通过示例代码展示了如何利用Spring的TaskScheduler接口来创建和管理定时任务。 ... [详细]
  • 设计模式系列-原型模式
    一、上篇回顾上篇创建者模式中,我们主要讲述了创建者的几类实现方案,和创建者模式的应用的场景和特点,创建者模式适合创建复杂的对象,并且这些对象的每个组成部分的详细创建步骤可以是动态的变化的,但 ... [详细]
  • 本文深入探讨了JLine库中的ConsoleReader.drawBuffer()方法的使用场景和具体实现,通过多个实际代码示例,帮助开发者更好地理解和应用此方法。 ... [详细]
  • MVC框架下使用DataGrid实现时间筛选与枚举填充
    本文介绍如何在ASP.NET MVC项目中利用DataGrid组件增强搜索功能,具体包括使用jQuery UI的DatePicker插件添加时间筛选条件,并通过枚举数据填充下拉列表。 ... [详细]
  • SQLite是一种轻量级的关系型数据库管理系统,尽管体积小巧,却能支持高达2TB的数据库容量,每个数据库以单个文件形式存储。本文将详细介绍SQLite在Android开发中的应用,包括其数据存储机制、事务处理方式及数据类型的动态特性。 ... [详细]
  • 本文详细探讨了 Java 中 com.codahale.metrics.servlets.AdminServlet.() 方法的实现与应用,并提供了多个实际项目中的代码示例,帮助开发者更好地理解和使用这一方法。 ... [详细]
  • 本文深入探讨了HTML5中十五个重要的新特性,为开发者提供了详细的指南。 ... [详细]
  • 本文介绍了JSP的基本概念、常用标签及其功能,并通过示例详细说明了如何在JSP页面中使用Java代码。 ... [详细]
  • 本文档旨在提供C语言的基础知识概述,涵盖常量、变量、数据类型、控制结构及函数定义等内容。特别强调了常量的不同类型及其在程序中的应用,以及如何正确声明和使用函数。 ... [详细]
author-avatar
可卡因
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有