Lucene学习之一:使用lucene为数据库表创建索引,并按关键字查询
最近项目中要用到模糊查询,开始研究lucene,期间走了好多弯路,总算实现了一个简单的demo。
使用的lucene jar包是3.6版本.
一:建立数据库表,并加上测试数据。数据库表:UserInfo
二:新建java project,并引入lucene jar包。http://lucene.apache.org/
三:为数据库表建立索引及利用索引查数据:
import java.io.File;
import java.io.IOException;
import java.sql.Connection;
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.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.QueryParser;
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.util.Version;
import org.apache.lucene.store.SimpleFSDirectory;
import com.test.dbc.DBConnection;
public class MakeTableIndex {
public static void main(String[] args) throws IOException, SQLException {
String indexDir = "d:\\lucene\\index";
Connection conn;
DBConnection conn1 = new DBConnection();
conn = conn1.getConnection();
PreparedStatement pstmt = conn
.prepareStatement("SELECT * FROM UserInfo");
ResultSet rs = pstmt.executeQuery();
// 为表字段建立索引
Directory dir = new SimpleFSDirectory(new File(indexDir));
// 分词
Analyzer luceneAnalyzer = new StandardAnalyzer(Version.LUCENE_36);
IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_36,
luceneAnalyzer);
iwc.setOpenMode(OpenMode.CREATE);
IndexWriter indexWriter = new IndexWriter(dir, iwc);
while (rs.next()) {
System.out.println("username***" + rs.getString(2));
Document doc = new Document();
doc.add(new Field("ID", rs.getString(1), Field.Store.YES,
Field.Index.ANALYZED));
doc.add(new Field("UserName", rs.getString(2), Field.Store.YES,
Field.Index.ANALYZED));
doc.add(new Field("Hobby", rs.getString(5), Field.Store.YES,
Field.Index.ANALYZED));
indexWriter.addDocument(doc);
}
System.out.println("numDocs" + indexWriter.numDocs());
indexWriter.close();
try {
search();
} catch (Exception e) {
// TODO: handle exception
System.out.println(e);
}
}
// ------------------Search
public static void search() throws Exception {
String dirPathString="d:\\lucene\\index";
System.out.println(dirPathString);
Directory dir = new SimpleFSDirectory(new File(dirPathString));//查询分析器 路径
IndexReader reader = IndexReader.open(dir);
IndexSearcher searcher = new IndexSearcher(reader);
QueryParser parser = new QueryParser(Version.LUCENE_35, "UserName", new StandardAnalyzer(Version.LUCENE_36));
Query q = parser.parse("张丽");
TopDocs tds = searcher.search(q, 5);
ScoreDoc[] sds = tds.scoreDocs;
for (ScoreDoc sd : sds) {
System.out.println(sd.score);
int docName = sd.doc;
Document doc = searcher.doc(docName);
String UserName = doc.get("UserName");
String Hobby = doc.get("Hobby");
System.out.println("UserName:"+UserName+"---Hobby:"+Hobby);
}
}
}
package com.test.dbc; import java.sql.Connection;
import java.sql.DriverManager; public class DBConnection {
public static final String DBDRIVER= "com.microsoft.sqlserver.jdbc.SQLServerDriver"; ;
public static final String DBURL = "jdbc:sqlserver://localhost:1433; DatabaseName=Wang;" ;
public static final String DBUSER = "sa" ;
public static final String DBPASS = "sa" ;
private Connection conn = null ;
public DBConnection(){ //在构造方法中进行数据库连接
try{
Class.forName(DBDRIVER) ; //加载驱动程序
conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS) ;
}catch(Exception e){
e.printStackTrace() ;
}
}
public Connection getConnection(){ //取得数据库连接
System.out.println("数据库链接");
return this.conn ;
}
public void close(){
if(this.conn!=null){ //数据库关闭操作,避免空指针异常。
try{
this.conn.close() ;
}catch(Exception e){}
}
}
}
有几点问题需要注意:
1.建立索引的分词器和查询用的分词器必须一致
2.建立索引的字段名和查询的字段名需保持一致,才能找到结果
个人认为,lucene查询相比在数据库里查询表只是多了建立索引这一步,达到的目的都是从数据库了检索出我们需要的数据。
以上仅代表个人观点,欢迎大家拍砖
Lucene学习之一:使用lucene为数据库表创建索引,并按关键字查询的更多相关文章
- sql2005数据库置疑修复断电崩溃索引损坏 数据库索引错误修复/数据库表损坏/索引损坏/系统表混乱等问题修复
sql2005数据库置疑修复断电崩溃索引损坏 数据库索引错误修复/数据库表损坏/索引损坏/系统表混乱等问题修复 客 户 名 称 济南某电子商务公司 数 据 类 型 SQL2005数据库 故 障 检 测 ...
- SOLR对多个(关联)表创建索引
又两天没写博客,关于SOLR的东西,写了一周了还没写完我也是醉了,毕竟会的东西真不多,周四晚上加班没写,周五晚上公司同事聚会也没写,今天在家,还是把最后的一点写完吧,我会的剩下的也就是一个对多个表创建 ...
- Lucene学习之四:Lucene的索引文件格式(1)
本文转载自:http://www.cnblogs.com/forfuture1978/archive/2009/12/14/1623597.html Lucene的索引里面存了些什么,如何存放的,也即 ...
- django学习-10.django连接mysql数据库和创建数据表
1.django模型 Django对各种数据库提供了很好的支持,包括:PostgreSQL.MySQL.SQLite.Oracle. Django为这些数据库提供了统一的调用API. 我们可以根据自己 ...
- 使用Lucene对预处理后的文档进行创建索引(可执行)
时间: 2015/3/18 杨鑫newlife 对于文档的预处理后.就要開始使用Lucene来处理相关的内容了. 这里使用的Lucene的过程例如以下: 首先要为处理对象机那里索引 二是构建查询对象 ...
- node.js评论列表和添加购物车数据库表创建
2.1:评论列表--发表评论 用户点击新闻列表某一条新闻,看到新闻详细发表评论 -用户输入评论内容 -发表评论 [将用户评论内容保存数据库 xz_comment] 2.2:评论列表--发表评论-开发评 ...
- 026 SSM综合练习02--数据后台管理系统--数据库表创建及SSM环境搭建
1.数据库准备 本项目我们Oracle数据库,Oracle 为每个项目创建单独user,oracle数据表存放在表空间下,每个用户有独立表空间. (1)采用数据库管理员账号:SYSTEM,再配合数据库 ...
- 高性能可扩展mysql 笔记(一)数据库表、索引、SQL语句设计规范
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 项目说明:该笔记的背景为电商平台项目,电商项目由于其高并发.多线程.高耗能等特性,在众多的项目类型中涉及 ...
- Oracle学习笔记之六(DDL:表、索引、视图、同义词、序列操作相关SQL)
下面这些基本的SQL语句应该熟悉,能够灵活运用.最好在不查资料的情况下,能够写出如下的任何代码. 1. 数据表操作相关 --创建表 create table STUDENTS( STUNO ) not ...
随机推荐
- 2016年4月面试题(Unity)
一. C#中值类型和引用类型的区别? A: 值类型的数据存储在内存的栈中:引用类型的数据存储在内存的堆中,而内存单元中只存放堆中对象的地址. 值类型存取速度快,引用类型存取速度慢 值类型表示实际数据, ...
- 优先队列 :Priority Queue
PriorityQueue是从JDK1.5开始提供的新的数据结构接口,它是一种基于优先级堆的极大优先级队列.优先级队列是不同于先进先出队列的另一种队列. 每次从队列中取出的是具有最高优先权的元素.如果 ...
- 《C标准库》——之<string.h>
<string.h>里的字符串操作函数是经常要用到的,因此阅读了源码后自己实现了一些: 拷贝函数 void * Mymemcpy(void * sDst, const void * sSr ...
- PHPMyAdmin弱口令猜解【Python脚本】
PHPMyAdmin弱口令猜解 测试截图: 代码片段 #! /usr/bin/env python # _*_ coding:utf-8 _*_ import requests import time ...
- CentOS上yum安装JDK
转: http://blog.csdn.net/onepiecehuiyu/article/details/17189571
- MongoDB学习笔记六:进阶指南
[数据库命令]『命令的工作原理』MongoDB中的命令其实是作为一种特殊类型的查询来实现的,这些查询针对$cmd集合来执行.runCommand仅仅是接受命令文档,执行等价查询,因此,> db. ...
- linux 并发 RCU
What is RCU, Fundamentally? https://lwn.net/Articles/262464/ If you can fill the unforgiving secondw ...
- Oracle学习笔记(二)
2.Oracle用户管理 (1)创建用户:create user 用户名 identified by 密码(需要dba权限); sql>create user yzw identified by ...
- oracle数据库从入门到精通
oracle产品线围绕企业开发平台的企业开发平台四大组件:unix,weblogic中间件,java编程语言,oracle数据库oracle 开发主要分两类数据库管理:dba数据库编程:分两部分 ...
- 第一章 数据库概述、MySQL的安装和配置
第一章 数据库概述.MySQL的安装和配置 1.为什么要使用数据库 最早是纸质文件来存储数据 缺点:不易保存,占用空间大 计算机出现以后,采用软件来进行保存(excel) 缺点:容易损坏 文件 ...