文档章节

Hello Lucene

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

前言:

    使用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")));
}




© 著作权归作者所有

共有 人打赏支持
上一篇: jdbc 连接
下一篇: 初学Lucene
C
粉丝 17
博文 300
码字总数 129943
作品 0
福州
私信 提问
慎用 Java 7,小心bug!

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

小卒过河
2011/07/29
8K
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
553
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
713
0
Lucene查询语法详解

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

黄平俊
2009/05/26
30.7K
7
[Lucene.Net] 基本用法

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

长平狐
2013/06/17
92
0

没有更多内容

加载失败,请刷新页面

加载更多

19《Java核心技术》之什么情况下Java程序会产生死锁?如何定位、修复?

一、提出问题 今天,我们会讨论一些日常开发中类似线程死锁等问题的排查经验,并选择一两修复过或者诊断过的核心类库死锁问题作为例子,希望不仅能在面试时,包括在日常工作中也能对你有所帮...

飞鱼说编程
21分钟前
0
0
golang安装gRpc

安装官方安装命令: go get google.golang.org/grpc 是安装不起的,会报: package google.golang.org/grpc: unrecognized import path "google.golang.org/grpc"(https fetch: Get https:/......

xtof
23分钟前
0
0
linux-centos7 基于等保3的系统安全体系

sshd配置 配置文件:/etc/ssh/sshd_config Note: 更改ssh相关配置后需要重启sshd服务 systemctl restart sshd 参考文档:https://man.openbsd.org/ssh.1 ssh访问控制 AllowUsers <userlist......

阿dai
23分钟前
2
0
Linux学习-1031(rsync同步工具 上)

10.28 rsync工具介绍 10.29/10.30 rsync常用选项 10.31 rsync通过ssh同步 一、 rsync工具介绍 rsync是一个同步工具,在日常的运维中常会用到。它可以本地同步,也实现可以远程两台机器同步。...

wxy丶
35分钟前
1
0
python实战一期:第一天

1. 为什么学习python 1.1 为什么要学Python? Python第一是个非常牛B的脚本语言,能满足绝大部分自动化运维的需求,又能做后端C/S架构,又能用WEB框架快速开发出高大上的Web界面,只有当你自...

laoba
37分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部