lucene4.3简单创建和查询索引实例

标签: lucene4 建和 索引 | 发表时间:2013-11-30 00:25 | 作者:awj3584
出处:http://blog.csdn.net

1.创建索引实例代码

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

import javax.swing.filechooser.FileFilter;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field.Store;
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.index.IndexWriterConfig.OpenMode;
import org.apache.lucene.index.LogDocMergePolicy;
import org.apache.lucene.index.LogMergePolicy;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import org.wltea.analyzer.lucene.IKAnalyzer;


public class Indexer {

	private IndexWriter writer;

	private Analyzer analyzer;

	List<Document> documents = new ArrayList<Document>();

	public static void main(String[] args) {

		String dataDir = "E:/lucene/data";
		String indexDir = "E:/lucene/index";
		try {
			Indexer indexer = new Indexer(indexDir);
			indexer.index(dataDir, new TextFilesFilter());
			indexer.writer.commit();
			System.out.println(indexer.writer.numDocs());
			indexer.writer.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public Indexer(String indexDir) throws IOException{
		Directory dir = FSDirectory.open(new File(indexDir));
		analyzer = new IKAnalyzer();
		LogMergePolicy mergePolicy = new LogDocMergePolicy();
		// 索引基本配置
		// 设置segment添加文档(Document)时的合并频率
		// 值较小,建立索引的速度就较慢
		// 值较大,建立索引的速度就较快,>10适合批量建立索引
		mergePolicy.setMergeFactor(30);
		// 设置segment最大合并文档(Document)数
		// 值较小有利于追加索引的速度
		// 值较大,适合批量建立索引和更快的搜索
		mergePolicy.setMaxMergeDocs(5000);
		IndexWriterConfig indexWriterConfig = new IndexWriterConfig(Version.LUCENE_43, analyzer);
		//IndexWriterConfig indexWriterConfig=new IndexWriterConfig(Version.LUCENE_43,new StandardAnalyzer(Version.LUCENE_43));
		indexWriterConfig.setMaxBufferedDocs(10000);
		indexWriterConfig.setMergePolicy(mergePolicy);
		indexWriterConfig.setRAMBufferSizeMB(64);
		// /设置索引的打开模式 创建或者添加索引
		indexWriterConfig.setOpenMode(OpenMode.CREATE_OR_APPEND);
		writer = new IndexWriter(dir, indexWriterConfig);
	}

	//将File信息写入document
	private Document getDocument(File f) throws IOException{
		Document document = new Document();
		document.add(new StringField("name", f.getName(), Store.YES));
		document.add(new TextField("content", "我爱你中国", Store.YES));
		document.add(new StringField("fullpath", f.getCanonicalPath(),Store.YES));
		document.add(new StringField("updateTime", String.valueOf(f.lastModified()),Store.YES));
		return document;
	}

	
	private List<Document> getDocuments(File [] files, FileFilter filesFilter) throws IOException{

		for(File f : files){
			if(f.isDirectory()){
				getDocuments(f.listFiles(),filesFilter);
			}else{
				if(!f.isHidden() && f.canRead() && (filesFilter != null && filesFilter.accept(f))){
					documents.add(getDocument(f));
				}
			}
		}
		return documents;
	}

	//写入索引
	private void indexFile(File [] files, FileFilter filesFilter) throws IOException{
		List<Document> documents = getDocuments(files, filesFilter);
		writer.addDocuments(documents);
	}

	
	private void index(String dataDri, TextFilesFilter filesFilter){
		File [] files = new File(dataDri).listFiles();
		try {
			indexFile(files, new TextFilesFilter());
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * 过滤器,只索引txt格式文件
	 * @author ANWJ
	 *
	 */
	private static class TextFilesFilter extends FileFilter{

		@Override
		public boolean accept(File f) {
			// TODO Auto-generated method stub
			return f.getName().toLowerCase().endsWith(".txt");
		}

		@Override
		public String getDescription() {
			// TODO Auto-generated method stub
			return null;
		}

	}

}

2.检索索引实例代码

import java.io.File;
import java.io.IOException;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
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.SearcherFactory;
import org.apache.lucene.search.SearcherManager;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import org.wltea.analyzer.lucene.IKAnalyzer;


public class Searcher {
	
	public static void search(String indexDir, String key) throws IOException, ParseException{
		
		Directory directory = FSDirectory.open(new File(indexDir));
		
		SearcherManager sm = new SearcherManager(directory,new  SearcherFactory());
		
		IndexSearcher searcher = sm.acquire();
		Analyzer  analyzer = new IKAnalyzer();
		QueryParser parser = new QueryParser(Version.LUCENE_43, "content", analyzer);
		
		Query query = parser.parse(key);
		
		TopDocs hits = searcher.search(query, 10);
		for(ScoreDoc doc : hits.scoreDocs){
			Document document = searcher.doc(doc.doc);
			System.out.println(document.get("content"));
		}
		
	}
	
	public static void main(String[] args) {
		String indexDir = "E:/lucene/index";
		String key = "中国";
		try {
			search(indexDir, key);
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ParseException e) {
			e.printStackTrace();
		}
	}

}


作者:awj3584 发表于2013-11-29 16:25:24 原文链接
阅读:84 评论:2 查看评论

相关 [lucene4 建和 索引] 推荐:

lucene4.3简单创建和查询索引实例

- - CSDN博客互联网推荐文章
// 设置segment添加文档(Document)时的合并频率. // 值较小,建立索引的速度就较慢. // 值较大,建立索引的速度就较快,>10适合批量建立索引. // 设置segment最大合并文档(Document)数. // 值较小有利于追加索引的速度. // 值较大,适合批量建立索引和更快的搜索.

ElasticSearch 索引 VS MySQL 索引

- - crossoverJie's Blog
这段时间在维护产品的搜索功能,每次在管理台看到 elasticsearch 这么高效的查询效率我都很好奇他是如何做到的. 这甚至比在我本地使用 MySQL 通过主键的查询速度还快. 这类问题网上很多答案,大概意思呢如下:. Lucene 的全文检索引擎,它会对数据进行分词后保存索引,擅长管理大量的索引数据,相对于.

SQL Server--索引

- - CSDN博客推荐文章
         1,概念:  数据库索引是对数据表中一个或多个列的值进行排序的结构,就像一本书的目录一样,索引提供了在行中快速查询特定行的能力..             2.1优点:  1,大大加快搜索数据的速度,这是引入索引的主要原因..                             2,创建唯一性索引,保证数据库表中每一行数据的唯一性..

MongoDB 索引

- - 博客园_首页
索引是用来加快查询的,数据库索引与数据的索引类似,有了索引就不需要翻遍整本书,数据库可以直接在索引中查找,. 使得查询速度很快,在索引中找到条目后,就可以直接跳转到目标文档的位置.. 要掌握如何为查询配置最佳索引会有些难度.. MongoDB索引几乎和关系型数据库的索引一样.绝大数优化关系型数据库索引的技巧同样适用于MongoDB..

倒排索引

- - ITeye博客
倒排索引是文档检索系统中最常见的数据结构,被广泛的应用于搜索引擎. 它是一种根据内容查找文档的方式. 由于不是根据文档来找内容,而是根据进行了相反的操作,因此叫做倒排索引. 倒排索引的一个简单结构如下图所示:. 最常见的是使用词频作为权重,即单词在一个文档中出现的次数. 因此,当搜索条件为“MapReduce”“is”“simple”的时候,对应的集合为{(0.txt,1),(1.txt,1),(2.txt,2)}且{(0.txt,1),(1.txt,2)}且{(0.txt,1),(1.txt,1)}={0.txt,1.txt}.

索引原理

- - ITeye博客
索引是存储引擎用于快速找到记录的一种数据结构. 也就会说索引也是一种数据结构,也占用磁盘空间. 索引是对查询优化最有效的手段,可以将查询提升几个数量级,相当牛掰啊. 1)索引大大减少了服务器需要扫描的数据量. 2)索引可以帮助服务器避免排序和临时表. 3)索引可以将随机IO变为顺序IO. 数据库索引可以想象成一本书的目录,如果想在一本书中找到某个主题,那么先到书的目录中找到这个主题,然后根据目录提供的页码,找到要找的主题.

倒排索引

- - CSDN博客推荐文章
倒排索引(英语:Inverted index),也常被称为反向索引、置入档案或反向档案,是一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射. 它是文档检索系统中最常用的数据结构. 有两种不同的反向索引形式:. 一条记录的水平反向索引(或者反向档案索引)包含每个引用单词的文档的列表.

oracle 索引

- - 数据库 - ITeye博客
        自动:在使用primary和unique后系统会自动创建唯一索引.         手动:create   index   索引名  on 表名(字段1,....). 查询表上有哪些索引(网上找的,能用,表名和索引名要大写). 1、查找表的所有索引(包括索引名,类型,构成列):. select t.*,i.index_type from user_ind_columns t,user_indexes i where t.index_name = i.index_name and t.table_name = i.table_name and t.table_name = 要查询的表.

Oracle索引

- - Oracle - 数据库 - ITeye博客
在关系数据库中,索引是一种与表有关的数据库结构,它可以使对应于表的SQL语句执行得更快. 索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容. 对于数据库来说,索引是一个必选项,但对于现在的各种大型数据库来说,索引可以大大提高数据库的性能,以至于它变成了数据库不可缺少的一部分. singlecolumnorconcatenated  对一列或多列建所引.

MySQL B+树索引及索引优化

- - 数据库 - ITeye博客
    MySQL的索引实现由很多种实现,包括hash索引,B+索引,全文索引等,本文只讨论B+树索引. 1.评价一个索引好坏主要看IO的访问次数,B+树红黑树来说,树高很小(出度很大)即可以有效降低IO的访问次数. B+数的高度h=logd(n),d越大,h越小,查询效率越高. 相对B树,B+树d可以很大,因为非叶子节点不存储数据,只存储key,在一个存储页上可以存储更多的key值.