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

posted @ 2019-03-12 18:30  夏风中的Young_Uncle  阅读(932)  评论(0编辑  收藏  举报