`
beyondqinghua
  • 浏览: 42397 次
  • 性别: Icon_minigender_1
  • 来自: 南昌
社区版块
存档分类
最新评论

lucene初探(二):创建索引,查询索引

 
阅读更多

上一次  lucene初探(一):IKAnalyzer2012中文分词扩展初探 http://beyondqinghua.iteye.com/admin/blogs/1835986 已经尝试使用IK来分词,这次我们将学习如何将IK整合到lucene创建索引,并检索索引,例子分别使用lucene的英文分词工具、IK中文分词工具,代码依赖的包跟《IKAnalyzer2012中文分词扩展初探》一样。

1、创建一个模型对象

写道
package com.iris.scm.lucene.model;

public class Publication {

private Long id;
private String zhTitle;
private String enTitle;
private String zhAbstract;
private String enAbstract;
private Integer publishYear;

public Publication() {
super();
}
.....get set method
}

 

2、创建索引、查询索引

 

package com.iris.scm.lucene.test;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.en.EnglishAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.Field.Index;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.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.search.highlight.Formatter;
import org.apache.lucene.search.highlight.Fragmenter;
import org.apache.lucene.search.highlight.Highlighter;
import org.apache.lucene.search.highlight.InvalidTokenOffsetsException;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.Scorer;
import org.apache.lucene.search.highlight.SimpleFragmenter;
import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import org.wltea.analyzer.lucene.IKAnalyzer;

import com.iris.scm.lucene.model.Publication;

public class LuceneTest {

	// 分词器
	private Analyzer analyzerEn;
	private Analyzer analyzerZh;
	// 索引存放目录
	private Directory directoryZh;
	// 索引存放目录
	private Directory directoryEn;

	public static void main(String[] args) throws Exception {

		LuceneTest test = new LuceneTest();
		test.initDir();
		// test.createIndex();
		test.searchZhPub();
		test.searchEnPub();
	}

	/**
	 * 初始化Analyzer和Directory.
	 * 
	 * @throws IOException
	 */
	public void initDir() throws IOException {

		// 建立一个标准分词器
		// Version.LUCENE_36 表示匹配Lucene3.6版本,使用英文分词解析工具
		analyzerEn = new EnglishAnalyzer(Version.LUCENE_36);

		analyzerZh = new IKAnalyzer();
		// 使用智能分词
		((IKAnalyzer) analyzerZh).setUseSmart(true);

		// 在当前路径下建立一个目录叫indexDir
		File indexDirZh = new File("d:/lucene/LuceneTestZh");

		File indexDirEn = new File("d:/lucene/LuceneTestEn");

		// 创建索引目录
		directoryZh = FSDirectory.open(indexDirZh);
		directoryEn = FSDirectory.open(indexDirEn);
	}

	/**
	 * 建立索引文件
	 * 
	 * @throws IOException
	 */
	public void createIndex() throws IOException {

		// 获取文献信息
		// 中文
		Publication pubZh1 = new Publication();
		pubZh1.setId(123456L);
		pubZh1.setPublishYear(2010);
		pubZh1.setZhTitle("金刚石薄膜抗激光破坏研究");
		pubZh1.setZhAbstract("介绍了金刚石优异的光学和力学特性,对金刚石薄膜在从紫外到红外波段以及不同脉宽激光参数下的激光损伤行为和损伤阈值进行了评述。");
		// 英文
		Publication pubEn1 = new Publication();
		pubEn1.setId(123456L);
		pubEn1.setPublishYear(2010);
		pubEn1.setEnTitle("Laser induced damage for diamond films");
		pubEn1.setEnAbstract("The outstanding optical and mechanical properties of diamond films are summarized.  ");

		// 中文
		Publication pubZh2 = new Publication();
		pubZh2.setId(68545L);
		pubZh2.setPublishYear(2009);
		pubZh2.setZhTitle("激光破坏金刚石薄膜研究");
		pubZh2.setZhAbstract("分析了不同激光工作参数对金刚石薄膜的激光损伤机理,认为石墨化导致晶格失稳是金刚石薄膜激光损伤的主要原因。金刚石薄膜石墨化有两种方式:垂直表面向体层方向石墨化和平行表面按分层的方式逐层石墨化。");
		// 英文
		Publication pubEn2 = new Publication();
		pubEn2.setId(68545L);
		pubEn2.setPublishYear(2009);
		pubEn2.setEnTitle("Laser destruction of the diamond thin films");
		pubEn2.setEnAbstract(" Laser damage for films irradiated with different wave lengths and pulse width are reviewed and the laser damage mechanism analyzed for different parameters. It is found that graphitization induced instability of the crystal lattice is the main reason for laser induced damage. There are two ways that lead to graphitized damage on the surface of diamond films under long and short laser pulses. For nanosecond or longer laser pul...");

		// 建立Document
		Document docZh1 = new Document();
		// Store指定Field是否需要存储,Index指定Field是否需要分词索引
		docZh1.add(new Field("id", pubZh1.getId().toString(), Store.YES, Index.NOT_ANALYZED));
		docZh1.add(new Field("publish_year", pubZh1.getPublishYear().toString(), Store.YES, Index.NOT_ANALYZED));
		docZh1.add(new Field("zh_title", pubZh1.getZhTitle(), Store.YES, Index.ANALYZED));
		docZh1.add(new Field("zh_abstract", pubZh1.getZhAbstract(), Store.YES, Index.ANALYZED));
		// 建立Document
		Document docZh2 = new Document();
		docZh2.add(new Field("id", pubZh2.getId().toString(), Store.YES, Index.NOT_ANALYZED));
		docZh2.add(new Field("publish_year", pubZh2.getPublishYear().toString(), Store.YES, Index.NOT_ANALYZED));
		docZh2.add(new Field("zh_title", pubZh2.getZhTitle(), Store.YES, Index.ANALYZED));
		docZh2.add(new Field("zh_abstract", pubZh2.getZhAbstract(), Store.YES, Index.ANALYZED));

		Document docEn1 = new Document();
		docEn1.add(new Field("id", pubEn1.getId().toString(), Store.YES, Index.NOT_ANALYZED));
		docEn1.add(new Field("publish_year", pubEn1.getPublishYear().toString(), Store.YES, Index.NOT_ANALYZED));
		docEn1.add(new Field("en_title", pubEn1.getEnTitle(), Store.YES, Index.ANALYZED));
		docEn1.add(new Field("en_abstract", pubEn1.getEnAbstract(), Store.YES, Index.ANALYZED));

		Document docEn2 = new Document();
		docEn2.add(new Field("id", pubEn2.getId().toString(), Store.YES, Index.NOT_ANALYZED));
		docEn2.add(new Field("publish_year", pubEn2.getPublishYear().toString(), Store.YES, Index.NOT_ANALYZED));
		docEn2.add(new Field("en_title", pubEn2.getEnTitle(), Store.YES, Index.ANALYZED));
		docEn2.add(new Field("en_abstract", pubEn2.getEnAbstract(), Store.YES, Index.ANALYZED));

		// 建立一个IndexWriter配置,指定匹配的版本,以及分词器
		IndexWriterConfig indexWriterConfigZh = new IndexWriterConfig(Version.LUCENE_36, analyzerZh);
		IndexWriterConfig indexWriterConfigEn = new IndexWriterConfig(Version.LUCENE_36, analyzerEn);
		// 创建IndexWriter,它负责索引的创建和维护
		IndexWriter indexWriterZh = new IndexWriter(directoryZh, indexWriterConfigZh);
		IndexWriter indexWriterEn = new IndexWriter(directoryEn, indexWriterConfigEn);

		// 把Document加入到索引中
		indexWriterZh.addDocument(docZh1);
		indexWriterZh.addDocument(docZh2);
		indexWriterEn.addDocument(docEn1);
		indexWriterEn.addDocument(docEn2);

		// 提交改变到索引,然后关闭
		indexWriterZh.close();
		indexWriterEn.close();

	}

	/**
	 * 搜索文献中文内容.
	 * 
	 * @throws ParseException
	 * @throws CorruptIndexException
	 * @throws IOException
	 * @throws InvalidTokenOffsetsException
	 */
	public void searchZhPub() throws ParseException, CorruptIndexException, IOException, InvalidTokenOffsetsException {
		// 搜索的关键词
		String queryKeyWord = "金刚石薄膜";

		// 创建查询分析器,把查询关键词转化为查询对象Query(单个Field中搜索)
		// 在标题的索引中搜索
		// QueryParser queryParser = new QueryParser(Version.LUCENE_36, "zh_title", analyzerZh);

		String[] fields = { "zh_title", "zh_abstract" };
		// (在多个Filed中搜索)
		QueryParser queryParser = new MultiFieldQueryParser(Version.LUCENE_36, fields, analyzerZh);
		Query query = queryParser.parse(queryKeyWord);

		// 获取访问索引的接口,进行搜索
		IndexReader indexReader = IndexReader.open(directoryZh);
		IndexSearcher indexSearcher = new IndexSearcher(indexReader);

		// TopDocs 搜索返回的结果
		TopDocs topDocs = indexSearcher.search(query, 100);// 只返回前100条记录

		int totalCount = topDocs.totalHits; // 搜索结果总数量
		System.out.println("搜索到的结果总数量为:" + totalCount);

		ScoreDoc[] scoreDocs = topDocs.scoreDocs; // 搜索的结果列表

		// 创建高亮器,使搜索的关键词突出显示
		Formatter formatter = new SimpleHTMLFormatter("<font color='red'>", "</font>");
		Scorer fragmentScore = new QueryScorer(query);
		Highlighter highlighter = new Highlighter(formatter, fragmentScore);
		Fragmenter fragmenter = new SimpleFragmenter(100);
		highlighter.setTextFragmenter(fragmenter);

		List<Publication> pubs = new ArrayList<Publication>();
		// 把搜索结果取出放入到集合中
		for (ScoreDoc scoreDoc : scoreDocs) {
			int docID = scoreDoc.doc;// 当前结果的文档编号
			float score = scoreDoc.score;// 当前结果的相关度得分
			System.out.println("score is : " + score);

			Document document = indexSearcher.doc(docID);
			Publication pubZh = new Publication();
			pubZh.setId(Long.parseLong(document.get("id")));

			// 高亮显示title
			String zhTitle = document.get("zh_title");
			String highlighterTitle = highlighter.getBestFragment(analyzerZh, "zh_title", zhTitle);
			// 如果title中没有找到关键词
			if (highlighterTitle == null) {
				highlighterTitle = zhTitle;
			}
			pubZh.setZhTitle(highlighterTitle);

			// 高亮显示abstract
			String zhAbstract = document.get("zh_abstract");
			String highlighterAbstract = highlighter.getBestFragment(analyzerZh, "zh_abstract", zhAbstract);
			// 如果Abstract中没有找到关键词
			if (highlighterAbstract == null) {
				highlighterAbstract = zhAbstract;
			}
			pubZh.setZhAbstract(highlighterAbstract);

			pubZh.setPublishYear(Integer.parseInt(document.get("publish_year")));

			pubs.add(pubZh);
		}
		// 关闭
		indexReader.close();
		indexSearcher.close();
		for (Publication pub : pubs) {
			System.out.println("pub'id is : " + pub.getId());
			System.out.println("pub'publish year is : " + pub.getPublishYear());
			System.out.println("pub'title is : " + pub.getZhTitle());
			System.out.println("pub'abstract is : " + pub.getZhAbstract());
		}
	}

	/**
	 * 搜索文献英文内容.
	 * 
	 * @throws ParseException
	 * @throws CorruptIndexException
	 * @throws InvalidTokenOffsetsException
	 */
	public void searchEnPub() throws ParseException, CorruptIndexException, IOException, InvalidTokenOffsetsException {
		// 搜索的关键词
		String queryKeyWord = "diamond films";

		// 创建查询分析器,把查询关键词转化为查询对象Query(单个Field中搜索)
		// 在标题的索引中搜索
		// QueryParser queryParser = new QueryParser(Version.LUCENE_36, "en_title", analyzerEn);

		String[] fields = { "en_title", "en_abstract" };
		// (在多个Filed中搜索)
		QueryParser queryParser = new MultiFieldQueryParser(Version.LUCENE_36, fields, analyzerEn);
		Query query = queryParser.parse(queryKeyWord);

		// 获取访问索引的接口,进行搜索
		IndexReader indexReader = IndexReader.open(directoryEn);
		IndexSearcher indexSearcher = new IndexSearcher(indexReader);

		// TopDocs 搜索返回的结果
		TopDocs topDocs = indexSearcher.search(query, 100);// 只返回前100条记录

		int totalCount = topDocs.totalHits; // 搜索结果总数量
		System.out.println("搜索到的结果总数量为:" + totalCount);

		ScoreDoc[] scoreDocs = topDocs.scoreDocs; // 搜索的结果列表

		// 创建高亮器,使搜索的关键词突出显示
		Formatter formatter = new SimpleHTMLFormatter("<font color='red'>", "</font>");
		Scorer fragmentScore = new QueryScorer(query);
		Highlighter highlighter = new Highlighter(formatter, fragmentScore);
		Fragmenter fragmenter = new SimpleFragmenter(100);
		highlighter.setTextFragmenter(fragmenter);

		List<Publication> pubs = new ArrayList<Publication>();
		// 把搜索结果取出放入到集合中
		for (ScoreDoc scoreDoc : scoreDocs) {
			int docID = scoreDoc.doc;// 当前结果的文档编号
			float score = scoreDoc.score;// 当前结果的相关度得分
			System.out.println("score is : " + score);

			Document document = indexSearcher.doc(docID);
			Publication pubEn = new Publication();
			pubEn.setId(Long.parseLong(document.get("id")));

			// 高亮显示title
			String enTitle = document.get("en_title");
			String highlighterTitle = highlighter.getBestFragment(analyzerEn, "en_title", enTitle);
			// 如果title中没有找到关键词
			if (highlighterTitle == null) {
				highlighterTitle = enTitle;
			}
			pubEn.setEnTitle(highlighterTitle);

			// 高亮显示abstract
			String enAbstract = document.get("en_abstract");
			String highlighterAbstract = highlighter.getBestFragment(analyzerEn, "en_abstract", enAbstract);
			// 如果Abstract中没有找到关键词
			if (highlighterAbstract == null) {
				highlighterAbstract = enAbstract;
			}
			pubEn.setEnAbstract(highlighterAbstract);

			pubEn.setPublishYear(Integer.parseInt(document.get("publish_year")));

			pubs.add(pubEn);
		}
		// 关闭
		indexReader.close();
		indexSearcher.close();
		for (Publication pub : pubs) {
			System.out.println("pub'id is : " + pub.getId());
			System.out.println("pub'publish year is : " + pub.getPublishYear());
			System.out.println("pub'title is : " + pub.getEnTitle());
			System.out.println("pub'abstract is : " + pub.getEnAbstract());
		}
	}
}

 3、结果

写道
加载扩展词典:ext.dic
加载扩展停止词典:stopword.dic
加载扩展停止词典:stopword_chinese.dic
搜索到的结果总数量为:2
score is : 0.30121902
score is : 0.24961227
pub'id is : 68545
pub'publish year is : 2009
pub'title is : 激光破坏<font color='red'>金刚石薄膜</font>研究
pub'abstract is : 分析了不同激光工作参数对<font color='red'>金刚石薄膜</font>的激光损伤机理,认为石墨化导致晶格失稳是<font color='red'>金刚石薄膜</font>激光损伤的主要原因。<font color='red'>金刚石薄膜</font>石墨化有两种方式:垂直表面向体层方向石墨化和平行表面按分层的方式逐层石墨化。
pub'id is : 123456
pub'publish year is : 2010
pub'title is : <font color='red'>金刚石薄膜</font>抗激光破坏研究
pub'abstract is : 介绍了金刚石优异的光学和力学特性,对<font color='red'>金刚石薄膜</font>在从紫外到红外波段以及不同脉宽激光参数下的激光损伤行为和损伤阈值进行了评述。
搜索到的结果总数量为:2
score is : 0.48305953
score is : 0.34981734
pub'id is : 123456
pub'publish year is : 2010
pub'title is : Laser induced damage for <font color='red'>diamond</font> <font color='red'>films</font>
pub'abstract is : The outstanding optical and mechanical properties of <font color='red'>diamond</font> <font color='red'>films</font> are summarized.
pub'id is : 68545
pub'publish year is : 2009
pub'title is : Laser destruction of the <font color='red'>diamond</font> thin <font color='red'>films</font>
pub'abstract is : that lead to graphitized damage on the surface of <font color='red'>diamond</font> <font color='red'>films</font> under long and short laser pulses

 

分享到:
评论

相关推荐

    Lucene5学习之创建索引入门示例

    **Lucene5学习之创建索引入门示例** 在IT领域,搜索引擎的开发与优化是一项关键技术,而Apache Lucene作为一款高性能、全文本搜索库,是许多开发者进行文本检索的首选工具。本文将深入探讨如何使用Lucene5来创建一...

    Lucene3.0创建索引

    ### Lucene3.0创建索引 在Lucene3.0中创建索引是一个关键功能,可以帮助用户快速地检索和管理大量的文本数据。本篇文章将详细介绍如何使用Lucene3.0来创建索引,并通过一个具体的例子来演示整个过程。 #### 一、...

    lucene 对 xml建立索引

    - Lucene的核心能力在于文档索引和查询,它提供了强大的API来实现高效的文档检索。 2. **XML简介** - XML(Extensible Markup Language,可扩展标记语言)是一种用来标记数据的语言,它定义了用于描述结构化文档...

    Lucene建索引及查询关键字

    在Eclipse环境中运用java,Lucene建索引及查询关键字

    Lucene创建索引步骤

    Lucene创建索引步骤: 1、创建Directory(索引位置) 2、创建IndexWrite(写入索引) 3、创建Document对象 4、为Document添加Field(相当于添加属性:类似于表与字段的关系) 5、通过IndexWriter添加文档到索引中

    Lucene 索引的简单使用

    本篇文章将详细阐述如何使用Lucene来创建和查询索引,帮助你深入理解其核心概念和操作流程。 ### 1. Lucene基本概念 - **文档(Document)**:在Lucene中,一个文档代表你要索引的信息单元,它可以包含多个字段...

    lucene实现索引查询

    ### 二、查询索引 查询索引包括以下步骤: 1. **打开索引目录**:与创建索引类似,先打开索引所在的目录。 2. **创建分词器**:同样需要一个分词器来处理查询字符串。 3. **创建索引读取器**:`IndexReader`用于...

    Lucene 3.0 原理与代码分析PDF

    Lucene学习总结之二:Lucene的总体架构 Lucene学习总结之三:Lucene的索引文件格式(1) Lucene学习总结之三:Lucene的索引文件格式(2) Lucene学习总结之三:Lucene的索引文件格式(3) Lucene学习总结之四:...

    lucene 4.7.2 Demo

    创建索引是全文检索的基础,它涉及将文本数据结构化为Lucene可以理解和查询的形式。开发者可以通过Analyzer类来处理输入的文本,进行分词、去除停用词等预处理步骤。然后,使用Document类表示要索引的数据,Field类...

    Lucene.Heritrix:开发自己的搜索引擎(第2版)

    Lucene提供了丰富的API,涵盖了从文档分析、索引创建到查询解析和结果排序的全过程。书中会详细介绍Lucene的架构、核心类以及如何使用这些类来处理文本数据,建立索引,并进行高效搜索。 Heritrix则是一个网络爬虫...

    lucene全文检索简单索引和搜索实例

    二、Lucene索引创建流程 1. 初始化:首先,我们需要导入Lucene库,并创建一个标准的Analyzer,例如StandardAnalyzer,它对输入的文本进行标准化处理。 2. 创建索引目录:索引数据会存储在一个Directory对象中,...

    Lucene初探,一个初级的LuceneDemo

    5. **搜索**:为了查询索引,我们需要一个`DirectoryReader`和一个`IndexSearcher`。然后,创建一个`QueryParser`,解析用户的查询字符串。 ```java DirectoryReader reader = DirectoryReader.open(indexWriter); ...

    lucene索引优化多线程多目录创建索引

    本教程主要探讨的是如何利用Lucene进行索引优化,特别是通过多线程和处理多个目录来提高索引创建效率。 首先,我们需要理解Lucene的索引原理。Lucene将文档分解为词项(tokens),并对每个词项创建倒排索引。倒排...

    Lucene5学习之增量索引(Zoie)

    Index Provider负责创建和更新索引,而Index User则负责查询这些索引。当新的数据到来时,Index Provider会生成一个新的索引版本,并将这个版本推送给Index User,而旧的索引版本则被保留,以便在新版本不稳定时回滚...

    Lucene索引和查询

    - 多线程支持:在大型应用中,可能需要并发创建和查询索引,Lucene支持多线程操作。 - 性能优化:如使用内存映射文件(MMapDirectory)、优化写入策略等。 - 分布式搜索:通过Solr或Elasticsearch,可以实现分布式...

    Lucene对本地文件多目录创建索引

    标题中的“Lucene对本地文件多目录创建索引”指的是使用Apache Lucene库来构建一个搜索引擎,该搜索引擎能够索引本地计算机上的多个文件目录。Lucene是一个强大的全文搜索库,它允许开发者在Java应用程序中实现高级...

    luceneDemo(创建索引+关键字查询)

    创建索引 一、创建词法分析器 二、创建索引存储目录 三、创建索引写入器 四、将内容存储到索引 关键字查询 一、创建索引存储目录读取器 二、创建索引搜索器 三、解析查询 四、获取结果

    基于lucene技术的增量索引

    - **首次创建索引**:首先,我们需要遍历整个数据源,创建每个文档的实例,然后将这些文档添加到Lucene的索引writer中。完成这一步后,就会生成一个完整的初始索引。 - **监控数据变更**:为了实现增量索引,我们...

    Lucene.net高速创建索引

    标题“Lucene.net高速创建索引”所涉及的核心技术是Apache Lucene.NET,这是一个开源全文搜索引擎库,它是Lucene项目针对.NET框架的移植版本。Lucene.NET提供了高效、可扩展的文本搜索功能,使得开发者能够在他们的...

    lucene.net 2.9.2 实现索引生成,修改,查询,删除实例

    在这个实例中,我们将深入探讨如何使用Lucene.NET 2.9.2来实现索引的生成、修改、查询和删除。 **一、索引生成** 首先,我们需要创建一个索引,这是全文检索的基础。在Lucene.NET中,我们通常会定义一个文档类,...

Global site tag (gtag.js) - Google Analytics