`
qzxfl008
  • 浏览: 78574 次
  • 性别: Icon_minigender_1
  • 来自: 浙江
社区版块
存档分类
最新评论

建立索引,搜索关键字

阅读更多
这里用单元测试
使用的版本是lucene3.1.0
import java.io.File;
import java.io.IOException;
import java.util.Date;


import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.Filter;
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;
import org.apache.lucene.util.Version;
import org.junit.Test;
import org.xfl.lucene.utils.LuceneUtils;

public class LuceneIndexSearch{
	
	//当前工程下的resoruce文件夹放要被索引的文件,lucenenIndex放索引文件
	String filePath = "resource";
	String indexDir = "luceneIndex";
	
	Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_31);
	/**
	 * 创建索引
	 * @throws IOException 
	 * @throws CorruptIndexException 
	 */
	
	@Test
	public void createIndex() throws CorruptIndexException, IOException
	{
		
		Date startTime = new Date();
		
		Directory dir = FSDirectory.open(new File(indexDir));
		IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_31, analyzer);
		IndexWriter indexWriter = new IndexWriter(dir,iwc);
		//添加文件到索引
		LuceneUtils.file2Document(indexWriter, filePath);
		Date endTime = new Date();
		System.out.println("共有"+indexWriter.numDocs()+"个索引");
		System.out.println("总共花了"+(endTime.getTime()-startTime.getTime())+"毫秒时间");
		//关闭索引
		indexWriter.close();
	}
	
	/**
	 * 搜索
	 * @throws IOException 
	 * @throws Exception 
	 */
	@Test
	public void search() throws IOException, Exception
	{
		//要搜索的内容
		String queryString = "distribution";
		Directory dir = FSDirectory.open(new File(indexDir));
		
		//1、把要搜索的文本解析为Query对象
		String[] fields = {"filename","content"};
		QueryParser queryParser = new MultiFieldQueryParser(Version.LUCENE_31, fields, analyzer); //解析对象
		Query query = queryParser.parse(queryString);
		//2、进行查询
		
		IndexSearcher indexSearcher  = new IndexSearcher(dir);
		Filter filter = null;
		//搜索结果 TopDocs里面有scoreDocs[]数组,里面保存着索引值  
		TopDocs hits = indexSearcher.search(query,filter, 10000);
		
		System.out.println("找到了"+hits.totalHits+"条记录");
		//3、打印结果
		
		for(ScoreDoc scoreDocs: hits.scoreDocs )
		{
			int docSn = scoreDocs.doc;
			Document docs = indexSearcher.doc(docSn);   //根据文档编号取出相应的文档
			//打印文档信息
			LuceneUtils.printDocunentInfo(docs);
		}
	}
}


********************************************
Lucenen工具类
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

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.IndexWriter;

public class LuceneUtils {

	//存放文件名 name,内容concent,路径path
	public static void file2Document(IndexWriter writer,String fileDir) throws CorruptIndexException, IOException
	{
		File[] files = new File(fileDir).listFiles();
		
		for (int i = 0; i < files.length; i++) {
			Document doc = new Document();
			doc.add(new Field("filename",files[i].getName(),Field.Store.YES,Field.Index.ANALYZED));
			doc.add(new Field("content",readFileContent(files[i]),Field.Store.YES,Field.Index.ANALYZED));
			doc.add(new Field("size",String.valueOf(files[i].length()),Field.Store.YES,Field.Index.NOT_ANALYZED));
			doc.add(new Field("path",files[i].getAbsolutePath(),Store.YES,Index.NO));
			writer.addDocument(doc);
		}
	}
	
	//读取文件内容
	private static String readFileContent(File file) {
		InputStreamReader isr;
		StringBuffer content = null;
		try {
			isr = new InputStreamReader(new FileInputStream(file));
			BufferedReader reader = new BufferedReader(isr);
			content = new StringBuffer();
			for (String line = null; (line=reader.readLine())!=null; ) {
				content.append(line).append("\n");
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}  
		
		return content.toString();
	}

	public static void document2File(Document doc)
	{
		
	}
	/**
	 * <pre>
	 * 获取filename的方法有两种
	 * 1、Field field = doc.getField("filename"); 
	 * Field field = doc.getField("filename"); 
	 * 
	 * 2、doc.get(&quot;filename&quot;); 
	 * </pre>
	 * @param doc
	 */
	public static void printDocunentInfo(Document doc)
	{
		//Field field = doc.getField("filename");  第一种方法
		//field.stringValue();	
		System.out.println("filename   "+doc.get("filename"));   
		System.out.println("content    "+doc.get("content"));   
		System.out.println("size       "+doc.get("size"));   
		System.out.println("path       "+doc.get("path"));   
	}
}
分享到:
评论

相关推荐

    Lucene建立索引及查询包含“java”关键字 示例代码

    **Lucene创建索引与搜索"java"关键字的示例代码** Apache Lucene是一个高性能、全功能的文本搜索引擎库,广泛应用于各种系统中用于实现高效、精准的全文检索功能。这个示例代码将向我们展示如何使用Lucene来创建一...

    基于颜色 关键字索引的图片搜索引擎

    摘要:因特网上的信息浩瀚万千,而且毫无秩序,所有的信息像汪洋上的一个个...该系统实现了如下功能:基于关键字搜索图片和基于图片的颜色来搜索图片。该系统已投入实际使用并运转正常。 关键词:搜索;关键字;颜色

    如何用hash关键字提高数据库性能

    如果不使用`hash关键字`,直接对这两列建立索引会导致巨大的磁盘开销,并且查询性能也会受到严重影响。通过使用`hash关键字`,每个记录的`hash`值仅占用4字节的空间,相比于原始字符串的50+50字节,极大地减少了磁盘...

    索引搜索工具

    建立索引,搜索关键字,功能强大,用于清理电脑内容,快速找到关键文档

    一键搜索-根据关键字批量查找文本

    1. **预处理**:首先,对文本进行预处理,包括去除噪声字符、分词、建立索引等,目的是提高后续搜索的效率和准确性。 2. **索引构建**:利用哈希表、倒排索引或B树等数据结构,将关键字与对应文本的位置信息关联...

    易语言超级列表框表项关键字搜索

    可以考虑采用预处理的方式,如建立索引,或者在数据加载时就进行预过滤,减少搜索时的计算量。 6. **用户反馈**:为了提供更好的用户体验,可以添加进度条显示搜索进度,或者禁用搜索按钮以防止用户在搜索过程中...

    指定数据库关键字过滤

    例如,针对要过滤的字段建立全文索引或B树索引,使得搜索过程可以直接定位到相关的数据行,而不是全表扫描。 2. **并行处理**:利用多核CPU的并行计算能力,将数据分割成多个部分并同时进行关键字匹配,能大幅提高...

    基于区块链的多关键字细粒度可搜索加密方案.pdf

    基于区块链的多关键字细粒度可搜索加密方案,是一种创新的加密技术方案,主要针对现有方案中一些存在的问题提出改进。当前的密文策略下基于属性的关键字搜索(CP-ABKS)技术,虽然能实现加密数据的细粒度控制和检索...

    android+lucene实现全文检索并高亮关键字索引库

    在Android平台上实现全文检索并高亮关键字,常常需要用到开源全文搜索引擎Lucene。Lucene是一个高性能、全文本搜索库,提供了一个简单但强大的应用编程接口(API)用于索引和搜索文本。下面我们将深入探讨如何在...

    基于单页面的PPT文档分享+管理系统源码+全部资料齐全 用户上传完整PPT文档,进行解析,提取页面文字(建立索引),用户搜索关

    基于单页面的PPT文档分享+管理系统源码+全部资料齐全 用户上传完整PPT文档,进行解析,提取页面文字(建立索引),用户搜索关键字后选择具体的页面,后台合并下载生成pdf文档.zip 【备注】 1、该项目是个人高分项目...

    关键字检索问题

    1. **词汇表(Vocabulary)**:存储所有唯一关键字的列表,用于建立索引。 2. **倒排列表(Posting List)**:为每个词汇表中的关键字维护一个列表,包含所有包含该关键字的文档ID。 3. **查询解析器(Query Parser...

    成功建站-关键字排名查询

    2. **搜索引擎收录**:搜索引擎会抓取网站内容并建立索引,收录数量直接影响网站的可见性。通过Google Search Console等工具可以查看网站的收录情况。 五、网站推广策略 1. **内容优化**:创建高质量、独特且与...

    汉字转拼音,关键字搜索心得

    在实际应用中,可以采用倒排索引技术,将关键词的拼音形式和原文一起建立索引,从而快速定位到包含目标信息的文档。 此外,为了支持多音字搜索,可以创建一个多音字字典,存储每个汉字的所有可能读音,并在搜索时对...

    多叉树解析关键字,滑动引擎

    例如,在搜索引擎中,建立一个倒排索引,关键词作为树的叶子节点,通过词根和词缀构建多叉树的分支,这样在搜索时可以从根节点开始,沿着关键词的字母顺序快速定位到目标关键词,极大地提高了查找效率。在富文本解析...

    SEO关键字作弊.rar

    "使用说明.txt"可能提供了如何实施这些策略的具体步骤,尽管这些方法可能并不推荐,因为它们违背了搜索引擎的规则,可能导致网站被降权甚至被移除索引。 "访问阿里西西.url"可能是一个链接,指向一个关于SEO的资源...

    帝国CMS实现搜索关键字带点击数效果的方法

    在内容搜索方面,能够实现搜索关键字带有点击数效果,不仅可以优化用户搜索体验,还能够让内容更具有热度的显示,让用户更容易地找到受欢迎的内容。接下来,我将详细介绍如何使用帝国CMS实现搜索关键字带点击数效果...

    ASP获取标题关键字,带实际例子,带数据库

    在ASP中获取标题关键字,主要是为了实现网站SEO(搜索引擎优化),帮助搜索引擎更好地理解和索引网页内容。下面将详细介绍如何在ASP中操作这个过程,并结合实际例子和数据库的使用进行讲解。 一、HTML头部和标题...

    ICDE 09 rdf的关键字搜索, 关键论文一篇

    传统的关键字查询技术通常建立在专用索引技术和搜索算法基础上,这些技术旨在寻找连接匹配关键字的数据元素的子结构。本文提出了一种新的关键字搜索范式,特别是针对RDF数据模型。 #### 关键贡献 1. **新范式的...

    数据结构程序演示

    每个数据结构都有其特定的操作,例如链表的插入和删除、数组的索引访问、栈的压入和弹出、队列的入队和出队,以及树的搜索、插入和删除等。 链表是一种动态数据结构,节点在内存中可以不连续,通过指针连接。数组则...

Global site tag (gtag.js) - Google Analytics