这里用单元测试
使用的版本是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("filename");
* </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"关键字的示例代码** Apache Lucene是一个高性能、全功能的文本搜索引擎库,广泛应用于各种系统中用于实现高效、精准的全文检索功能。这个示例代码将向我们展示如何使用Lucene来创建一...
摘要:因特网上的信息浩瀚万千,而且毫无秩序,所有的信息像汪洋上的一个个...该系统实现了如下功能:基于关键字搜索图片和基于图片的颜色来搜索图片。该系统已投入实际使用并运转正常。 关键词:搜索;关键字;颜色
如果不使用`hash关键字`,直接对这两列建立索引会导致巨大的磁盘开销,并且查询性能也会受到严重影响。通过使用`hash关键字`,每个记录的`hash`值仅占用4字节的空间,相比于原始字符串的50+50字节,极大地减少了磁盘...
建立索引,搜索关键字,功能强大,用于清理电脑内容,快速找到关键文档
1. **预处理**:首先,对文本进行预处理,包括去除噪声字符、分词、建立索引等,目的是提高后续搜索的效率和准确性。 2. **索引构建**:利用哈希表、倒排索引或B树等数据结构,将关键字与对应文本的位置信息关联...
可以考虑采用预处理的方式,如建立索引,或者在数据加载时就进行预过滤,减少搜索时的计算量。 6. **用户反馈**:为了提供更好的用户体验,可以添加进度条显示搜索进度,或者禁用搜索按钮以防止用户在搜索过程中...
例如,针对要过滤的字段建立全文索引或B树索引,使得搜索过程可以直接定位到相关的数据行,而不是全表扫描。 2. **并行处理**:利用多核CPU的并行计算能力,将数据分割成多个部分并同时进行关键字匹配,能大幅提高...
基于区块链的多关键字细粒度可搜索加密方案,是一种创新的加密技术方案,主要针对现有方案中一些存在的问题提出改进。当前的密文策略下基于属性的关键字搜索(CP-ABKS)技术,虽然能实现加密数据的细粒度控制和检索...
在Android平台上实现全文检索并高亮关键字,常常需要用到开源全文搜索引擎Lucene。Lucene是一个高性能、全文本搜索库,提供了一个简单但强大的应用编程接口(API)用于索引和搜索文本。下面我们将深入探讨如何在...
基于单页面的PPT文档分享+管理系统源码+全部资料齐全 用户上传完整PPT文档,进行解析,提取页面文字(建立索引),用户搜索关键字后选择具体的页面,后台合并下载生成pdf文档.zip 【备注】 1、该项目是个人高分项目...
1. **词汇表(Vocabulary)**:存储所有唯一关键字的列表,用于建立索引。 2. **倒排列表(Posting List)**:为每个词汇表中的关键字维护一个列表,包含所有包含该关键字的文档ID。 3. **查询解析器(Query Parser...
2. **搜索引擎收录**:搜索引擎会抓取网站内容并建立索引,收录数量直接影响网站的可见性。通过Google Search Console等工具可以查看网站的收录情况。 五、网站推广策略 1. **内容优化**:创建高质量、独特且与...
在实际应用中,可以采用倒排索引技术,将关键词的拼音形式和原文一起建立索引,从而快速定位到包含目标信息的文档。 此外,为了支持多音字搜索,可以创建一个多音字字典,存储每个汉字的所有可能读音,并在搜索时对...
例如,在搜索引擎中,建立一个倒排索引,关键词作为树的叶子节点,通过词根和词缀构建多叉树的分支,这样在搜索时可以从根节点开始,沿着关键词的字母顺序快速定位到目标关键词,极大地提高了查找效率。在富文本解析...
"使用说明.txt"可能提供了如何实施这些策略的具体步骤,尽管这些方法可能并不推荐,因为它们违背了搜索引擎的规则,可能导致网站被降权甚至被移除索引。 "访问阿里西西.url"可能是一个链接,指向一个关于SEO的资源...
在内容搜索方面,能够实现搜索关键字带有点击数效果,不仅可以优化用户搜索体验,还能够让内容更具有热度的显示,让用户更容易地找到受欢迎的内容。接下来,我将详细介绍如何使用帝国CMS实现搜索关键字带点击数效果...
在ASP中获取标题关键字,主要是为了实现网站SEO(搜索引擎优化),帮助搜索引擎更好地理解和索引网页内容。下面将详细介绍如何在ASP中操作这个过程,并结合实际例子和数据库的使用进行讲解。 一、HTML头部和标题...
传统的关键字查询技术通常建立在专用索引技术和搜索算法基础上,这些技术旨在寻找连接匹配关键字的数据元素的子结构。本文提出了一种新的关键字搜索范式,特别是针对RDF数据模型。 #### 关键贡献 1. **新范式的...
每个数据结构都有其特定的操作,例如链表的插入和删除、数组的索引访问、栈的压入和弹出、队列的入队和出队,以及树的搜索、插入和删除等。 链表是一种动态数据结构,节点在内存中可以不连续,通过指针连接。数组则...