`

运用Luence建索和检索的方法

 
阅读更多

初学者   还在进步 勿批!

链接地址: 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搜索小程序

    在搜索高亮方面,Luence.net提供了一种有效的方法,可以将用户的查询关键字在搜索结果中突出显示,增强用户体验。这通常通过分析搜索结果文档,找出匹配的关键词,并用特定的样式(如加粗、颜色变化等)进行标记来...

    Luence搜索Demo

    本文将深入探讨基于.NET平台的Luence.Net搜索Demo,帮助读者理解如何利用Luence进行高效的数据检索。 首先,我们要明白Luence是什么。Luence是Apache Lucene的.NET版本,它提供了丰富的API和工具,用于构建强大的...

    luence搜索

    《深入理解Lucene搜索引擎》 ...通过理解和熟练运用这些核心概念,开发者可以构建出满足各种需求的全文检索系统。在具体实践中,根据业务场景选择适当的配置和扩展,可以进一步提升搜索系统的效能。

    Luence和ElasticSearch面试准备.docx

    《Luence和ElasticSearch面试准备》 Lucene和ElasticSearch是两个在全文搜索引擎领域中广泛使用的开源工具。Lucene是一个高性能、全文本搜索库,而Elasticsearch则是在Lucene的基础上构建的一个分布式、RESTful风格...

    Lucene 搜索方法(模糊搜索)

    `search`方法返回`TopDocs`对象,其中包含了匹配的文档及其得分。根据需求,我们可以遍历`topDocs.scoreDocs`来获取和展示搜索结果。 在`DemoData.java`文件中,可能包含了构建索引和测试数据的相关代码。通常,...

    luence客户端测试软件luke

    "luence客户端测试软件luke" 指的是一个名为"Luke"的工具,它是针对Apache Lucene(一个流行的全文搜索引擎库)的客户端测试和分析工具。Luence可能是“Lucene”的拼写错误,但在这里我们假设指的是Lucene。 **描述...

    IKAnalyzer和luence压缩包大全

    **Lucene** 是Apache软件基金会的项目,它提供了全文索引和搜索功能,是Java中最流行的全文检索库。在"lucene_jars.zip"中,包含了Lucene的不同模块,如"lucene-core-4.3.0.jar"是Lucene的核心库,负责索引和搜索的...

    lucene索引与搜索(含jar包)

    提供的 `lucene-1.4.3.jar` 文件是 Lucene 的库文件,包含了 Lucene 框架的所有类和方法,是运行 `Indexer.java` 和 `Searcher.java` 必不可少的依赖。开发者可以通过导入这个 JAR 包到项目中,直接调用 Lucene 提供...

    获取全部Luence数据

    ### 获取全部Luence数据 #### 知识点详解 **Lucene** 是一个高性能、全功能的文本搜索引擎库。在本文档中,我们将探讨如何通过Lucene获取索引中的所有文档,包括创建索引、查询索引以及遍历所有文档的具体步骤。 ...

    人工智能-项目实践-搜索引擎-基本的垂直搜索引擎,实现了基本的网络爬虫功能以及用Luence实现检索

    《构建垂直搜索引擎:从爬虫到Lucene检索》 在当今信息爆炸的时代,搜索引擎成为了我们获取知识、解决问题的重要工具。本项目实践旨在介绍如何构建一个基础的垂直搜索引擎,该搜索引擎专注于某一特定领域的信息检索...

    Lucene搜索例子

    **Lucene搜索引擎简介** Lucene是Apache软件基金会的开源全文搜索引擎库,它为开发者提供了在...通过深入理解和实践这个例子,开发者可以更好地掌握Lucene在实际应用中的用法,提升其信息检索系统的效率和用户体验。

    luence4.6例子

    - IndexReader:读取索引,提供访问文档和倒排索引的方法。 - IndexSearcher:用于搜索索引,包含查询执行和结果排序功能。 5. **luence46**: 这个压缩包可能包含了Lucene 4.6版本的源代码,源码提供了深入了解...

    Luence简单实例

    3. **执行查询**: 使用`IndexSearcher`的`search()`方法,传入`Query`对象,得到`TopDocs`,其中包含了匹配的文档数量和得分最高的文档信息。 4. **显示结果**: 对`TopDocs`中的`ScoreDoc`数组进行迭代,获取每个...

    Luence原理及源码分析

    lucene 原理与分析,底层源码解析,应用场景及实践,相关配置

    lucene-搜索过程源码解析-Score树

    标题与描述均聚焦于“Lucene搜索过程源码解析—Score树”,这表明文章将深入探讨Lucene这一流行的信息...通过深入理解这些源码细节,开发人员可以更好地定制和优化基于Lucene的应用程序,以满足特定场景下的检索需求。

    VerticalSearcher:基本的垂直搜索引擎,实现了基本的网络爬虫功能以及用Luence实现检索

    《构建垂直搜索引擎:VerticalSearcher与Lucene的实践》 在信息技术日新月异的今天,搜索引擎已经成为我们获取...通过深入理解和优化这个项目,我们可以更好地理解搜索引擎的工作机制,从而提升信息检索的效率和质量。

    Luence in Action 中英文pdf 版

    《Lucene in Action》是一本深入探讨Apache Lucene的权威指南,这本书的中英文PDF版本提供了全面了解和学习这个搜索引擎库的机会。Lucene是Java开发的一款高性能、全文本搜索库,广泛应用于各种需要强大搜索功能的...

    基于Lucene的搜索系统-客户端调用

    Lucene是一个高性能、全文检索库,它提供了丰富的API供开发者使用,能够帮助我们建立强大的搜索引擎。而在这个系统中,同时采用了Paoding这个专门针对中文的分词工具,以提升中文搜索的准确性和效率。 首先,我们...

    Luence+Ikanalyzer+stopword+dic

    在搜索引擎和信息检索领域,Lucene是一个非常重要的开源全文搜索引擎库。它提供了高效的文本索引和搜索功能,被广泛应用于各种信息系统的后台。在Lucene中,为了提高搜索的准确性和效率,通常会使用到一些优化技术,...

    基于lucene3.6平台搜索工具相关包及使用说明

    3. 缓存优化:合理利用查询结果缓存和字段数据缓存,提高检索速度。 总结,Lucene 3.6提供了一整套强大的搜索工具,通过理解其核心组件和使用流程,开发者可以构建出高效、灵活的全文搜索引擎。无论是小型项目还是...

Global site tag (gtag.js) - Google Analytics