在Lucene对文本进行处理的过程中,可以大致分为三大部分:

1、索引文件:提取文档内容并分析,生成索引

2、搜索内容:搜索索引内容,根据搜索关键字得出搜索结果

3、分析内容:对搜索词汇进行分析,生成Quey对象。

注:事实上,除了最基本的完全匹配搜索以外,其它都需要在搜索前进行分析。

如不加分析步骤,则搜索JAVA,是没有结果的,因为在索引过程中已经将词汇均转化为小写,而此处搜索时则要求关键字完全匹配。

使用了QueryParser类以后,则根据Analyzer的具体实现类,对搜索词汇进行分析,如大小写转换,java and ant等的搜索词解释等。

一、索引文件

基本步骤如下:

1、创建索引库IndexWriter

2、根据文件创建文档Document

3、向索引库中写入文档内容

package com.ljh.search.index;

import java.io.File;
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.LongField;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version; // 1、创建索引库IndexWriter
// 2、根据文件创建文档Document
// 3、向索引库中写入文档内容 public class IndexFiles { public static void main(String[] args) throws IOException { String usage = "java IndexFiles"
+ " [-index INDEX_PATH] [-docs DOCS_PATH] \n\n"
+ "This indexes the documents in DOCS_PATH, creating a Lucene index"
+ "in INDEX_PATH that can be searched with SearchFiles"; String indexPath = null;
String docsPath = null;
for (int i = 0; i < args.length; i++) {
if ("-index".equals(args[i])) {
indexPath = args[i + 1];
i++;
} else if ("-docs".equals(args[i])) {
docsPath = args[i + 1];
i++;
}
} if (docsPath == null) {
System.err.println("Usage: " + usage);
System.exit(1);
} final File docDir = new File(docsPath);
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);
} IndexWriter writer = null;
try {
// 1、创建索引库IndexWriter
writer = getIndexWriter(indexPath);
index(writer, docDir);
} catch (IOException e) {
e.printStackTrace();
} finally {
writer.close();
} } private static IndexWriter getIndexWriter(String indexPath)
throws IOException { Directory indexDir = FSDirectory.open(new File(indexPath)); IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_48,
new StandardAnalyzer(Version.LUCENE_48)); IndexWriter writer = new IndexWriter(indexDir, iwc); return writer;
} private static void index(IndexWriter writer, File file) throws IOException { if (file.isDirectory()) {
String[] files = file.list();
if (files != null) {
for (int i = 0; i < files.length; i++) {
index(writer, new File(file, files[i]));
}
}
} else {
// 2、根据文件创建文档Document
Document doc = new Document();
Field pathField = new StringField("path", file.getPath(),
Field.Store.YES);
doc.add(pathField);
doc.add(new LongField("modified", file.lastModified(),
Field.Store.NO));
doc.add(new TextField("contents", new FileReader(file)));
System.out.println("Indexing " + file.getName()); // 3、向索引库中写入文档内容
writer.addDocument(doc);
} } }

(1)使用“java indexfiles -index d:/index -docs d:/tmp”运行程序,索引d:/tmp中的文件,并将索引文件放置到d:/index。

(2)上述生成的索引文件可以使用Luke进行查看。目前Luke已迁移至github进行托管。

二、搜索文件

1、打开索引库IndexSearcher

2、根据关键词进行搜索

3、遍历结果并处理

package com.ljh.search.search;

//1、打开索引库IndexSearcher
//2、根据关键词进行搜索
//3、遍历结果并处理
import java.io.File;
import java.io.IOException; import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory; public class Searcher {
public static void main(String[] args) throws IOException { String indexPath = null;
String term = null;
for (int i = 0; i < args.length; i++) {
if ("-index".equals(args[i])) {
indexPath = args[i + 1];
i++;
} else if ("-term".equals(args[i])) {
term = args[i + 1];
i++;
}
} System.out.println("Searching " + term + " in " + indexPath); // 1、打开索引库
Directory indexDir = FSDirectory.open(new File(indexPath));
IndexReader ir = DirectoryReader.open(indexDir);
IndexSearcher searcher = new IndexSearcher(ir); // 2、根据关键词进行搜索
TopDocs docs = searcher.search(
new TermQuery(new Term("contents", term)), 20); // 3、遍历结果并处理
ScoreDoc[] hits = docs.scoreDocs;
System.out.println(hits.length);
for (ScoreDoc hit : hits) {
System.out.println("doc: " + hit.doc + " score: " + hit.score);
} ir.close(); } }

三、分析

事实上,除了最基本的完全匹配搜索以外,其它都需要在搜索前进行分析。

如不加分析步骤,则搜索JAVA,是没有结果的,因为在索引过程中已经将词汇均转化为小写,而此处搜索时则要求关键字完全匹配。

使用了QueryParser类以后,则根据Analyzer的具体实现类,对搜索词汇进行分析,如大小写转换,java and ant等的搜索词解释等。

分析过程有2个基本步骤:

1、生成QueryParser对象

2、调用QueryParser.parse()生成Query()对象。

具体代码,将下述代码:

		// 2、根据关键词进行搜索
TopDocs docs = searcher.search(
new TermQuery(new Term("contents", term)), 20);

用以下代替:

		// 2、根据关键词进行搜索
/*TopDocs docs = searcher.search(
new TermQuery(new Term("contents", term)), 10);*/
QueryParser parser = new QueryParser(Version.LUCENE_48, "contents", new SimpleAnalyzer(Version.LUCENE_48));
Query query = null;
try {
query = parser.parse(term);
} catch (ParseException e) {
e.printStackTrace();
}
TopDocs docs = searcher.search(query, 30);

【Lucene4.8教程之一】使用Lucene4.8进行索引及搜索的基本操作的更多相关文章

  1. 【Lucene4.8教程之中的一个】使用Lucene4.8进行索引及搜索的基本操作

    版权声明:本文为博主原创文章.转载请注明来自http://blog.csdn.net/jediael_lu/ https://blog.csdn.net/jediael_lu/article/deta ...

  2. 【Lucene4.8教程之三】搜索

    1.关键类 Lucene的搜索过程中涉及的主要类有以下几个: (1)IndexSearcher:执行search()方法的类 (2)IndexReader:对索引文件进行读操作,并为IndexSear ...

  3. 【Lucene4.8教程之二】索引

    一.基础内容 0.官方文档说明 (1)org.apache.lucene.index provides two primary classes: IndexWriter, which creates ...

  4. 【Lucene4.8教程之三】搜索 2014-06-21 09:53 1532人阅读 评论(0) 收藏

    1.关键类 Lucene的搜索过程中涉及的主要类有以下几个: (1)IndexSearcher:执行search()方法的类 (2)IndexReader:对索引文件进行读操作,并为IndexSear ...

  5. 【Lucene4.8教程之二】索引 2014-06-16 11:30 3845人阅读 评论(0) 收藏

    一.基础内容 0.官方文档说明 (1)org.apache.lucene.index provides two primary classes: IndexWriter, which creates ...

  6. MWeb for Mac使用教程-如何在文档库中快速搜索

    使用MWeb for Mac专业的 Markdown 编辑写作软件,可以让你随时记录自己的想法,灵感,创意,为您的工作节省宝贵的时间.本篇文章带来的是MWeb for Mac如何在文档库中快速搜索使用 ...

  7. 【Lucene4.8教程之四】分析

    1.基础内容 (1)相关概念 分析(Analysis),在Lucene中指的是将域(Field)文本转换成最主要的索引表示单元--项(Term)的过程.在搜索过程中,这些项用于决定什么样的文档可以匹配 ...

  8. 【Lucene4.8教程之五】Luke

    一.Luke基本内容 1.Luke简介 Luke可用于查看Lucene创建的索引,并对其进行基本操作. 2.创建Luke (1)从Github上下载源文件 https://github.com/tar ...

  9. 【Lucene4.8教程之六】QueryParser与Query子类:如何生成Query对象

    一.概述 1.对于一个搜索而言,其核心语句为: searcher.search(query, 10); 此时,其最重要的参数为一个Qeury对象.构造一个Query对象有2种方法: (1)使用Quer ...

随机推荐

  1. OpenCV——像素数据类型总结<摘>

    1.Unsigned 8bits(一般的图像文件格式使用的大小)IplImage数据结构参数:IPL_DEPTH_8UCvMat数据结构参数:CV_8UC1,CV_8UC2,CV_8UC3,CV_8U ...

  2. uva 508 Morse Mismatches

    Samuel F. B. Morse is best known for the coding scheme that carries his name. Morse code is still us ...

  3. MVC 模型、视图、控制及其单入口文件的mvc的工作原理

         什么是mvc,mvc就是模型视图控制,模型就是model,在项目中负责数据库相关的操作,视图就是view ,负责页面的展示和数据的展示,控制就是controller ,负责中间的逻辑转换,数 ...

  4. java的LinkedList的用法

    http://blog.chinabyte.com/blog.php?do-showone-uid-135325-itemid-454704-type-blog.html 总结下,LinkedList ...

  5. 居然因为交换错了好几把。。。。,还有坑点是num1可以大于num2

    完数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submissi ...

  6. Oracle Trunc

    http://www.cnblogs.com/xiaoyudz/archive/2011/03/18/1988467.html

  7. Android的debug.keystore拒绝访问导致的生成异常及解决方案

    构建Android应用程序的时候输出异常:[apkbuilder] keytool 错误: java.io.FileNotFoundException: C:\Users\my\.android\de ...

  8. 基于jeasyui的遮罩扩展[修复链式bug]

    说明和使用方法看下面代码,直接复制下面代码保存为js文件,引用即可. 遮罩效果从datagrid中提取,针对jquery进行优化. 下载地址(附Demo):http://pan.baidu.com/s ...

  9. 【总结】OJ练习,进行的一些编程语言方面总结

    1.STL vector只有四个构造函数 ) explicit vector (const allocator_type& alloc = allocator_type()); fill () ...

  10. SDP简要解析

    1.概述SDP也是MMUSIC工作组的一个产品,在MBONE内容中用得很多.其目的就是在媒体会话中,传递媒体流信息,允许会话描述的接收者去参与会话.SDP基本上在internet上工作.他定义了会话画 ...