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只是一个全文检索开发包(只是帮我们 ...
随机推荐
- WPF 10天修炼 第八天 - 形状、画刷和变换
图形 在WPF中使用绘图最简单的就是使用Shape类.Shape类继承自FrameworkElement,是一个专门用来绘图的类.Shape类中年派生的类有直线.矩形.多边形和圆形等. System. ...
- 收藏vue技术内幕
http://hcysun.me/vue-design/art/7vue-reactive.html#observer-%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0
- Linux中Too many open files
1.ulimit –a open files一项就是默认的句柄数,最大为 65536 2.修改最大open files /etc/security/limits.conf文件中,加入以下配置: * s ...
- ASP.NET 异步返回的Action (编辑中。。。)
新学.net,最近用到了ABP框架,发现了如下代码: public override async Task<UserDto> Get(EntityDto<long> input ...
- python课程分享2-伊嬛
2.4 模块 2.4.1 模块的概念 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,使用者可以把很多函数分组,分别放到不同 ...
- 关于el-upload上传
<el-upload class="edit-input-upload" :action="config.baseUrl + '/joinus/candidate/ ...
- luoguP1131
时态同步 ...这道题我也不知道咋\(A\)的. 思路: \(anst\) 距离 \(s\) 的最长距离,\(ansp\) 某一节点到祖先所有边的权值和这些些加过的权值和 先求出到\(s\)距离最长的 ...
- Python学习笔记十一
1. 协程 并发的解决方案: 多进程 多线程 什么叫并发:看起来同时进行 如何实现并发:切换+保存状态 进程线程都是由操作系统调度的 协程:单线程下实现的并发,应用程序级别的切换, ...
- 关于haproxy
高性能负载均衡软件 haproxy 一.四层和七层负载均衡的区别: 所谓的四层就是OSI参考模型中的第四层,四层负载均衡也称为四层交换机,他主要是通过分析IP层及TCP/UDP层的流量实现的基于IP加 ...
- python正则表达式判断素数【厉害了】
参考: https://www.cnblogs.com/imjustice/p/check_prime_by_using_regular_expression.html for i in range( ...