热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Lucene4.8查询Mysql数据,写索引文件到本地——应用实例

1.建立mysql数据库连接packagecn.wqb.lucene;importjava.sql.Connection;importjava.sql.DriverManager;import

1.建立mysql数据库连接

package cn.wqb.lucene;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class JDBCUtils {

private static Connection cOnn= null;
private static final String url = "jdbc:mysql://localhost/project?autoRecOnnect=true&characterEncoding=utf8";
private static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
private static final String PASSWORD = "root";
private static final String USER_NAME = "root";

public static Connection getConnection(){
try {
Class.forName(JDBC_DRIVER);
cOnn= DriverManager.getConnection(url,USER_NAME,PASSWORD);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
}

 

2.设计UI实体

package cn.wqb.lucene;

/**
* 显示 实体Bean
* @author qing
*
*/
public class ShowsBean {
private String id;
private String title;
private String sell_point;
private double price;

public String getTitle() {
return title;
}

public void setTitle(String title) {
this.title = title;
}

public String getSell_point() {
return sell_point;
}

public void setSell_point(String sell_point) {
this.sell_point = sell_point;
}

public double getPrice() {
return price;
}

public void setPrice(double price) {
this.price = price;
}

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

}

 

3.建立 查询的常量

package cn.wqb.lucene;

public class SearchBean {
public static final String ID = "id";
public static final String TITLE = "title";
public static final String SELL_POINT = "sell_point";
public static final String PRICE = "price";
}

 

4.查询 及 写索引文件

package cn.wqb.lucene;

import java.io.File;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
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.Term;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import org.wltea.analyzer.lucene.IKAnalyzer;

public class TeamLogic {
private static Connection cOnn= null;
private static Statement stmt = null;
private static ResultSet rs = null;
private static File indexFile = null;
private static Directory directory = null;
private static Analyzer analyzer = null;
/** 索引页面缓冲 */
private int maxBufferedDocs = 500;
/** 指定索引文件存放地址 **/
private String searchDir = "c:/lucene/index03";

private static IndexSearcher indexSearcher = null;

/**
* 获取数据库数据
*
* @return ResultSet
* @throws Exception
*/
public List getResult(String queryStr) throws Exception {
List result = null;
cOnn= JDBCUtils.getConnection();
if (cOnn== null) {
throw new Exception("数据库连接失败!");
}
String sql = "select id,title,sell_point,price from tb_item";
try {
stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
this.createIndex(rs); // 给数据库创建索引,此处执行一次,不要每次运行都创建索引,以后数据有更新可以后台调用更新索引
TopDocs topDocs = this.search(queryStr);
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
result = this.addHits2List(scoreDocs);
} catch (Exception e) {
e.printStackTrace();
throw new Exception("数据库查询sql出错! sql : " + sql);
} finally {
if (rs != null)
rs.close();
if (stmt != null)
stmt.close();
if (conn != null)
conn.close();
}
return result;
}

/**
* 为数据库检索数据创建索引
*
* @param rs
* @throws Exception
*/
private void createIndex(ResultSet rs) throws Exception {
IndexWriter indexWriter = null;

try {
// 根据给定的地址,查找文件
indexFile = new File(searchDir);
if (!indexFile.exists()) {
// 若文件不存在,则新建该文件
indexFile.mkdir();
}

directory = FSDirectory.open(indexFile);// 文件写入磁盘
// 中文分词器
analyzer = new IKAnalyzer();
IndexWriterConfig cOnf= new IndexWriterConfig(Version.LUCENE_48,
analyzer);
indexWriter = new IndexWriter(directory, conf);
// 最大缓存文档数
conf.setMaxBufferedDocs(maxBufferedDocs);
// 将field写入document
Document doc = null;
while (rs.next()) {
doc = new Document();
StringField id = new StringField("id",
rs.getString("id"),Store.YES);

StringField price = new StringField("price",
rs.getString("price"), Store.YES);

TextField title = new TextField("title",
rs.getString("title") == null ? ""
: rs.getString("title"), Store.YES);

TextField sell_point = new TextField("sell_point",
rs.getString("sell_point") == null ? ""
: rs.getString("sell_point"), Store.YES);

doc.add(id);
doc.add(title);
doc.add(price);
doc.add(sell_point);
// 将document写入文件
indexWriter.addDocument(doc);
}
// 关闭 一次写操作
indexWriter.close();
} catch (Exception e) {
e.printStackTrace();
}
}

/**
* 搜索索引
*
* @param queryStr
* @return
* @throws Exception
*/
private TopDocs search(String queryStr) throws Exception {
// int hitsPerPage = 10;
if (directory == null) {
directory = FSDirectory.open(indexFile);
}
IndexReader indexReader = DirectoryReader.open(directory);
// 创建搜索类
indexSearcher = new IndexSearcher(indexReader);
// 针对BeanField.TITLE进行的查询
// 搜索字段queryStr
Term term = new Term(SearchBean.TITLE, queryStr);
TermQuery termQuery = new TermQuery(term);
// 中文分词器
analyzer = new IKAnalyzer();
// 执行搜索
TopDocs topDocs = indexSearcher.search(termQuery, 1000);// 查询前多少条满足条件的数据
return topDocs;

}

/**
* 返回结果并添加到List中
*
* @param scoreDocs
* @return
* @throws Exception
*/
private List addHits2List(ScoreDoc[] scoreDocs)
throws Exception {
List listBean = new ArrayList();
ShowsBean bean = null;
for (int i = 0; i int docId = scoreDocs[i].doc;
Document doc = indexSearcher.doc(docId);
bean = new ShowsBean();
bean.setId(doc.get("id"));
bean.setTitle(doc.get("title"));
bean.setPrice(Double.valueOf(doc.get("price")));
bean.setSell_point(doc.get("sell_point"));
listBean.add(bean);
}
return listBean;
}
}

 

5.业务调配

package cn.wqb.lucene;

import java.util.List;

public class IndexForMysql {

// 建立与mysql的连接
public void useSearchLogin() {
TeamLogic logic = new TeamLogic();
try {
Long startTime = System.currentTimeMillis();
List result = logic.getResult("小米");
int i = 0;
for (ShowsBean bean : result) {
if (i == 10)
break;
System.out.println("bean.name :" + bean.getClass().getName()
+ " bean.id: " + bean.getId() + " bean.getTitle: "
+ bean.getTitle() + " bean.getSell_point: "
+ bean.getSell_point() + " bean.getPrice :"
+ bean.getPrice());
i++;
}

System.out.println("searchBean.result.size : " + result.size());
Long endTime = System.currentTimeMillis();
System.out.println("查询所花费的时间为:" + (endTime - startTime) / 1000);
} catch (Exception e) {
e.printStackTrace();
System.out.println(e.getMessage());
}

}
}

 

6.执行测试

package cn.wqb.lucene;

import org.junit.Test;

public class TestLuceneForMysql {

@Test
public void testSearchLogic(){
IndexForMysql instance = new IndexForMysql();
instance.useSearchLogin();
}

}

 


推荐阅读
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
author-avatar
亲家你要干啥
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有