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

lucene-内存索引、内存索引保存在硬盘、索引优化

阅读更多



 

索引代码

package bindex;

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());
       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());
       wi.addIndexes(new Directory[]{rd});
       //内存中文档最大值是80
       wi.setMaxMergeDocs(80);
       //内存中存储80个文档时写成磁盘一个块
       wi.setMergeFactor(80);
       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();
   }
 }

}

severlt代码:

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);
 }

}

 

 

 

  • 大小: 70.1 KB
分享到:
评论
2 楼 deepfuture 2013-04-30  
内存索引写入硬盘文件
索引的结果放到硬盘中,这样重启电脑后,仍然可以调取
1 楼 w156445045 2013-04-29  
博主,您好,请问下
内存索引的原理是什么呢,大致是什么意思呢?

文件的操作不都是在内存的嘛?

相关推荐

    lucene-4.7.0全套jar包

    3. **高性能**:Lucene通过内存缓存、位向量和优化的数据结构来提高搜索速度。同时,它支持多线程索引和搜索,适应大规模数据处理。 4. **可扩展性**:Lucene提供了丰富的API,开发者可以定制分词器、过滤器、评分...

    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; 赠送Maven依赖信息文件:lucene-core-7.2.1.pom; 包含翻译后的API文档:lucene...

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

    《Apache Lucene核心技术详解:从2.9.4到3.4.0的演变》 Apache Lucene,作为开源的全文检索库,是Java...随着版本的迭代,Lucene不仅提供了更多的功能,也在性能和稳定性上不断优化,为信息检索领域提供了强大的支持。

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

    在实际应用中,首先,Je-Analysis会处理输入的中文文本,进行分词操作,然后将分词结果传递给Lucene进行索引。当用户发起搜索请求时,Lucene会利用已建立的索引快速找到匹配的文档,从而返回搜索结果。 在分词组件...

    lucene-core-2.9.2.jar

    4. 更新与优化:Lucene允许动态更新索引,即添加、删除或修改文档。此外,定期的索引优化(Merge)可以合并多个段,提高搜索效率。 三、lucene-1.4.3.jar.license.txt 这个文件通常包含了关于Apache Lucene早期...

    lucene-memory-3.0.1.jar

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

    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

    - 提供了对倒排索引的压缩优化,减小存储空间。 - 强化了查询性能,如更快的评分计算和更高效的top-N搜索。 四、应用场景 Lucene广泛应用于各类需要全文搜索的场景,如内容管理系统、电子商务平台、企业信息检索...

    Lucene-core-2.0.0.jar

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

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

    5. **内存和磁盘管理**:Lucene 使用段(Segment)的概念来组织索引,每个段都是一个独立的可搜索单位。定期的合并操作可以优化磁盘空间并保持索引效率。 6. **扩展性和定制化**:Lucene 是一个高度模块化的框架,...

    lucene-codecs-4.4.0.zip

    在IT领域,Lucene是一个非常重要的开源全文搜索引擎库,它为开发者提供了强大的文本分析、索引和搜索功能。这里我们关注的是Lucene的4.4.0版本,通过解压"lucene-codecs-4.4.0.zip",我们可以深入了解其内部机制和...

    拼音分词 Pinyin4j+pinyinAnalyzer+lucene-analyzers

    标题中的“拼音分词 Pinyin4j+pinyinAnalyzer+lucene-analyzers”指的是这个压缩包包含的三个核心组件,它们都是在处理中文文本时非常重要的工具。Pinyin4j是一个Java库,主要用于将汉字转换为拼音,这对于进行基于...

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

    在Java环境中,Lucene是构建搜索引擎的核心工具,它提供了高效的索引和查询机制,支持多种复杂的搜索语法。这里提到的是Lucene的两个不同版本——2.3.0和2.4.0,这两个版本都是较早的版本,但仍然在某些场景下被使用...

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

    在提供的"lucene5.2.1入门经典案例"中,你可以找到如何创建索引、执行查询、高亮显示结果等具体操作的示例代码。这些案例可以帮助初学者快速理解和应用Lucene-5.2.1的核心功能。通过实践,你可以更深入地了解Lucene...

    lucene-全文索引

    基于JAVA的全文索引引擎Lucene简介(中) - 网站开发初中级代码参考-

    最全的lucene-2.4.0jar包

    - **Document和Field**:在Lucene中,信息以Document对象的形式存储,每个Document包含一个或多个Field,每个Field都有自己的名字和内容,可以设置不同的属性(如是否被索引、是否被存储等)。 - **Highlighter**:...

    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正常...

    lucene-4.2.1-src.tgz

    9. **优化和合并**:Lucene提供了索引优化(`Optimize`)和段合并(`MergePolicy`)功能,用于提高索引质量和检索效率。 10. **分布式搜索**:虽然单个Lucene实例可以处理大量数据,但当数据量更大时,可以通过Solr...

Global site tag (gtag.js) - Google Analytics