`
deepfuture
  • 浏览: 4411700 次
  • 性别: Icon_minigender_1
  • 来自: 湛江
博客专栏
073ec2a9-85b7-3ebf-a3bb-c6361e6c6f64
SQLite源码剖析
浏览量:80124
1591c4b8-62f1-3d3e-9551-25c77465da96
WIN32汇编语言学习应用...
浏览量:70327
F5390db6-59dd-338f-ba18-4e93943ff06a
神奇的perl
浏览量:103582
Dac44363-8a80-3836-99aa-f7b7780fa6e2
lucene等搜索引擎解析...
浏览量:286542
Ec49a563-4109-3c69-9c83-8f6d068ba113
深入lucene3.5源码...
浏览量:15050
9b99bfc2-19c2-3346-9100-7f8879c731ce
VB.NET并行与分布式编...
浏览量:67781
B1db2af3-06b3-35bb-ac08-59ff2d1324b4
silverlight 5...
浏览量:32290
4a56b548-ab3d-35af-a984-e0781d142c23
算法下午茶系列
浏览量:46075
社区版块
存档分类
最新评论

lucene-索引的优化和索引过程查看

阅读更多

代码:(索引建立)

package bindex;

import java.io.IOException;
import java.io.PrintStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import jeasy.analysis.MMAnalyzer;
import org.apache.lucene.analysis.PerFieldAnalyzerWrapper;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.store.LockObtainFailedException;
import org.apache.lucene.store.RAMDirectory;
import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.beans.LinkBean;
import org.htmlparser.filters.AndFilter;
import org.htmlparser.filters.HasAttributeFilter;
import org.htmlparser.filters.NotFilter;
import org.htmlparser.filters.OrFilter;
import org.htmlparser.filters.RegexFilter;
import org.htmlparser.filters.TagNameFilter;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;

public class perfieldindextest {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String indexpath="./indexes";

IndexWriter writer;
PerFieldAnalyzerWrapper wr;
Document doc;
try {
RAMDirectory rd=new RAMDirectory();
writer=new IndexWriter(rd,new StandardAnalyzer());
//限制第个field最大词条数为100
writer.setMaxFieldLength(100);
writer.setInfoStream(System.out);//查看索引过程
wr=new PerFieldAnalyzerWrapper(new StandardAnalyzer());
wr.addAnalyzer("title",new MMAnalyzer());
wr.addAnalyzer("content", new MMAnalyzer());
wr.addAnalyzer("author", new MMAnalyzer());
wr.addAnalyzer("time", new StandardAnalyzer());
//提取腾迅国内新闻链接
LinkBean lb=new LinkBean();
List baseurls=new ArrayList();
baseurls.add("http://news.qq.com/china_index.shtml");
baseurls.add("http://news.qq.com/world_index.shtml");
baseurls.add("http://news.qq.com/society_index.shtml");
for (int j=0;j<baseurls.size();j++){
lb.setURL((String)baseurls.get(j));
URL[] urls=lb.getLinks();
for (int i=0;i<urls.length;i++){
doc=new Document();
String title="";
String content="";
String time="";
String author="";
System.out.println("正在提取"+(String)baseurls.get(j)+"第"+i+"个链接("+(int)(100*(i+1)/urls.length)+"%)["+urls[i].toString()+"].....");
if (!(urls[i].toString().startsWith("http://news.qq.com/a/"))){
System.out.println("非新闻链接,忽略......");continue;
}
System.out.println("新闻链接,正在处理");
Parser parser=new Parser(urls[i].toString());
parser.setEncoding("GBK");
String url=urls[i].toString();
NodeFilter filter_title=new TagNameFilter("title");
NodeList nodelist=parser.parse(filter_title);
Node node_title=nodelist.elementAt(0);
title=node_title.toPlainTextString();
System.out.println("标题:"+title);
parser.reset();
NodeFilter filter_auth=new OrFilter(new HasAttributeFilter("class","auth"),new HasAttributeFilter("class","where"));
nodelist=parser.parse(filter_auth);
Node node_auth=nodelist.elementAt(0);
if (node_auth != null) author=node_auth.toPlainTextString();
else author="腾讯网";
node_auth=nodelist.elementAt(1);
if (node_auth != null) author+=node_auth.toPlainTextString();
System.out.println("作者:"+author);
parser.reset();
NodeFilter filter_time=new OrFilter(new HasAttributeFilter("class","info"),new RegexFilter("[0-9]{4}年[0-9]{1,2}月[0-9]{1,2}日[' ']*[0-9]{1,2}:[0-9]{1,2}"));
nodelist=parser.parse(filter_time);
Node node_time=nodelist.elementAt(0);
if (node_time!=null) {
if (node_time.getChildren()!=null) node_time=node_time.getFirstChild();
time=node_time.toPlainTextString().replaceAll("[ |\t|\n|\f|\r\u3000]","").substring(0,16);
}

System.out.println("时间:"+time);
parser.reset();
NodeFilter filter_content=new OrFilter(new OrFilter(new HasAttributeFilter("style","TEXT-INDENT: 2em"),new HasAttributeFilter("id","Cnt-Main-Article-QQ")),new HasAttributeFilter("id","ArticleCnt"));
nodelist=parser.parse(filter_content);
Node node_content=nodelist.elementAt(0);
if (node_content!=null){
content=node_content.toPlainTextString().replaceAll("(#.*)|([a-z].*;)|}","").replaceAll(" |\t|\r|\n|\u3000","");
}
System.out.println("内容:"+content);
System.out.println("正在索引.....");
Field field=new Field("title",title,Field.Store.YES,Field.Index.TOKENIZED);
doc.add(field);
field=new Field("content",content,Field.Store.YES,Field.Index.TOKENIZED);
doc.add(field);
field=new Field("author",author,Field.Store.YES,Field.Index.UN_TOKENIZED);
doc.add(field);
field=new Field("time",time,Field.Store.YES,Field.Index.NO);
doc.add(field);
field=new Field("url",url,Field.Store.YES,Field.Index.NO);
doc.add(field);
writer.addDocument(doc,new MMAnalyzer());
System.out.println("<"+title+"索引成功>");
}
}
writer.close();
wr.close();
FSDirectory fd=FSDirectory.getDirectory(indexpath);
IndexWriter wi=new IndexWriter(fd,new MMAnalyzer());
PrintStream ps=new PrintStream("log.txt");
wi.setInfoStream(ps);//将索引过程输出到文件
wi.addIndexes(new Directory[]{rd});
//内存中文档最大值是40
wi.setMaxMergeDocs(80);
//内存中存储40个文档时写成磁盘一个块
wi.setMergeFactor(80);
System.out.println("<索引优化中>");
//索引本身的优化,多个索引文件合并成单个文件
wi.optimize();
wi.close();
System.out.println("<索引建立完毕>");
} catch (ParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (CorruptIndexException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}

servlet:

package bservlet;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.*;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.*;

import java.io.*;

import jeasy.analysis.MMAnalyzer;


public class SluceneSearcher extends HttpServlet {
private String indexpath="D:/workspace/testsearch2/indexes";
public void doPost(HttpServletRequest request,HttpServletResponse response){
StringBuffer sb=new StringBuffer("");
try {
request.setCharacterEncoding("GBK");
String phrase=request.getParameter("phrase");
Analyzer analyzer=new MMAnalyzer();
IndexSearcher searcher;
searcher = new IndexSearcher(indexpath);
QueryParser parser=new QueryParser("content",analyzer);
Query q= parser.parse(phrase);
Hits hs=searcher.search(q);
int num=hs.length();
sb.append("<h1>您搜索到的记录数:"+num+"</h1>");
for (int i=0;i<num;i++){
Document doc=hs.doc(i);
if (doc==null){
continue;
}
Field field_title=doc.getField("title");
String title="<br><a href="+doc.getField("url").stringValue()+" target='_blank'>"+field_title.stringValue()+"</a><br>";
Field field_author=doc.getField("author");
String author="<br>author:<br>"+field_author.stringValue();
Field field_time=doc.getField("time");
String time="<br>time:<br>"+field_time.stringValue();
sb.append(title);
sb.append(author);
sb.append(time);
}
searcher.close();
} catch (CorruptIndexException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
PrintWriter out;
try {
response.setContentType("text/html;charset=GBK");
out = response.getWriter();
out.print(sb.toString());
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
public void doGet(HttpServletRequest request,HttpServletResponse response){
doPost(request,response);
}

}

分享到:
评论
1 楼 zhujyy 2012-06-02  
wi.addIndexes(new Directory[]{rd}); 这一步是干嘛呢?
好像有报错 我lucene的是3.0版本的

相关推荐

    lucene-core-7.2.1-API文档-中文版.zip

    赠送jar包:lucene-core-7.2.1.jar; 赠送原API文档:lucene-core-7.2.1-javadoc.jar; 赠送源代码:lucene-core-7.2.1-sources.jar;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    lucene-4.7.0全套jar包

    - **Core模块**:这是Lucene的核心,包含了索引和搜索的基本功能,如`lucene-core-4.7.0.jar`。 - **Analyzer模块**:提供了各种分词器和过滤器,如`lucene-analyzers-common-4.7.0.jar`。 - **QueryParser模块**...

    lucene-core-2.9.4,lucene-core-3.0.2,lucene-core-3.0.3,lucene-core-3.4.0

    - **多线程支持**:在3.0系列中,Lucene增强了对多线程环境的支持,允许并发索引和检索操作,提升性能。 3. **Lucene 3.4.0** - **查询执行优化**:3.4.0版本对查询执行引擎进行了重大优化,包括更快的评分计算和...

    lucene-core-2.9.2.jar

    2. 索引过程:Lucene的索引过程包括分析(Analyzer)、术语文档表(Term Document Matrix)生成和倒排索引(Inverted Index)的构建。分析阶段将输入文本拆分成有意义的单元——术语,然后创建术语文档表,最后构建...

    je-analysis-1.5.3、lucene-core-2.4.1分词组件

    然而,需要注意的是,版本号较旧的"lucene-core-2.4.1"可能不支持现代的一些特性和优化,如最新的查询语法、多字段搜索等。为了获得最佳性能和最新特性,通常建议使用更新的Lucene版本,同时保持与分词器的兼容性。 ...

    lucene-core-3.0.2.jar,lucene-demos-3.0.2.jar

    在3.0.2版本中,Lucene引入了诸多优化,比如更高效的内存管理、更快的搜索速度以及更灵活的索引构建机制。其中,Document类是表示单个文档的基础单元,Field类则用于定义文档中的字段,如标题、内容等。Analyzer是...

    lucene-core-2.4.0.jar

    作为Java实现的全文检索引擎,Lucene提供了一套高度可扩展的API,支持索引和搜索大量文本数据。在“lucene-core-2.4.0.jar”这个版本中,Lucene已经相当成熟,可以满足各种复杂的搜索需求。 二、核心组件 1. 文档...

    lucene-索引(index).pdf

    Lucene索引的构建和查询都是基于反向索引进行的,这意味着当用户输入查询词时,Lucene能够迅速找到包含这些词的所有文档,而不必遍历整个文档集。 #### 索引文件格式 Lucene索引文件格式是其内部设计的关键部分,...

    Lucene-core-2.0.0.jar

    在2.0.0版本中,Lucene优化了索引构建过程,提升了索引速度。它采用了倒排索引(Inverted Index)结构,这是一种将文档中出现的词及其位置存储在索引中的数据结构,使得查找匹配文档变得高效。此外,此版本还支持多...

    lucene-core-2.3.0 lucene-core2.4.0以及极易分词器 jar包

    这个版本可能不包含后来版本中的一些优化和特性,比如更先进的分词技术、性能提升或者对多语言的支持。 `lucene-core-2.4.0` 是对2.3.0的一个更新,通常会包含错误修复、性能改进和新特性的添加。尽管版本号只相差...

    lucene-codecs-4.4.0.zip

    这些编码解码器的设计允许开发者根据实际需求选择最优化的存储方案,以提高索引和搜索的效率。 Lucene的核心功能主要分布在以下几个模块: 1. 分析器(Analyzer):这是Lucene处理文本输入的关键组件,它将用户...

    lucene-5.0.0 完整资源(包含Jar包)

    1. **分词和索引**:Lucene能够对输入文档进行分词,创建一个高效的倒排索引,使得在大量数据中快速查找匹配项成为可能。这个过程包括分析、tokenization、词干提取和停用词处理等步骤。 2. **查询解析**:用户输入...

    lucene-memory-3.0.1.jar

    而在3.0.1版本中,Lucene引入了内存索引(Memory Index)这一概念,即“lucene-memory-3.0.1.jar”,它允许用户在内存中创建和操作索引,而非传统的磁盘存储。 内存索引的主要优势在于速度。由于数据存取无需经过...

    拼音分词 Pinyin4j+pinyinAnalyzer+lucene-analyzers

    pinyinAnalyzer是Lucene的一个分析器,它利用了Pinyin4j的功能,能够将输入的中文文本分词并转化为拼音形式,以便于Lucene这样的全文搜索引擎进行索引和查询。而lucene-analyzers则是Lucene的一系列分析器集合,包含...

    最全的lucene-2.4.0jar包

    索引过程将文档内容转换为可搜索的数据结构,包括词项(Term)、词项频率(TF)和位置信息。 - **Analyzer**:Analyzer负责将输入文本分解为词元(Token),并可能进行其他处理,如标准化(lowercasing)、去除标点...

    最新全文检索 lucene-5.2.1 入门经典实例

    - Lucene支持对已索引文档进行更新和删除,保证数据的实时性。 在提供的"lucene5.2.1入门经典案例"中,你可以找到如何创建索引、执行查询、高亮显示结果等具体操作的示例代码。这些案例可以帮助初学者快速理解和...

    Lucene-core-2.0.0

    3. **Lucene的版本历史**: 从2.0.0到最新的版本,Lucene经历了多次迭代和优化,增加了对更多语言的支持,提升了性能,增强了稳定性,并引入了许多新的特性,如更复杂的查询语法、多线程索引等。 4. **使用场景**: ...

    lucene-2.9.2.jar包+源码

    在Lucene-2.9.2中,索引过程涉及文档分析、字段存储、倒排索引和位图过滤等步骤。在这个过程中,中文分词是关键的一环。 对于中文分词,Lucene-2.9.2提供了对多种分词器的支持,如IK分词器、SmartCN分词器等。这些...

    MMAnalyzer 分词必导入jar包(lucene-core-2.4.1.jar je-analysis-1.5.3.jar)

    `lucene-core-2.4.1.jar`是Lucene的核心库,包含了Lucene的基础组件和API,如文档处理、索引操作、查询构造等,这些是MMAnalyzer进行分词工作所必需的。 在实际项目中,正确导入这两个JAR包是确保MMAnalyzer正常...

    je-analysis-1.5.3;lucene-core-2.9.2

    Lucene允许开发者在应用程序中实现复杂的全文搜索功能,它提供了一个高级的索引和搜索机制,支持倒排索引、模糊查询、布尔查询等。版本号2.9.2意味着这比早期版本有了更多的改进和优化,尽管可能较新版本有更多的...

Global site tag (gtag.js) - Google Analytics