Lucene建立索引然后搜索的小Demo

package junitTest;

import java.io.IOException;
import java.io.StringReader;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.queryparser.classic.MultiFieldQueryParser;
import org.apache.lucene.queryparser.classic.ParseException;
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.Highlighter;
import org.apache.lucene.search.highlight.InvalidTokenOffsetsException;
import org.apache.lucene.search.highlight.QueryScorer;
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.RAMDirectory;
import org.apache.lucene.util.Version;

public class LuenceDemo {

	public static void main(String[] args) throws IOException, ParseException, InvalidTokenOffsetsException {
		Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_4_9);

		// Store theindex in memory:
		// 索引存到内存中的目录
		Directory directory = new RAMDirectory();
		// To store anindex on disk, use this instead:
		// Directorydirectory = FSDirectory.open("/tmp/testindex");
		// 配置索引
		IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_4_9,
				analyzer);
		IndexWriter iwriter = new IndexWriter(directory, config);
		// 这里,将5篇文档filedname信息和content信息存入索引
		Document doc[] = new Document[6];
		for (int i = 0; i < 6; i++) {
			doc[i] = new Document();
		}
		String[] text = { "中华人民共和国中央人民政府", "中国是个伟大的国家", "我出生在美丽的中国,我爱中国,中国",
				"中华美丽的中国爱你", "美国跟中国式的国家", "卧槽,你是中国的" };

		doc[0].add(new Field("fieldname", text[0], TextField.TYPE_STORED));
		//doc[0].add(new Field("content", text[5], TextField.TYPE_STORED));
		doc[1].add(new Field("fieldname", text[1], TextField.TYPE_STORED));
		doc[2].add(new Field("fieldname", text[2], TextField.TYPE_STORED));
		doc[3].add(new Field("fieldname", text[3], TextField.TYPE_STORED));
		doc[4].add(new Field("fieldname", text[4], TextField.TYPE_STORED));
		doc[5].add(new Field("fieldname", text[5], TextField.TYPE_STORED));
		iwriter.addDocument(doc[0]);
		iwriter.addDocument(doc[1]);
		iwriter.addDocument(doc[2]);
		iwriter.addDocument(doc[3]);
		iwriter.addDocument(doc[4]);
		iwriter.addDocument(doc[5]);
		iwriter.close();

		// Now searchthe index:
		// 索引构建完毕,准备搜索。
		// 设定搜索目录
		DirectoryReader ireader = DirectoryReader.open(directory);
		IndexSearcher isearcher = new IndexSearcher(ireader);
		// Parse asimple query that searches for "text":
		// QueryParserparser = new QueryParser(Version.LUCENE_CURRENT,
		// "fieldname",analyzer);
		// 使用同样的方式对多field进行搜索
		String[] multiFields = { "fieldname", "content" };
		MultiFieldQueryParser parser = new MultiFieldQueryParser(
				Version.LUCENE_4_9, multiFields, analyzer);
		// 设定具体的搜索词
		Query query = parser.parse("卧槽,中国");
		TopDocs docs =isearcher.search(query,null, 10);//查找
		ScoreDoc[] hits = docs.scoreDocs;

		SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter("<span style=‘color:green‘>", "</span>");
		Highlighter highlighter = new Highlighter(simpleHTMLFormatter, new QueryScorer(query));
		 //高亮htmlFormatter对象  
        //设置高亮附近的字数  
        highlighter.setTextFragmenter(new SimpleFragmenter(100));  

		// assertEquals(1, hits.length);
		System.out.println("Searched " + hits.length + " documents.");
		// Iteratethrough the results:
		for (int i = 0; i < hits.length; i++) {
			Document hitDoc = isearcher.doc(hits[i].doc);
			String[] scoreExplain = null;
			// scoreExplain可以显示文档的得分详情,这里用split截取总分
			scoreExplain = isearcher.explain(query, hits[i].doc).toString()
					.split(" ", 2);
			String scores = scoreExplain[0];
			// assertEquals("Thisis the text to be indexed.",
			// hitDoc.get("fieldname"));
			System.out.println("score:"+scores);
			String value =hitDoc.get("fieldname"); ;
			TokenStream tokenStream = analyzer.tokenStream(value, new StringReader(value));    
            String str1 = highlighter.getBestFragment(tokenStream, value);   

			System.out.println(str1);
		}
		ireader.close();
		directory.close();
	}
}

项目中需要引入lucene4.9版本的jar包

Lucene建立索引然后搜索的小Demo

时间: 2024-11-04 09:22:54

Lucene建立索引然后搜索的小Demo的相关文章

用Lucene.net对数据库建立索引及搜索&lt;转&gt;

用Lucene.net对数据库建立索引及搜索 最近我一直在研究 Lucene.net ,发现Lucene.net对数据库方面建索引的文章在网上很少见,其实它是可以对数据库进行索引的,我闲着没事,写了个测试程序,竟然成功了, 可以实现对数据另类查询的一种方式(通过建索引查询),发表出来,和大家共享.   其实 Lucene.net 对数据库建索引很简单,只要把数据表里面的记录读出来,然后对每个字段索引就行了.本文中数据库的内容是某个博客表-userblog表.  1.表结构:字段名称       

lucene 建立索引与查询

Lucene 简介 Lucene 是一个基于 Java 的全文信息检索工具包,它不是一个完整的搜索应用程序,而是为你的应用程序提供索引和搜索功能.Lucene 目前是 Apache Jakarta 家族中的一个开源项目.也是目前最为流行的基于 Java 开源全文检索工具包. 目前已经有很多应用程序的搜索功能是基于 Lucene 的,比如 Eclipse 的帮助系统的搜索功能.Lucene 能够为文本类型的数据建立索引,所以你只要能把你要索引的数据格式转化的文本的,Lucene 就能对你的文档进行

【转】Lucene不同版本中Field的Keyword、UnIndex,导致lucene 建立索引总是报错 急!!

lucene 建立索引 总是报错 急!! http://zhidao.baidu.com/link?url=iaVs9JH4DfN6iwaWImt7VMJENWCWGGaWFGPjqhUw_jz7FsbdrUiAJwptgCNDR8OhWlJ8iUArECkLnpBQGGzTxq 这段话总是报错,编译不过去.红线画在keyword,text下面.while(rs.next()){ Document doc=new Document(); doc.add(Field.Keyword("BH&quo

Lucene4.9学习笔记——Lucene建立索引

基本上创建索引需要三个步骤: 1.创建索引库IndexWriter对象 2.根据文件创建文档Document 3.向索引库中写入文档内容 这其中主要涉及到了IndexWriter(索引的核心组件,用于创建或追加索引).Document(代表一些域Field的集合).Field(具体的域,如文档创建时间.作者.内容等).Analyzer(分词器).Directory(用于描述索引存放位置)这些主要的类. 我们参照上一节的代码来看建立索引. 1.创建IndexWriter // 索引文件的保存位置

lucene 建立索引的过程

时间 2014-06-30 17:56:52 ? CSDN博客 原文 http://blog.csdn.net/caohaicheng/article/details/35992149 看lucene主页(http://lucene.apache.org/)上目前lucene已经到4.9.0版本了, 参考学习的书是按照2.1版本讲解的,写的代码例子是用的3.0.2版本的,版本 的不同导致有些方 法的 使用差异,但是大体还是相同的. 源代码用到的jar包(3.0.2版本)下载地址 参考资料: 1.

Lucene建立索引库

问题?Lucene如何建立索引库,lucene所需要的jar包是那些  , lucene如何使用索引库,lucene的核心原理 一.Lucene是什么? 全文检索只是一个概念,而具体实现有很多框架,lucene是其中的一种方式.本文将以lucene3.0进行开发 官兵与Luncne的jar包可以去官网下载:点击打开链接,不过好像Lucene已经更新到6.1了. 二.建立索引库 1.互联网搜索全文搜索引擎结构图: 2.Lucene的结构图: 说明: (1)在数据库中,数据库中的数据文件存储在磁盘上

lucene建立索引的过程

建立索引过程 用户提交数据=>solr建立索引=>调用lucene包建立索引 官方建立索引和查询索引的例子如下: http://lucene.apache.org/core/4_10_3/demo/overview-summary.html#About_the_code http://lucene.apache.org/core/4_10_3/core/overview-summary.html#overview_description 其他参考文章如下: http://dataknocker

ssm学习——Lucene建立索引

一:理论知识 1.非结构化数据查询方法 1)顺序扫描法 太慢,效率不高. 2)全文检索法 对需要查询的文档创建索引,再对其进行搜索.其实说白了就是为了使其结构化. 2.索引创建和搜索流程图 1)流程图 2)索引库 索引库是由两部分组成的,一部分是索引,另一部分是文档对象(不是原始文档). 3.流程图详解 1)创建文档对象 有以下规则 a.不同的文档可以有不同的Field b.同一个文档可以有相同的Field c.每一个文档有一个唯一的编号id 2)分析文档 分析的过程是经过对原始文档提取单词,将

lucene 建立索引的不同方式

1.创建一个简单的索引: package lia.meetlucene; import java.io.File; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.store.Directory; import org.apache.luc