lucene 4.10 检索mysql数据库

56 篇文章 0 订阅
22 篇文章 0 订阅


今天拿到一个需求,需要使用lucene 检索mysql数据库的一个通讯录表,需要支持全文全字段复合检索.
用户的表结构如下

 

     (通讯录mysql表结构)

 

lunece检索mysql 表结构


在网上找了一些例子,由于网上这些例子都不是基于lucene 4的,需要进行改动,这里我把这里好的代码共享一下..
本项目的例子基于 lucene 4.10 也就是lucene 4.0的最后一个版本,当前最新的版本是lucene 5.0 ,没注意看有什么改进..但是作为一个有经验的老员工来说,使用技术一定不要用最新的,刚发布的,老一点的技术更稳定,资料更多..

lunece检索mysql 表数据

本项目例子需要依赖如下四个jar文件,大家自己去lucene官网下载即可

lunece检索mysql


   项目依赖的jar

package  com.text;
 
import  java.io.File;
import  java.sql.Connection;
import  java.sql.DriverManager;
import  java.sql.PreparedStatement;
import  java.sql.ResultSet;
import  java.sql.SQLException;
 
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.DirectoryReader;
import  org.apache.lucene.index.IndexReader;
import  org.apache.lucene.index.IndexWriter;
import  org.apache.lucene.index.IndexWriterConfig;
import  org.apache.lucene.index.IndexWriterConfig.OpenMode;
import  org.apache.lucene.queryparser.classic.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;
import  org.apache.lucene.store.Directory;
import  org.apache.lucene.store.FSDirectory;
import  org.apache.lucene.util.Version;
 
//Lucene 为mysql数据库表 简历完整索引
public  class  LuceneDB {
  Connection conn =  null ;
  // lucene 连接mysql数据库
  private  final  String URL =  "jdbc:mysql://127.0.0.1:3306/portal?useUnicode=true&characterEncoding=UTF8" ;
 
  public  LuceneDB() {
   try  {
    Class.forName( "com.mysql.jdbc.Driver" );
    conn = DriverManager.getConnection(URL,  "root" "root" );
   catch  (ClassNotFoundException e) {
    e.printStackTrace();
   catch  (SQLException e) {
    e.printStackTrace();
   }
  }
 
  public  Connection getConnection() {
   return  this .conn;
  } // 获取数据库连接
 
  public  void  close() {
   try  {
    this .conn.close();
   catch  (SQLException e) {
    e.printStackTrace();
   }
  } // 关闭数据库连接
 
  /**
   * @param args
   * @throws Exception
   */
  public  static  void  main(String args[])  throws  Exception {
   LuceneDB lucene =  new  LuceneDB();
   IndexWriter writer =  null ;
   Connection conn = lucene.getConnection();
   String sql =  "SELECT * FROM pac_contact_info" ;
   // 把lucene的索引文件保存到机器的磁盘
   Directory dirWrite = FSDirectory.open( new  File( "D:\\index" ));
   // lucene分析器    使用lucene默认的暂停词
   Analyzer analyzer =  new  StandardAnalyzer(Version.LUCENE_4_10_4);
   // 初始化写入配置
   IndexWriterConfig iwc =  new  IndexWriterConfig(Version.LUCENE_4_10_4,analyzer);
   iwc.setOpenMode(OpenMode.CREATE); // 创建模式 OpenMode.CREATE_OR_APPEND 添加模式
   //如果是CREATE ,每次都会重新创建这个索引,清空以前的数据,如果是append 每次都会追加,之前的不删除
              //在日常的需求索引添加中,一般都是 APPEND 持续添加模式
   writer =  new  IndexWriter(dirWrite, iwc);
   PreparedStatement ps = conn.prepareStatement(sql);
   ResultSet rs = ps.executeQuery();
   while  (rs.next()) {
    Document doc =  new  Document();
    // 该表所有的字段建立索引
    doc.add( new  Field( "info_id" , rs.getString( "info_id" ), Field.Store.YES,Field.Index.ANALYZED));
    doc.add( new  Field( "name" , rs.getString( "name" ), Field.Store.YES,Field.Index.ANALYZED));
    doc.add( new  Field( "link_phone" , rs.getString( "link_phone" ), Field.Store.YES,Field.Index.ANALYZED));
    doc.add( new  Field( "department" , rs.getString( "department" ), Field.Store.YES,Field.Index.ANALYZED));
    doc.add( new  Field( "id_card" , rs.getString( "id_card" ), Field.Store.YES,Field.Index.ANALYZED));
    doc.add( new  Field( "user_id" , rs.getString( "user_id" ), Field.Store.YES,Field.Index.ANALYZED));
    writer.addDocument(doc);
   }
   rs.close();  // 关闭记录集
   conn.close();  // 关闭数据库连接
   // writer.optimize(); //索引优化
   writer.close();  // 关闭读写器
 
               //索引查询,通过如下2个字段进行 or  查询
   Directory dir = FSDirectory.open( new  File( "D:\\index" ));
   IndexReader reader = DirectoryReader.open(dir);
   IndexSearcher searcher =  new  IndexSearcher(reader);
   // 选择姓名中包含张字的记录
   /*   单字段查询
    *   QueryParser parser = new QueryParser("name", new StandardAnalyzer());
        Query query = parser.parse("三");
   */
   // 选择姓名中包含张字的记录
    String[] queries = { "王四", "处" };  
          String[] fields = { "name", "department" };  
         /**
          * 这里需要注意的就是BooleanClause.Occur[]数组,它表示多个条件之间的关系,
          * BooleanClause.Occur.MUST表示and,BooleanClause.Occur.MUST_NOT表示not,BooleanClause.Occur.SHOULD表示or.
          */
          BooleanClause.Occur[] clauses = { BooleanClause.Occur.SHOULD, BooleanClause.Occur.SHOULD };  
    Query query = MultiFieldQueryParser.parse(queries, fields, clauses,  new  StandardAnalyzer());
 
   TopDocs topDocs = searcher.search(query,  2 );
   ScoreDoc[] hits = topDocs.scoreDocs;
   for  ( int  i =  0 ; i < hits.length; i++) {
    int  DocId = hits[i].doc;
    Document doc = searcher.doc(DocId);
    System.out.println(doc.get( "info_id" ) + " " +doc.get( "name" ) + " " +doc.get( "link_phone" ) + " " +doc.get( "department" ) + " " +doc.get( "id_card" ) + " " +doc.get( "user_id" ) + "" );  // 张立
   }
  }
}


Lucene,作为一种全文搜索的辅助工具,为我们进行条件搜索,无论是像Google,Baidu之类的搜索引擎,还是论坛中的搜索功能,还是其它 C/S架构的搜索,都带来了极大的便利和比较高的效率


上面的例子中并没有考虑到数据库的增量索引,不过实现起来很简单,再给数据库添加一个字段  isindex ,默认为false或者为null即可,每次索引时都会过滤一下,把没有


原文地址:http://www.itmmd.com/201504/703.html 


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用Lucene实现对MySQL数据表的全文检索是一种可行的方案。Lucene是一套开源的全文检索和搜寻的程式库,它提供了一个简单但强大的应用程式接口,能够实现全文索引和搜寻的功能。在Java开发环境中,Lucene是一个成熟的免费开源工具,被广泛应用于信息检索领域。 全文检索是一种针对非结构化数据的检索方法,对于像磁盘上的文件、网站资源等非结构化数据,无法使用SQL语句进行查询,因此需要使用全文检索法。全文检索法将非结构化数据中的一部分信息提取出来进行组织,形成索引,然后根据索引快速定位到要查找的信息。Lucene可以实现全文检索的功能,它是Apache软件基金会支持和提供的工具包。 使用Lucene实现全文检索的流程如下: 1. 创建索引:首先获取要进行检索的文档,可以是磁盘文件或网站资源等,然后构建文档对象,包括多个域,如文件名称、文件路径、文件大小、文件内容等。接下来对文档进行分词,将分词结果创建为索引并添加到索引库中。 2. 索引搜索:创建查询对象,执行查询并渲染结果。在倒排索引词典表中查找对应搜索词的索引,然后找到索引所链接的文档。例如,搜索语法为"fileName:lucene"表示搜索文件名中包含Lucene的文档。 要使用Lucene实现全文检索,首先需要下载和配置Lucene。你可以从官方网站或其他可信的资源下载Lucene的安装包,并按照相应的指南进行配置。然后,你可以使用Lucene提供的API来实现全文检索功能,根据具体需求进行代码编写和调用。 总之,Lucene是一种强大的全文检索工具,可以帮助你在MySQL数据表中实现全文检索功能。你可以通过学习和使用Lucene的API来了解更多关于Lucene的功能和用法,并根据具体需求进行相应的实现。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [【springboot微服务】Lucence实现Mysql全文检索](https://blog.csdn.net/zhangcongyi420/article/details/129940816)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [【Lucene&Solr】Lucene实现全文检索](https://blog.csdn.net/qq_43705275/article/details/107229299)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值