初学者 还在进步 勿批!
链接地址: http://2814704901.iteye.com/admin/blogs/1930415
建索:
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
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.lucene.store.FSDirectory;
import com.jpsycn.kfwggl.common.tools.GetRootPath;
import com.jpsycn.kfwggl.common.tools.HandlerSummary;
import com.jpsycn.kfwggl.system.entity.ResultGetInfo;
public class CreateIndex {
//抓取到的页面存放的路径
//String filesPath="F:/kfwlyqTxtList";
//分词
private Analyzer analyzer = new StandardAnalyzer();
public void createIndex(List<ResultGetInfo> lt){
Date d=new Date();
String root=GetRootPath.getIndexesPath();
if(!new File(root).exists()){
new File(root).mkdir();
}
//创建的索引存放路径
String INDEXPATH=root+new SimpleDateFormat("yyyyMMddHHMMSS").format(d)+d.getTime();
System.out.println(INDEXPATH);
if(!new File(INDEXPATH).exists()){
new File(INDEXPATH).mkdir();
}
//获取存放索引的文件夹
try {
SimpleDateFormat ft=new SimpleDateFormat("yyyy-MM-dd");
Directory directory = FSDirectory.getDirectory(INDEXPATH);
IndexWriter indexWriter = new IndexWriter(directory, analyzer ,true, IndexWriter.MaxFieldLength.LIMITED);
long begin = new Date().getTime();
for(ResultGetInfo rg:lt){
//获取一个List<esultGetInfo>遍历里面的值 建索
//其中 红色titleResult 就是 索引 如字典中的索引 蓝色就是你要建索的字符串
//Field.Store.YES 表示是否存储 以后可以检索
//Field.Index.ANALYZED 表示是否分词
Document doc = new Document();
String titleResult=rg.getTitle()==null?"":rg.getTitleResult().trim();
String content =rg.getContent()==null?"":rg.getContent();
String link=rg.getLink()==null?"":rg.getLink().trim();
String releaseDate=rg.getReleaseDate()==null?"":ft.format(rg.getReleaseDate());
doc.add(new Field("titleResult", titleResult, Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.YES));
doc.add(new Field("content", content, Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.YES));
doc.add(new Field("link", link, Field.Store.YES,Field.Index.ANALYZED,Field.TermVector.YES));
doc.add(new Field("releaseDate", releaseDate, Field.Store.YES,Field.Index.ANALYZED,Field.TermVector.YES));
indexWriter.addDocument(doc);
}
long end = new Date().getTime();
System.out.println(">>> 1.存入索引完毕.. 共花费:" + (end - begin) +"毫秒...");
indexWriter.optimize();
indexWriter.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
检索:
import java.io.File;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
public class GetResultInfo {
public static List<String> getResultInfos(String keyName,String INDEXPATH,String titleOrContent){
List<String> list=new ArrayList<String>();
Analyzer analyzer = new StandardAnalyzer();
//String titleResult="titleResult";
String link="link";
//String content=titleOrContent;
//String releaseDate="releaseDate";
//索引存放位置
try {
IndexSearcher indexSearcher = new IndexSearcher(INDEXPATH);
//System.out.println(">>> 2.开始读取索引... ... 通过关键字:【 "+ keyName +" 】");
BooleanClause.Occur[] clauses = { BooleanClause.Occur.SHOULD };
Query queryOBJ = MultiFieldQueryParser.parse(keyName, new String[]{titleOrContent}, clauses, analyzer);//parser.parse(query);
//Filter filter = null;
//################# 搜索相似度最高的记录 ###################
//TopDocs topDocs = indexSearcher.search(queryOBJ, filter, 1000);
TopDocs topDocs = indexSearcher.search(queryOBJ , 10000);
//System.out.println("*** 共匹配:" + topDocs.totalHits + "个 ***");
//ResultGetInfo rg = null;
//输出结果
for (ScoreDoc scoreDoc : topDocs.scoreDocs){
/*
* 这里我就返回一个List<String>集合 里面存放路径 url
* 这里的link是需要和建索的时候的 link对应的 而且相同
*/
Document targetDoc = indexSearcher.doc(scoreDoc.doc);
list.add(targetDoc.get(link).trim());
/*rg = new ResultGetInfo();
//注释掉的是关于高亮显示的部分 获取到的是含有html标签的字符串 需要你转换
//设置高亮显示格式
SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter("<font color='red'><strong>", "</strong></font>");
/* 语法高亮显示设置 */
/*Highlighter highlighter = new Highlighter(simpleHTMLFormatter,new QueryScorer(queryOBJ));
highlighter.setTextFragmenter(new SimpleFragmenter(100));
// 设置高亮 设置 title,content 字段
/*String title = targetDoc.get("titleResult");
String contents = targetDoc.get("content");
TokenStream titleTokenStream = analyzer.tokenStream(titleResult,new StringReader(title));
TokenStream contentTokenStream = analyzer.tokenStream(content,new StringReader(contents));
String highLightTitle = highlighter.getBestFragment(titleTokenStream, title);
String highLightContent = highlighter.getBestFragment(contentTokenStream, contents);
if(highLightTitle == null){
highLightTitle = title;
}
if(highLightContent == null) {
highLightContent = content;
}
rg.setLink(targetDoc.get(link));
rg.setTitleResult(highLightTitle);
rg.setContent(highLightContent);
rg.setReleaseDate(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").parse(targetDoc.get(releaseDate)+" 00:00:00"));
list.add(rg);*/
}
indexSearcher.close();
return list;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
//
public static List<String> getDirPath(String path){
List<String> dirPaths=new ArrayList<String>();
File f=new File(path);
File files[]=f.listFiles();
if(files.length==0){
System.out.println("没有存放索引的文件夹");
}else{
for(int i=0;i<files.length;i++){
//检索每个存放索引的文件夹
dirPaths.add(files[i].getAbsolutePath());
}
}
return dirPaths;
}
public static Map<String,String> getInfos(String path,String str[],String titleOrContent){
long begin = new Date().getTime();
Map<String,String> map=new HashMap<String,String>();
//获取存放索引的所有文件夹
List<String> dirPaths=GetResultInfo.getDirPath(path);
for(int k=0;k<str.length;k++){
for(int i=0;i<dirPaths.size();i++){
List<String> infoList=GetResultInfo.getResultInfos(str[k],dirPaths.get(i),titleOrContent);
for(int j=0;j<infoList.size();j++){
map.put(infoList.get(j),infoList.get(j));
}
}
}
long end = new Date().getTime();
System.out.println(">>> 搜索完毕... ... 共花费:" + (end - begin) +"毫秒...");
System.out.println("一共检索到"+map.size()+"条");
return map;
}
}
这个例子是我对 解析到的网页的 路径、标题、内容、发布日期、来源 进行建索
然后通过对内容的检索 获取该网页的路径
相关推荐
在搜索高亮方面,Luence.net提供了一种有效的方法,可以将用户的查询关键字在搜索结果中突出显示,增强用户体验。这通常通过分析搜索结果文档,找出匹配的关键词,并用特定的样式(如加粗、颜色变化等)进行标记来...
本文将深入探讨基于.NET平台的Luence.Net搜索Demo,帮助读者理解如何利用Luence进行高效的数据检索。 首先,我们要明白Luence是什么。Luence是Apache Lucene的.NET版本,它提供了丰富的API和工具,用于构建强大的...
《深入理解Lucene搜索引擎》 ...通过理解和熟练运用这些核心概念,开发者可以构建出满足各种需求的全文检索系统。在具体实践中,根据业务场景选择适当的配置和扩展,可以进一步提升搜索系统的效能。
《Luence和ElasticSearch面试准备》 Lucene和ElasticSearch是两个在全文搜索引擎领域中广泛使用的开源工具。Lucene是一个高性能、全文本搜索库,而Elasticsearch则是在Lucene的基础上构建的一个分布式、RESTful风格...
"luence客户端测试软件luke" 指的是一个名为"Luke"的工具,它是针对Apache Lucene(一个流行的全文搜索引擎库)的客户端测试和分析工具。Luence可能是“Lucene”的拼写错误,但在这里我们假设指的是Lucene。 **描述...
`search`方法返回`TopDocs`对象,其中包含了匹配的文档及其得分。根据需求,我们可以遍历`topDocs.scoreDocs`来获取和展示搜索结果。 在`DemoData.java`文件中,可能包含了构建索引和测试数据的相关代码。通常,...
**Lucene** 是Apache软件基金会的项目,它提供了全文索引和搜索功能,是Java中最流行的全文检索库。在"lucene_jars.zip"中,包含了Lucene的不同模块,如"lucene-core-4.3.0.jar"是Lucene的核心库,负责索引和搜索的...
提供的 `lucene-1.4.3.jar` 文件是 Lucene 的库文件,包含了 Lucene 框架的所有类和方法,是运行 `Indexer.java` 和 `Searcher.java` 必不可少的依赖。开发者可以通过导入这个 JAR 包到项目中,直接调用 Lucene 提供...
### 获取全部Luence数据 #### 知识点详解 **Lucene** 是一个高性能、全功能的文本搜索引擎库。在本文档中,我们将探讨如何通过Lucene获取索引中的所有文档,包括创建索引、查询索引以及遍历所有文档的具体步骤。 ...
《构建垂直搜索引擎:从爬虫到Lucene检索》 在当今信息爆炸的时代,搜索引擎成为了我们获取知识、解决问题的重要工具。本项目实践旨在介绍如何构建一个基础的垂直搜索引擎,该搜索引擎专注于某一特定领域的信息检索...
**Lucene搜索引擎简介** Lucene是Apache软件基金会的开源全文搜索引擎库,它为开发者提供了在...通过深入理解和实践这个例子,开发者可以更好地掌握Lucene在实际应用中的用法,提升其信息检索系统的效率和用户体验。
- IndexReader:读取索引,提供访问文档和倒排索引的方法。 - IndexSearcher:用于搜索索引,包含查询执行和结果排序功能。 5. **luence46**: 这个压缩包可能包含了Lucene 4.6版本的源代码,源码提供了深入了解...
3. **执行查询**: 使用`IndexSearcher`的`search()`方法,传入`Query`对象,得到`TopDocs`,其中包含了匹配的文档数量和得分最高的文档信息。 4. **显示结果**: 对`TopDocs`中的`ScoreDoc`数组进行迭代,获取每个...
lucene 原理与分析,底层源码解析,应用场景及实践,相关配置
标题与描述均聚焦于“Lucene搜索过程源码解析—Score树”,这表明文章将深入探讨Lucene这一流行的信息...通过深入理解这些源码细节,开发人员可以更好地定制和优化基于Lucene的应用程序,以满足特定场景下的检索需求。
《构建垂直搜索引擎:VerticalSearcher与Lucene的实践》 在信息技术日新月异的今天,搜索引擎已经成为我们获取...通过深入理解和优化这个项目,我们可以更好地理解搜索引擎的工作机制,从而提升信息检索的效率和质量。
《Lucene in Action》是一本深入探讨Apache Lucene的权威指南,这本书的中英文PDF版本提供了全面了解和学习这个搜索引擎库的机会。Lucene是Java开发的一款高性能、全文本搜索库,广泛应用于各种需要强大搜索功能的...
Lucene是一个高性能、全文检索库,它提供了丰富的API供开发者使用,能够帮助我们建立强大的搜索引擎。而在这个系统中,同时采用了Paoding这个专门针对中文的分词工具,以提升中文搜索的准确性和效率。 首先,我们...
在搜索引擎和信息检索领域,Lucene是一个非常重要的开源全文搜索引擎库。它提供了高效的文本索引和搜索功能,被广泛应用于各种信息系统的后台。在Lucene中,为了提高搜索的准确性和效率,通常会使用到一些优化技术,...
3. 缓存优化:合理利用查询结果缓存和字段数据缓存,提高检索速度。 总结,Lucene 3.6提供了一整套强大的搜索工具,通过理解其核心组件和使用流程,开发者可以构建出高效、灵活的全文搜索引擎。无论是小型项目还是...