lucence搜索结合数据库进行应用
应先把数据库数据取出建立索引库并进行保存
可定时更新,也可实时更新
package cn.psw.youwenbida.provider.utils; import org.apache.lucene.analysis.TokenStream; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.document.TextField; import org.apache.lucene.index.*; import org.apache.lucene.queryparser.classic.QueryParser; 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.search.highlight.Highlighter; import org.apache.lucene.search.highlight.QueryScorer; import org.apache.lucene.search.highlight.SimpleHTMLFormatter; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; import org.apache.lucene.util.Version; import org.wltea.analyzer.lucene.IKAnalyzer; import java.io.File; import java.io.StringReader; import java.sql.*; import java.util.List; public class TestLucene { private static Connection conn = null; private static Statement stmt = null; private static ResultSet rs = null; // 索引保存目录 private static String indexDir = "G:\\lucence"; private static final String URL = "jdbc:mysql://127.0.0.1:3306/youwenbida?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false"; private static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver"; private static final String USER_NAME = "root"; private static final String PASSWORD = "123456"; 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; } public static void main(String[] args) throws Exception { String sql = "select pid, ptitle from problem"; try { stmt = getConnection().createStatement(); rs = stmt.executeQuery(sql); // 给数据库创建索引,此处执行一次,不要每次运行都创建索引 // 以后数据有更新可以后台调用更新索引 createIndex(rs); // 显示查询结果 showSearchResults("故事专心球"); } catch (Exception e) { e.printStackTrace(); } } private static void showSearchResults(String keyword) throws Exception { //创建或打开索引目录 Directory directory = FSDirectory.open(new File(indexDir)); IKAnalyzer analyzer = new IKAnalyzer(); //创建indexReader对象 IndexReader indexReader = DirectoryReader.open(directory); //创建indexSearcher对象 IndexSearcher indexSearcher = new IndexSearcher(indexReader); //创建查询 Query query = new QueryParser(Version.LUCENE_47,"title", analyzer).parse(keyword); //执行查询 //参数一 查询对象 参数二 查询结果返回的最大值 TopDocs topDocs = indexSearcher.search(query, 10); System.out.println("找到 " + topDocs.scoreDocs.length + " 个命中."); System.out.println("序号\t匹配度得分\t结果"); SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter("<span style='color:red'>", "</span>"); Highlighter highlighter = new Highlighter(simpleHTMLFormatter, new QueryScorer(query)); for (int i = 0; i < topDocs.scoreDocs.length; ++i) { ScoreDoc scoreDoc= topDocs.scoreDocs[i]; int docId = scoreDoc.doc; Document d = indexSearcher.doc(docId); List<IndexableField> fields = d.getFields(); System.out.print((i + 1)); System.out.print("\t" + scoreDoc.score); TokenStream tokenStream = analyzer.tokenStream(fields.get(1).name(), new StringReader(d.get(fields.get(1).name()))); String fieldContent = highlighter.getBestFragment(tokenStream, d.get(fields.get(1).name())); System.out.print("\t" + fieldContent); System.out.println("<br>"); } indexReader.close(); } private static void createIndex(ResultSet rs) throws Exception { Directory directory = FSDirectory.open(new File(indexDir)); IKAnalyzer analyzer = new IKAnalyzer(); //创建indexwriterConfig(参数分词器) IndexWriterConfig indexWriterConfig = new IndexWriterConfig(Version.LUCENE_47,analyzer); //创建indexwrite 对象(文件对象,索引配置对象) IndexWriter indexWriter = new IndexWriter(directory,indexWriterConfig); indexWriter.deleteAll(); // 遍历ResultSet创建索引 while (rs.next()) { // 创建document并添加field Document doc = new Document(); doc.add(new TextField("id", rs.getString("pid"), Field.Store.YES)); doc.add(new TextField("title", rs.getString("ptitle"), Field.Store.YES)); // 将doc添加到索引中 System.out.println(rs.getString("ptitle")); indexWriter.addDocument(doc); } indexWriter.close(); } }