lucene 结合数据库做搜索
package jdbc; import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.UUID; public class ConnectionUtil {
private static String driver="com.mysql.cj.jdbc.Driver";
private static String url="jdbc:mysql://localhost:3306/solrdb?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true";
private static String user="root";
private static String password="123456"; public static Connection getConn() {
try {
Class.forName(driver);
Connection conn=DriverManager.getConnection(url, user, password);
return conn;
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
} public void CreateData() {
Connection conn=getConn();
try {
PreparedStatement ps=conn.prepareStatement
("insert into paper (id,name,title,author,content) values (?,?,?,?,?)");
for(int i=0;i<100;i++) {
ps.setString(1,UUID.randomUUID().toString());
ps.setString(2,"专家233"+i);
ps.setString(3,"杭州九次人大会议"+i);
ps.setString(4,"记者");
ps.setString(5, "北京时间2019-2-13日,杭州市举行了人大代表会议,会议决定现在...."+i);
ps.executeUpdate();
}
System.out.println("执行完毕");
} catch (SQLException e) { e.printStackTrace();
}
} public static void main(String[] args) {
ConnectionUtil util=new ConnectionUtil();
util.CreateData();
}
} //本类只为造数据
package jdbc; import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List; 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.document.FieldType;
import org.apache.lucene.index.IndexOptions;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.IndexWriterConfig.OpenMode;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory; /**
* Lucene 创建索引
* @author moonxy
*
*/
public class CreateIndexForMysql { public static List<Paper> CreateData() {
Connection conn=ConnectionUtil.getConn();
List<Paper>list=new ArrayList<Paper>();
try {
PreparedStatement ps=conn.prepareStatement
("select * from paper ");
ResultSet rs=ps.executeQuery();
//4.处理数据库的返回结果(使用ResultSet类)
while(rs.next()){
Paper paper=new Paper(rs.getString("id"),
rs.getString("name"), rs.getString("title"),
rs.getString("author"),rs.getString("content"));
list.add(paper);
}
System.out.println("执行完毕");
return list;
} catch (SQLException e) { e.printStackTrace();
}
return null;
} public static void main(String[] args) { // 创建3个News对象 // 开始时间
Date start = new Date();
System.out.println("**********开始创建索引**********");
// 创建IK分词器
Analyzer analyzer = new StandardAnalyzer();
IndexWriterConfig icw = new IndexWriterConfig(analyzer);
// CREATE 表示先清空索引再重新创建
icw.setOpenMode(OpenMode.CREATE);
Directory dir = null;
IndexWriter inWriter = null;
// 存储索引的目录
Path indexPath = Paths.get("indexdir"); try {
if (!Files.isReadable(indexPath)) {
System.out.println("索引目录 '" + indexPath.toAbsolutePath() + "' 不存在或者不可读,请检查");
System.exit(1);
}
dir = FSDirectory.open(indexPath);
inWriter = new IndexWriter(dir, icw); //自己设置字段索引类型
// 设置ID索引并存储
FieldType idType = new FieldType();
idType.setIndexOptions(IndexOptions.DOCS);
idType.setStored(true); // 设置标题索引文档、词项频率、位移信息和偏移量,存储并词条化
FieldType titleType = new FieldType();
titleType.setIndexOptions(IndexOptions.DOCS_AND_FREQS_AND_POSITIONS_AND_OFFSETS);
titleType.setStored(true);
titleType.setTokenized(true); FieldType contentType = new FieldType();
contentType.setIndexOptions(IndexOptions.DOCS_AND_FREQS_AND_POSITIONS_AND_OFFSETS);
contentType.setStored(true);
contentType.setTokenized(true);
contentType.setStoreTermVectors(true);
contentType.setStoreTermVectorPositions(true);
contentType.setStoreTermVectorOffsets(true);
List<Paper>list=CreateData(); for(int i=0;i<list.size();i++) {
Document doc = new Document();
doc.add(new Field("id", list.get(i).getId(), idType));
doc.add(new Field("title", list.get(i).getTitle(), titleType));
inWriter.addDocument(doc);
} //
// doc1.add(new Field("id", String.valueOf(news1.getId()), idType));
// doc1.add(new Field("title", news1.getTitle(), titleType));
// doc1.add(new Field("content", news1.getContent(), contentType));
// doc1.add(new IntPoint("reply", news1.getReply()));
// doc1.add(new StoredField("reply_display", news1.getReply()));
//
// Document doc2 = new Document();
// doc2.add(new Field("id", String.valueOf(news2.getId()), idType));
// doc2.add(new Field("title", news2.getTitle(), titleType));
// doc2.add(new Field("content", news2.getContent(), contentType));
// doc2.add(new IntPoint("reply", news2.getReply()));
// doc2.add(new StoredField("reply_display", news2.getReply()));
//
// Document doc3 = new Document();
// doc3.add(new Field("id", String.valueOf(news3.getId()), idType));
// doc3.add(new Field("title", news3.getTitle(), titleType));
// doc3.add(new Field("content", news3.getContent(), contentType));
// doc3.add(new IntPoint("reply", news3.getReply()));
// doc3.add(new StoredField("reply_display", news3.getReply())); // inWriter.addDocument(doc1);
// inWriter.addDocument(doc2);
// inWriter.addDocument(doc3); inWriter.commit(); inWriter.close();
dir.close(); } catch (IOException e) {
e.printStackTrace();
}
Date end = new Date();
System.out.println("索引文档用时:" + (end.getTime() - start.getTime()) + " milliseconds");
System.out.println("**********索引创建完成**********");
}
}
//以上为构建索引代码
///查询代码
package query; import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.queryparser.classic.QueryParser.Operator;
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; /**
* 单域搜索
* @author moonxy
*
*/
public class QueryParseTest { public static void main(String[] args) throws ParseException, IOException {
// 搜索单个字段
String field = "title";
// 搜索多个字段时使用数组
//String[] fields = { "title", "content" }; Path indexPath = Paths.get("indexdir");
Directory dir = FSDirectory.open(indexPath);
IndexReader reader = DirectoryReader.open(dir);
IndexSearcher searcher = new IndexSearcher(reader);
Analyzer analyzer = new StandardAnalyzer();//最细粒度分词
QueryParser parser = new QueryParser(field, analyzer); // 多域搜索
//MultiFieldQueryParser multiParser = new MultiFieldQueryParser(fields, analyzer); // 关键字同时成立使用 AND, 默认是 OR
parser.setDefaultOperator(Operator.AND);
// 查询语句
// Query query = parser.parse("农村学生");//查询关键词
Query query = parser.parse("次人");//查询关键词
System.out.println("Query:" + query.toString()); // 返回前10条
TopDocs tds = searcher.search(query, 100);
for (ScoreDoc sd : tds.scoreDocs) {
// Explanation explanation = searcher.explain(query, sd.doc);
// System.out.println("explain:" + explanation + "\n");
Document doc = searcher.doc(sd.doc);
// System.out.println("DocID:" + sd.doc);
// System.out.println("id:" + doc.get("id"));
System.out.println("title:" + doc.get("title"));
// System.out.println("content:" + doc.get("content"));
// System.out.println("文档评分:" + sd.score);
}
dir.close();
reader.close();
}
}
注意我用的是MySQL 8.0 其他版本的自行更改对应的driverClass url
lucene 结合数据库做搜索的更多相关文章
- Lucene.net站内搜索—6、站内搜索第二版
目录 Lucene.net站内搜索—1.SEO优化 Lucene.net站内搜索—2.Lucene.Net简介和分词Lucene.net站内搜索—3.最简单搜索引擎代码Lucene.net站内搜索—4 ...
- Lucene.net站内搜索—4、搜索引擎第一版技术储备(简单介绍Log4Net、生产者消费者模式)
目录 Lucene.net站内搜索—1.SEO优化 Lucene.net站内搜索—2.Lucene.Net简介和分词Lucene.net站内搜索—3.最简单搜索引擎代码Lucene.net站内搜索—4 ...
- Lucene.net站内搜索—3、最简单搜索引擎代码
目录 Lucene.net站内搜索—1.SEO优化 Lucene.net站内搜索—2.Lucene.Net简介和分词Lucene.net站内搜索—3.最简单搜索引擎代码Lucene.net站内搜索—4 ...
- Lucene.net站内搜索—2、Lucene.Net简介和分词
目录 Lucene.net站内搜索—1.SEO优化 Lucene.net站内搜索—2.Lucene.Net简介和分词Lucene.net站内搜索—3.最简单搜索引擎代码Lucene.net站内搜索—4 ...
- Lucene.net站内搜索—1、SEO优化
目录 Lucene.net站内搜索—1.SEO优化 Lucene.net站内搜索—2.Lucene.Net简介和分词Lucene.net站内搜索—3.最简单搜索引擎代码Lucene.net站内搜索—4 ...
- 使用Lucene.net提升网站搜索速度整合记录
1.随着网站数据量达到500万条的时候,发现SQL数据库如果使用LIKE语句来查询,总是占用CPU很忙,不管怎么优化,速度还是上不来; 2.经过网上收集资料,HUBBLE.net目前虽然做得不错,但需 ...
- Lucene5.5.4入门以及基于Lucene实现博客搜索功能
前言 一直以来个人博客的搜索功能很蹩脚,只是自己简单用数据库的like %keyword%来实现的,所以导致经常搜不到想要找的内容,而且高亮显示.摘要截取等也不好实现,所以决定采用Lucene改写博客 ...
- Lucene.net站内搜索—5、搜索引擎第一版实现
目录 Lucene.net站内搜索—1.SEO优化 Lucene.net站内搜索—2.Lucene.Net简介和分词Lucene.net站内搜索—3.最简单搜索引擎代码Lucene.net站内搜索—4 ...
- Lucene.Net 站内搜索
Lucene.Net 站内搜索 一 全文检索: like查询是全表扫描(为性能杀手)Lucene.Net搜索引擎,开源,而sql搜索引擎是收费的Lucene.Net只是一个全文检索开发包(只是帮我们 ...
随机推荐
- oracle 计算机改名后监听无法启动
oracle改计算机名后,简单办法是利用oracle自带监听配置重新配置一下,或者修改host.listner.ora.tnsname.ora.我改了没起作用,原来是因为加入了域,计算机名字要全名的.
- MariaDB存储过程笔记
FECTH INTO 字段名不能与 CURSOR FOR 中select字段名一致,否则FETCH出的值均为空. DECLARE 字段名不能与 CURSOR FOR 中select语句内where条件 ...
- Laravel-google-authenticator--Google验证码
开发前的准备 安装Laravel 安装二维码生成器QrCode,没有安装也可以,接下来会安装 安装拓展 1.运行如下代码安装拓展包: composer require "earnp/lara ...
- FreeRTOS如何结束和重新启动调度程序
大多数主机或桌面系统(比如Linux,Mac或Windows)都有一个正常的用例,你可以在早上启动操作系统,然后在晚上关闭它,然后你就离开机器.嵌入式系统是不同的:他们没有参加,他们应该“永远”运行. ...
- JS中定义对象和集合
在js中定义对象: 方式一: var obj = {}; obj['a']=1; obj['b']=2; 方式二: var obj=new Object(); obj.a=1; obj.b=2; 在j ...
- 04-HTTP协议和静态Web服务器
一.HTTP协议(HyperText Transfer Protocol) 超文本传输协议,超文本是超级文本的缩写,是指超越文本限制或者超链接,比如:图片.音乐.视频.超链接等等都属于超文本. ...
- linux文件删除原理
文件删除的原理 linux的文件名是存在父目录的block里面的,并指向这个文件的inode节点,这个文件的inode节点在标记指向存放这个文件的block的数据块.我们删除文件,实际上不是清除ino ...
- js 实现控制点击事件在特定的毫秒内 只允许点击一次(防止重复点击)
代码 第一种方法 var forbidRepeartClick = (function(){ var instance = null; var canClick = true; function Bu ...
- Spark SQL UDF示例
UDF即用户自定函数,注册之后,在sql语句中使用. 基于scala-sdk-2.10.7,Spark2.0.0. package UDF_UDAF import java.util import o ...
- mybatis和hibernate中的懒加载
概念:所谓懒加载就是延时加载,延迟加载.什么时候用懒加载呢,我只能回答要用懒加载的时候就用懒加载.至于为什么要用懒加载呢,就是当我们要访问的数据量过大时,明显用缓存不太合适,因为内存容量有限 ,为了减 ...