版权声明:本文为博主原创文章。转载请注明来自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、创建索引库IndexWriterwriter = 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、依据文件创建文档DocumentDocument 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);

转载于:https://www.cnblogs.com/mqxnongmin/p/10472754.html

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

  1. 【spring教程之中的一个】创建一个最简单的spring样例

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

  2. java中使用tika_【Tika基础教程之中的一个】Tika基础教程

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

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

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

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

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

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

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

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

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

  7. 【iOS与EV3混合机器人编程系列之中的一个】iOS要干嘛?EV3能够更酷!

    乐高Mindstorm EV3智能机器人(下面简称EV3) 自从在2013年的CES(Consumer Electronics Show美国消费电子展)上展出之后, 就吸引了全球广大机器人爱好者的眼球 ...

  8. Scott Mitchell 的ASP.NET 2.0数据教程之一: 创建一个数据访问层

    原文 | 下载本教程中的编码例子 | 下载本教程的英文PDF版 导言 作为web开发人员,我们的生活围绕着数据操作.我们建立数据库来存储数据,写编码来访问和修改数据,设计网页来采集和汇总数据.本文是研 ...

  9. SoC嵌入式软件架构设计之中的一个:系统内存需求评估

    内存是SoC(System on Chip,片上系统)集成设计的重要模块.是SoC中成本比重较大的部分.内存管理的软硬件设计是SoC软件架构设计的重要一环,架构设计师必需要在成本和效率中取得平衡,做到 ...

最新文章

  1. python自学书籍顺序-python:入门到实践书籍学习(六)
  2. hdu4995 (不错的小模拟)
  3. elasticsearch 第三篇(安装篇)
  4. 在Android初次的前期学习中的二个小例子(2)
  5. Code 0001: Wait rx completed
  6. 学习笔记(01):Oracle数据库-Oracle安装与配置
  7. 深入理解Java内存模型
  8. 安卓开发大全、系列文章、精品教程
  9. oracle awr报告生成_[ORACLE],SQL性能报告(AWR)导出,扶你走上调优大神之路
  10. 关于 printf(%*.*s/n,m,n,ch) 的问题
  11. 常用的坐标系及其EPSG编码
  12. matlab粒子群运动模拟伪代码,基本粒子群优化算法(PSO)的matlab实现
  13. 人工智能基础——知识的表示方法,语义网络表示方法
  14. 2022中山大学计算机考研专硕初试经验分享
  15. 科技爱好者周刊:第 90 期
  16. java网上书店管理系统_简单的网上书店管理系统(java)
  17. PIR热释电传感器使用笔记
  18. 用友nc登陆提示java_用友NC软件无法进入登陆界面,提示“网页上有错误”等现象   问题现象...
  19. RoadFlow的流程的方法
  20. 基于Small及Weex的定制化APP方案

热门文章

  1. Linux文件系统的实现 (图文并茂,比较好)
  2. Struts 2初体验
  3. AutoLayout bug集合
  4. spring-boot注解详解(四)
  5. 算法 --- [map的使用]求最大和谐子序列
  6. koa --- [MVC实现之二]Controller层的实现
  7. Webpack进阶(一) tree shaking与不同mode
  8. ES5-11原型与原型链深入、对象继承
  9. OC Swift混编-Swift.h File not found
  10. JavaScript 基础知识 - BOM篇