文档章节

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
博文 314
码字总数 135202
作品 0
福州
私信 提问
慎用 Java 7,小心bug!

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

小卒过河
2011/07/29
8.1K
27
lucene 思维导图,让搜索引擎不再难懂

(公众号回复“lucene”获取源导图) 今天,我们来讲讲lucene,同学们搬好板凳坐好啦。 (lucene干嘛的呀?) 首先我们来看张思维导图: 以上是我们java常用的全文搜索引擎框架,很多项目的搜...

java思维导图
2018/11/29
0
0
Lucene查询语法详解

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

黄平俊
2009/05/26
32.7K
7
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
13
0
Lucene教程详解

注明:本文是由本人在开发有关基于lucene资源检索系统时的一点总结,其中一部分是自己根据开发过程自己总结的,也有部分是摘自网络,因无法获取当时摘文的地址,所以在此没有写源地址。 转载...

长平狐
2012/11/12
1K
2

没有更多内容

加载失败,请刷新页面

加载更多

eggjs与sequelize简单demo

参考 egg 官方文档 安装 // 依赖npm install --save egg-sequelize mysql2// ts 类型npm install --save @types/sequelize 插件,config/plugin.ts import { EggPlugin } from 'egg';......

Geeyu
33分钟前
1
0
看过上百部片子的这个人教你视频标签算法解析

本文由云+社区发表 随着内容时代的来临,多媒体信息,特别是视频信息的分析和理解需求,如图像分类、图像打标签、视频处理等等,变得越发迫切。目前图像分类已经发展了多年,在一定条件下已经...

腾讯云加社区
48分钟前
2
0
2. 红黑树

定义:红黑树(Red-Black Tree,简称R-B Tree),它一种特殊的二叉查找树(Binary Search Tree)。 要理解红黑树,先要了解什么是二叉查找树。在上一章中,我们学习了什么是二叉树,以及二叉树...

火拳-艾斯
49分钟前
3
0
input的button类型,点击页面跳转

一、input type=button 不做任何操作 例如: <input type="button" class="btn btn-primary" style="width: 30%" value="返回" onclick="window.location.href='/users/list'"></input> onc......

Sunki
55分钟前
1
0
踩坑:js 小数运算出现精度问题

背景 在学习小程序商城源码时发现了这个问题,单价可能出现小数,小数之间运算结果会莫名其妙多出一大串数字,比如下面这样👇。 在此之前我是知道 js 中著名的 0.1 + 0.2 != 0.3 的问题的,...

dkvirus
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部