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 ListCreateData() { 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