`

庖丁解牛的Lucene 2.4的全文搜索代码

阅读更多
package com.laozizhu.article.util;

import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.sql.DataSource;
import net.paoding.analysis.analyzer.PaodingAnalyzer;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
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.TopDocCollector;

/**
* 基于庖丁解牛的Lucene 2.4的全文搜索代码。
* 
* @author 老紫竹研究室(laozizhu.com)
*/
public class LucenePaoDing {
private static final String indexPath = "d:/indexpaoding/www.laozizhu.com";

/**
   * @param args
   * @throws Exception
   */
public static void main(String[] args) throws Exception {
    rebuildAll();
    String keyword = "Spring.jar";
    LucenePaoDing l = new LucenePaoDing();
    System.out.println("索引搜索\n------------------------------");
    System.out.println(l.seacherIndex(keyword));
}

public static void rebuildAll() {
    synchronized (indexPath) {
      LucenePaoDing l = new LucenePaoDing();
      DataSource ds = (DataSource) Factory.getBean("dataSource");
      Connection con = null;
      Statement stat = null;
      ResultSet rs = null;
      try {
        con = ds.getConnection();
        stat = con.createStatement();
        rs = stat.executeQuery("select id,subject,content from t_article");
        if (rs != null) {
          l.Index(rs);
        }
      } catch (Exception ex) {
        ex.printStackTrace();
      } finally {
        if (rs != null) {
          try {
            rs.close();
          } catch (Exception ex) {}
        }
        if (stat != null) {
          try {
            stat.close();
          } catch (Exception ex) {}
        }
        if (con != null) {
          try {
            con.close();
          } catch (Exception ex) {}
        }
      }
    }
}

public synchronized Analyzer getAnalyzer() {
    return new PaodingAnalyzer();
}

private synchronized void Index(ResultSet rs) {// 通过结果集就可以获得数据源了
    try {
      IndexWriter writer = new IndexWriter(indexPath, getAnalyzer(), true, IndexWriter.MaxFieldLength.UNLIMITED);
      writer.setMaxFieldLength(10000000);
      Date start = new Date();
      int index = 1;
      while (rs.next()) {
        Document doc = new Document();// 一个文档相当与表的一条记录
        doc.add(new Field("id", rs.getString("id"), Field.Store.YES, Field.Index.NOT_ANALYZED));// 字段id放的是数据库表中的id,lucene的一条记录的一个字段下的数据可以放多个值,这点与数据库表不同
        doc.add(new Field("subject", rs.getString("subject"), Field.Store.YES, Field.Index.ANALYZED));
        doc.add(new Field("content", rs.getString("content"), Field.Store.YES, Field.Index.ANALYZED));
        writer.addDocument(doc);
        if (index++ == 1000) {
          writer.commit();
          index = 0;
        }
      }
      writer.commit();
      writer.optimize();// 优化
      writer.close();// 一定要关闭,否则不能把内存中的数据写到文件
      Date end = new Date();
      System.out.println("重建索引成功!!!!" + "用时" + (end.getTime() - start.getTime()) + "毫秒");
    } catch (IOException e) {
      System.out.println(e);
    } catch (SQLException e) {
      System.out.println(e);
    }
}

public void IndexSingle(long id, String subject, String content) {// 通过结果集就可以获得数据源了
    synchronized (indexPath) {
      try {
        IndexWriter writer = new IndexWriter(indexPath, getAnalyzer(), false, IndexWriter.MaxFieldLength.UNLIMITED);
        writer.setMaxFieldLength(10000000);
        Date start = new Date();
        Document doc = new Document();// 一个文档相当与表的一条记录
        doc.add(new Field("id", Long.toString(id), Field.Store.YES, Field.Index.NOT_ANALYZED));// 字段id放的是数据库表中的id,lucene的一条记录的一个字段下的数据可以放多个值,这点与数据库表不同
        doc.add(new Field("subject", subject, Field.Store.YES, Field.Index.ANALYZED));
        doc.add(new Field("content", content, Field.Store.YES, Field.Index.ANALYZED));
        writer.addDocument(doc);
        // writer.optimize();// 优化
        writer.close();// 一定要关闭,否则不能把内存中的数据写到文件
        Date end = new Date();
        System.out.println("索引建立成功!!!!" + "用时" + (end.getTime() - start.getTime()) + "毫秒");
      } catch (IOException e) {
        System.out.println(e);
      }
    }
}

/**
   * 最主要的搜索方法。
   * 
   * @param queryString
   * @return
   */
public List<Long> seacherIndex(String queryString) {// 根据关键字搜索
    try {
      IndexSearcher isearcher = new IndexSearcher(indexPath);
      /* 下面这个表示要同时搜索这两个域,而且只要一个域里面有满足我们搜索的内容就行 */
      BooleanClause.Occur[] clauses = { BooleanClause.Occur.SHOULD, BooleanClause.Occur.SHOULD };
      TopDocCollector collector = new TopDocCollector(10);
      Query query = MultiFieldQueryParser.parse(queryString, new String[] { "subject", "content" }, clauses, getAnalyzer());
      isearcher.search(query, collector);
      ScoreDoc[] hits = collector.topDocs().scoreDocs;
      List<Long> rtn = new ArrayList<Long>();
      Long id;
      int docId;
      for (int i = 0; i < hits.length; i++) {
        docId = hits[i].doc;
        Document doc = isearcher.doc(docId);
        id = Long.parseLong(doc.get("id").trim());
        if (!rtn.contains(id)) {
          rtn.add(id);
        }
      }
      isearcher.close();
      return rtn;
    } catch (Exception e) {
      e.printStackTrace();
      return null;
    }
}
}

 

分享到:
评论

相关推荐

    庖丁解牛 源码 for Lucene 2.4

    《庖丁解牛 源码 for Lucene 2.4》是一份针对开源全文搜索引擎Lucene 2.4版本的深度解析资料。这个压缩包包含的文件名为"paoding-for-lucene-2.4",很可能是针对中文处理的Paoding Lucene库的源代码分析或扩展。...

    Lucene 庖丁解牛分词法2.4版本jar包

    在实际应用中,例如建立一个新闻网站的全文检索系统,开发者可以利用"庖丁解牛分词法"对新闻内容进行预处理,将每篇新闻文本拆分成关键词,再用Lucene建立索引。当用户输入查询词时,系统将使用相同的分词逻辑进行...

    lucene 中文分词 庖丁解牛

    《Lucene中文分词:庖丁解牛》 在信息技术高速发展的今天,全文搜索引擎已经成为网站内容...在实际项目中,结合“庖丁解牛”的精神,我们可以不断提升Lucene的中文分词效率,让搜索引擎更加智能化,更好地服务于用户。

    lucene中文分词(庖丁解牛)庖丁分词

    总的来说,结合Apache Lucene与庖丁解牛,可以构建出强大的中文全文检索系统。在实际应用中,理解并熟练运用这两者的结合,将极大地提升你的文本处理能力,为用户提供更加智能、精准的搜索体验。

    庖丁解牛工具

    总的来说,“庖丁解牛工具”是处理中文文本的重要工具,尤其对于那些需要进行文本分析、信息检索或构建中文搜索引擎的项目来说,它的存在极大地提升了工作效率和结果质量。通过深入理解和使用"paoding"中的资源,...

    lucene3.0 整合庖丁解牛实例

    实例是一个java实例,可直接导入到MyEclipse中...其中是lucene3.0整合了庖丁解牛分词法,添加了高亮显示。因为lucene3.0无法整合paoding-analysis.jar 所以我已经把paoding-analysis中的源码整合进来了避免无法整合问题

    lucene3庖丁解牛中文分词器

    《深入剖析:Lucene3与庖丁解牛中文分词器》 在信息技术飞速发展的今天,全文检索和...在实际操作中,结合标签“lucene 中文分词器 庖丁解牛 全文索引”,我们可以深入学习和实践,不断优化分词效果,提高用户体验。

    java拼车网雏形(Ext2.0+SSH+oracle10g+lucene2.4)

    **Lucene 2.4** 是Apache软件基金会的一个开源全文检索库,提供索引和搜索功能。在这个拼车网雏形中,Lucene可能用于建立对拼车信息的全文索引,帮助用户快速、精准地查找符合要求的拼车信息。 **pinche.dmp** 文件...

    Lucene 2.4 入门例子

    doc.add(new TextField("content", "Lucene搜索示例", Field.Store.YES)); indexWriter.addDocument(doc); // 关闭IndexWriter indexWriter.close(); // 创建QueryParser QueryParser parser = new QueryParser(...

    Lucene2.4入门总结

    它提供了高级文本检索功能,广泛用于构建搜索引擎和其他需要高效全文检索能力的应用。本文将重点介绍 Lucene 2.4 版本的基本概念和使用方法,帮助初学者快速入门。 ### 一、Lucene 概述 1. **核心概念**:Lucene ...

    Lucene加庖丁解牛测试类

    总的来说,通过“Lucene加庖丁解牛测试类”,我们可以系统地学习和实践Lucene的各项功能,从而在实际项目中更好地利用这一强大的搜索引擎库。无论是初学者还是经验丰富的开发者,都能从中受益,提升自己的技能水平。

    Lucene2.4完美样例+中文文档

    总的来说,Lucene 2.4 是一个强大且灵活的全文检索引擎,适用于各种 Java 应用场景。通过学习样例代码和阅读中文文档,你将能熟练掌握 Lucene 的基本操作,从而在自己的项目中实现高效的全文搜索功能。无论是初学者...

    lucene 2.4 jar

    lucene 2.4 jar lucene2.4版本的JAR包

    paoding analysis 3.0.1 jar (庖丁解牛分词器)

    由于庖丁官方目前提供可下载尚不支持Lucene 3.0以上版本。因此作者对paoding进行重新编译,使其与最新Lucene 3.0.1版本适用。 Latest paoding 3.0.1 for lucene 3.0.1 使用说明: 先下载2.0.4的版本(h t t p : / ...

    lucene2.4+nutch学习笔记三:lucene 在多个文本文档里找出包含一些关键字的文档

    《Lucene 2.4与Nutch学习笔记:在多文本文档中搜索关键词》 Lucene是一个高性能、全文本搜索引擎库,它为开发者提供了在Java应用程序中实现全文搜索功能的基本工具。Nutch则是一个开源的网络爬虫项目,用于抓取...

    ictclas4j for lucene 2.4

    ictclas4j for lucene 2.4 任何人不得将此用于商业用途,仅限个人学习研究之用.该开源项目遵循Apache License 2.0

    lucene最新版本加庖丁解牛实现搜索引擎

    《使用Lucene最新版与庖丁解牛方法构建搜索引擎》 在信息技术日新月异的今天,搜索引擎已经成为了我们获取信息的重要工具。Apache Lucene是一个高性能、全文本搜索库,被广泛应用于各种搜索引擎的开发中。本文将...

    Lucene3.0以上版本庖丁解牛分词法demo

    最新庖丁解牛分词法的使用demo,支持Lucene3.3、3.4等3.0以上版本,庖丁解牛的分词包为自己编译生成的,之前的2.0的版本不能支持Lucene3.0以上版本,所以需要从svn下载最新的庖丁解牛源码,生成jar文件(我同样已...

    庖丁解牛jar包

    一直找不到适合lucene-35以上的庖丁解牛jar包,搞了半天总于生成好了jar包,在lucene-35中运行没问题

Global site tag (gtag.js) - Google Analytics