如何用Lucene索引数据库

2023-07-06   


Lucene一个常见的用例是在一个或者多个数据库表进行全文检索。 虽然MySql有全文检索的功能,但是如果字段和数据量增加,MySql的性能会减低很快。
   映射数据到Lucene
   通常情况下最需要解决的问题是怎么把你数据库的数据描述到Lucene里面,最可能的解决方法法就是把你的数据表放到平面的Lucence Document对象里面。
   用伪代码表示:
   String sql = “select id, firstname, lastname, phone, email from person”;
   ResultSet rs = stmt.executeQuery(sql);
   while (rs.next())
   Document doc = new Document();
   doc.add(new Field(”id”, rs,getString(”firstname”), Field.Store.YES, Field.Index.UN_TOKENIZED));
   doc.add(new Field(”firstname”, rs,getString(”firstname”), Field.Store.YES, Field.Index.TOKENIZED));
   // … repeat for each column in result set
   writer.addDocument(doc);
  
   显示搜索结果
   当显示搜索结果给用户时,你有两个选择:
   1.因为你的Table已经扁平化到了Lucene里面,所以只需要用Document里面的Field.因为Lucene也非常快,这样会大大减低你的数据库的压力。
   2.如果你要显示另外的数据到你的搜索结果页,你只需要在Hits里面收集他们的ID,然后从数据库去数据再根据结果组装搜索结果页。
   要搜索的东西
   以上列出的方式都是假设把整个结果集放到内存里面,这样在数据集大的话会很容易造成问题,你需要在你的SQL里面做一些分页或者offset
   你还需要在你的结果集里面做一个try/catch,这样当添加一个Document出错的时候不会影响整个过程。
   通常情况下可以把所有的field放到同一个”Contents” field然后只搜索这一个字段,但是需要保留这些field这样可以按field检索。
   如果你需要检索多个table
   通常最好能用不同的索引来搜索不同类型的数据,而不是把他们加到同一个index然后根据类型来区分。
   原因:
   可以更简单的维护操作。如果你只需要对这个表进行一个批处理的update,你只需要重建特定的索引而不是所有的索引。


相关内容:

  1. 介绍下Lucene建立索引的过程
  2. 请解释一下webService? 如何用.net实现webService
  3. 介绍一下SQL Server里面的索引视图
  4. 怎么可以提高数据库查询数据的速度
  5. 为数据库创建索引都需要注意些什么
  6. 什么是聚集索引和非聚集索引