博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
lucene 结合数据库做搜索
阅读量:7219 次
发布时间:2019-06-29

本文共 7611 字,大约阅读时间需要 25 分钟。

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
CreateData() { Connection conn=ConnectionUtil.getConn(); List
list=new ArrayList
(); 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
list=CreateData(); for(int i=0;i
 

  //以上为构建索引代码 

 

 

///查询代码

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

转载于:https://www.cnblogs.com/woshuaile/p/10518593.html

你可能感兴趣的文章
数据库9:联结表 高级联结 组合查询 全文本搜索
查看>>
redis:Sentinel高可用方案
查看>>
Linux 系统故障排除
查看>>
我的友情链接
查看>>
Mysql汉子转拼音
查看>>
设置MySQL数据库超时
查看>>
一致性hash算法
查看>>
lua + redis 的去重队列
查看>>
web负载均衡(ipvsadm)(未成)
查看>>
抓取存储quota超过80%的users
查看>>
C语言经典算法100例
查看>>
速成CAD版本转换的教程
查看>>
CAD文件图纸过大,该怎么解决?
查看>>
Spring aop 切不进去原因。。
查看>>
PHP获取客户端IP
查看>>
php开发APP接口-封装通信接口改进版
查看>>
Android系统性能演变历程
查看>>
OSChina 周三乱弹 —— 打醒精神去瞌睡
查看>>
SSH 密钥登录linux
查看>>
你必须掌握的 21 个 Java 核心技术!
查看>>