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

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

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

2、搜索内容:搜索索引内容,依据搜索keyword得出搜索结果

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

注:其实。除了最主要的全然匹配搜索以外。其他都须要在搜索前进行分析。

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

使用了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。是没有结果的,由于在索引过程中已经将词汇均转化为小写。而此处搜索时则要求keyword全然匹配。

使用了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. 【spring教程之中的一个】创建一个最简单的spring样例

    1.首先spring的主要思想,就是依赖注入.简单来说.就是不须要手动new对象,而这些对象由spring容器统一进行管理. 2.样例结构 如上图所看到的,採用的是mavenproject. 2.po ...

  2. 【solr基础教程之中的一个】Solr相关知识点串讲

           Solr是Apache Lucene的一个子项目.Lucene为全文搜索功能提供了完备的API.但它仅仅作为一个API库存在.而不能直接用于搜索. 因此,Solr基于Lucene构建了一 ...

  3. 【Tika基础教程之中的一个】Tika基础教程

    一.高速入门 1.Tika是一个用于文本解释的框架.其本身并不提供不论什么的库用于解释文本,而是调用各种各样的库,如POI,PDFBox等. 使用Tika.能够提取文件里的作者.标题.创建时间.正文等 ...

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

    在Lucene对文本进行处理的过程中,可以大致分为三大部分: 1.索引文件:提取文档内容并分析,生成索引 2.搜索内容:搜索索引内容,根据搜索关键字得出搜索结果 3.分析内容:对搜索词汇进行分析,生成 ...

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

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

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

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

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

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

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

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

  9. 【浅墨Unity3D Shader编程】之中的一个 夏威夷篇:游戏场景的创建 &amp; 第一个Shader的书写

    本系列文章由@浅墨_毛星云 出品.转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40723789 作者:毛星云(浅墨)  ...

随机推荐

  1. C# GDI+编程之绘图

    在了解绘图之前,我们先讲几个预备知识 一.坐标系 坐标系是图形设计的基础.GDI+使用三个坐标空间:世界.页面和设备,其中,世界坐标是用于建立特殊图形世界模型的坐标系,也是在.NET Framewor ...

  2. FFmpeg数据结构AVFrame

    本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10404502.html 本文基于FFmpeg 4.1版本. 1. 数据结构定义 stru ...

  3. 因 URL 意外地以“/HelloWorld”结束,请求格式无法识别。

    WebService中发布之后出现这个错误, 解决方法: web.config文件中的 <system.web> 节点下加入:<webServices>    <prot ...

  4. 使用git push命令如何忽略不想提交的文件夹或者文件

    如下场景是在window下的操作. 在使用node的时候有个node_modules文件夹很大,一般情况下不想提交,忽略的办法如: 方法一(来自评论区):直接在仓库根目录:执行命令echo 'node ...

  5. 使用js从element的matrix推导transform的scale、rotate 和 translate参数

    transform 网上很多都只介绍了还原角度和缩放的参数,但是没有就偏移量的计算,自己还原了一下公式的意义,进行了公式的反推,具体的推到过程就不详叙了,可以参看w3c的矩阵含义. 直接上干货. fu ...

  6. jsp使用servlet实现文件上传

    1.在index.jsp中写入以下代码 <form method="post" action="demo3" enctype="multipar ...

  7. Fundebug是这样备份数据的

    摘要: 数据还是要备份的,万一删库了呢? 本文代码仓库: fundebug-mongodb-backup 引言 今年8月,腾讯云竟然把客户前沿数据的数据弄没了,Fundebug在第一时间进行了一些简单 ...

  8. lfs(systemv版本)学习笔记-第1页

    我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 一名linux爱好者,记录构建Linux From Scratch的过程 经博客园-骏马金龙前辈介绍,开始接触学习lfs,用博客 ...

  9. curl 发送 post 请求

    curl -i -X POST -H 'Content-type':'application/json' -d '{"keyWord":"雅诗兰黛"," ...

  10. GIS小知识

    1.GeoJson 2.EPSG:3857 几何对象:{"id":0,"style":null,"parts":[1],"poin ...