zoukankan      html  css  js  c++  java
  • 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 + "
    ");
                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

  • 相关阅读:
    Jzoj5417 方阵
    Jzoj5414 幸运值
    PAT甲级——A1036 Boys vs Girls
    PAT甲级——A1035 Password
    PAT甲级——A1030 Travel Plan
    PAT甲级——A1026 Table Tennis
    PAT甲级——A1022 Digital Library
    PAT甲级——A1018 Public Bike Management
    PAT甲级——A1021 Deepest Root
    PAT甲级——A1020 Tree Traversals
  • 原文地址:https://www.cnblogs.com/woshuaile/p/10518593.html
Copyright © 2011-2022 走看看