文档章节

Hello Lucene

C
 Canaan_
发布于 2015/12/26 10:22
字数 629
阅读 108
收藏 8
点赞 0
评论 0

前言:

    使用lucene主要的几步骤:

准备(创建索引):

  1. 创建索引目录
  2. 选用构建分词解析器
  3. 构建写索引器
  4. 将数据库的表记录,文件系统的文本,或其它的数据封装成一个Document
  5. 解析Document最终生成索引

使用(查询):

  1. 构建读索引器(指定索引目录)
  2. 索引查询器
  3. 选用构建分词解析器
  4. 构建查询对象Query
  5. 索引查询器根据Query对象得到查询结果

使用lucene要把大部分的精力放在创建索引这块

code:

创建索引:


import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer;
import org.apache.lucene.analysis.util.CharArraySet;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
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;

public static void init() throws IOException {
		/**
		 * step 1
		 * 创建Directory索引文件存放目录
		 */
		Path path = Paths.get("F:/lucene/index");	
		Directory directory = FSDirectory.open(path);
		
		/**
		 * step 2
		 * 选用构建分词解析器
		 */
		CharArraySet stopword = new CharArraySet(200, true);//除去不必构建索引的词
		stopword.add("是,的,我,们,你,他,那,这,它".split(","));
		Analyzer analyzer = new SmartChineseAnalyzer(stopword);
				                                                      
		/**
		 * step3 
		 * 构建写索引器
		 */
		IndexWriterConfig iwc = new IndexWriterConfig(analyzer);
		IndexWriter writer = new IndexWriter(directory, iwc);
		writer.deleteAll();//清空索引
		
		/**
		 * step4 & stpe5
		 * 将数据库的表记录,文件系统的文本,或其它的数据封装成一个Document,
		 * 并通过写索引器解析Document生成索引文件
		 */
		File doc = new File("F:/lucene/doc");//源文件
		for (File file : doc.listFiles()) {
			System.out.println(String.format("read file : %s", file.getName()));
			Document document = new Document();
			document.add(new TextField("title", file.getName(), Field.Store.YES)); //文章的标题
            document.add(new TextField("contents", new FileReader(file)));  //文章的内容
            document.add(new StringField("path", file.getAbsolutePath(), Field.Store.YES)); //文章的地址
            writer.addDocument(document);  
		}
		writer.close();
	}


查询:


import java.io.IOException;
import java.nio.file.Paths;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.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;

public static ScoreDoc[] query(String key) throws IOException, ParseException{
		/**
		 * stpe1
		 * 构建读索引器(指定索引目录)
		 */
		Directory directory = FSDirectory.open(Paths.get("F:/lucene/index"));//索引文件存放目录
		IndexReader indexReader = DirectoryReader.open(directory);
		
		/**
		 * stpe2
		 * 查询器
		 */
		IndexSearcher searcher = new IndexSearcher(indexReader);
		
		/**
		 * stpe3
		 * 选用构建分词解析器,要和创建索引时的分析器一致
		 */
		Analyzer analyzer = new SmartChineseAnalyzer();
		
		/**
		 * step4 
		 * 创建Query
		 * key: 查询关键字
		 * contents:只在文章内容中配置查询(这是你创建索引时指定的域名).
		 * 所有你也可以指定“title”即按标题查询,当然lunene提交多域查询
		 */
		QueryParser queryParser = new QueryParser("contents", analyzer);
		Query query = queryParser.parse(key);
		
		/**
		 * step 5 
		 *  查询得到查询结果
		 */
		TopDocs topDocs = searcher.search(query, 10);
		indexReader.close();
		return topDocs.scoreDocs;
	}


根据业务来处理得到的结果


ScoreDoc[] hits =  query("lucene文章");
for (ScoreDoc scoreDoc : hits) {
	int docId = scoreDoc.doc;
	Document d = indexSearcher.doc(docId);
	System.out.println(String.format("文章名字:%s /t 路径:%s", d.get("title"),d.get("path")));
}




© 著作权归作者所有

共有 人打赏支持
C
粉丝 13
博文 226
码字总数 97359
作品 0
福州
lucene简单实例

应工作需求,写了个简单lucene索引/检索的实例。就两个main方法,没考虑代码抽象和封装。 lucene包下载: http://labs.mop.com/apache-mirror/lucene/java/3.6.1/ 下载lucene-3.6.1.zip 索引...

萝卜丁辣子 ⋅ 2012/09/20 ⋅ 0

慎用 Java 7,小心bug!

Java 7 GA 今天发布了,但是如Uwe Schindler 所述,HotSpot Loop optimizations存在一些非常可怕的默认启用的bug。最好的情况下,这些bug会导致JVM崩溃,最坏的情况下,会导致loops的不正确的...

小卒过河 ⋅ 2011/07/29 ⋅ 27

lucene 4 query 解析错误 跪求解答

package my; import org.apache.lucene.util.Version; public class Text { public static void main(String[] args) throws IOException, ParseException { //建立索引 Directory dir=new ......

千军万马力千钧 ⋅ 2014/07/30 ⋅ 1

lucene4.5 deleteAll deleteDocuments 不管用 ,求指教啊

/ 建立索引** */ // 索引文件目录 Directory indexDir = new SimpleFSDirectory(new File("D:" + File.separator + "testindex")); // Directory indexDir = new RAMDirectory(); System.ou......

xianwu13 ⋅ 2014/05/23 ⋅ 0

对使用Lucene的一点点认识

就我而言我使用Lucene就是为了搜索而已,所以我就以这个目的来描述这个笔记。我使用Lucene的步骤如下: 1:创建索引 2:学习有哪些过滤器 3:学习有哪些查询器(很多) 4:学习有哪些分词器(...

lixiyuan ⋅ 2014/06/08 ⋅ 2

lucene 学习笔记

lucene是基于java的全文搜索引擎框架 lucene的存储结构 lucene 其实很简单的,它最主要就是做两件事:建立索引和进行搜索 IndexWriter:lucene中最重要的的类之一,它主要是用来将文档加入索引,...

晨曦之光 ⋅ 2012/02/13 ⋅ 0

Lucene查询语法详解

Lucene提供了丰富的API来组合定制你所需要的查询器,同时也可以利用Query Parser提供的强大的查询语法解析来构造你想要的查询器。本文章详细的介绍了Lucene的查询语法。通过Java语法分析器把...

黄平俊 ⋅ 2009/05/26 ⋅ 7

[Lucene.Net] 基本用法

本文仅记录一些简单的使用方法,供初学者参考。作者:yuhen 以下例子采用 Lucene.NET 1.9 版本,可取去Lucene.Net 下载。 1. 基本应用 using System; using System.Collections.Generic; usin...

长平狐 ⋅ 2013/06/17 ⋅ 0

[Lucene.Net] 应用实践

作者: yuhen 实验一 下面的代码中,我们使用两个线程来模拟并发的读写操作。运行该代码,我们会发现 IndexReader 并不能获得 Directory 的变更数据。 private void Test1() { Directory dir...

长平狐 ⋅ 2013/06/17 ⋅ 0

lucene之索引创建

package org.itat.index; import java.io.File; import java.io.IOException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.u......

泡海椒 ⋅ 2015/12/02 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

熊掌号收录比例对于网站原创数据排名的影响[图]

从去年下半年开始,我在写博客了,因为我觉得业余写写博客也还是很不错的,但是从2017年下半年开始,百度已经推出了原创保护功能和熊掌号平台,为此,我也提交了不少以前的老数据,而这些历史...

原创小博客 ⋅ 57分钟前 ⋅ 0

LVM讲解、磁盘故障小案例

LVM LVM就是动态卷管理,可以将多个硬盘和硬盘分区做成一个逻辑卷,并把这个逻辑卷作为一个整体来统一管理,动态对分区进行扩缩空间大小,安全快捷方便管理。 1.新建分区,更改类型为8e 即L...

蛋黄Yolks ⋅ 今天 ⋅ 0

Hadoop Yarn调度器的选择和使用

一、引言 Yarn在Hadoop的生态系统中担任了资源管理和任务调度的角色。在讨论其构造器之前先简单了解一下Yarn的架构。 上图是Yarn的基本架构,其中ResourceManager是整个架构的核心组件,它负...

p柯西 ⋅ 今天 ⋅ 0

uWSGI + Django @ Ubuntu

创建 Django App Project 创建后, 可以看到路径下有一个wsgi.py的问题 uWSGI运行 直接命令行运行 利用如下命令, 可直接访问 uwsgi --http :8080 --wsgi-file dj/wsgi.py 配置文件 & 运行 [u...

袁祾 ⋅ 今天 ⋅ 0

JVM堆的理解

在JVM中,我们经常提到的就是堆了,堆确实很重要,其实,除了堆之外,还有几个重要的模块,看下图: 大 多数情况下,我们并不需要关心JVM的底层,但是如果了解它的话,对于我们系统调优是非常...

不羁之后 ⋅ 昨天 ⋅ 0

推荐:并发情况下:Java HashMap 形成死循环的原因

在淘宝内网里看到同事发了贴说了一个CPU被100%的线上故障,并且这个事发生了很多次,原因是在Java语言在并发情况下使用HashMap造成Race Condition,从而导致死循环。这个事情我4、5年前也经历...

码代码的小司机 ⋅ 昨天 ⋅ 1

聊聊spring cloud gateway的RetryGatewayFilter

序 本文主要研究一下spring cloud gateway的RetryGatewayFilter GatewayAutoConfiguration spring-cloud-gateway-core-2.0.0.RC2-sources.jar!/org/springframework/cloud/gateway/config/G......

go4it ⋅ 昨天 ⋅ 0

创建新用户和授予MySQL中的权限教程

导读 MySQL是一个开源数据库管理软件,可帮助用户存储,组织和以后检索数据。 它有多种选项来授予特定用户在表和数据库中的细微的权限 - 本教程将简要介绍一些选项。 如何创建新用户 在MySQL...

问题终结者 ⋅ 昨天 ⋅ 0

android -------- 颜色的半透明效果配置

最近有朋友问我 Android 背景颜色的半透明效果配置,我网上看资料,总结了一下, 开发中也是常常遇到的,所以来写篇博客 常用的颜色值格式有: RGB ARGB RRGGBB AARRGGBB 这4种 透明度 透明度...

切切歆语 ⋅ 昨天 ⋅ 0

CentOS开机启动subversion

建立自启动脚本: vim /etc/init.d/subversion 输入如下内容: #!/bin/bash## subversion startup script for the server## chkconfig: 2345 90 10# description: start the subve......

随风而飘 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部