1. 程式人生 > >Lucene4.7+mysql5.6 中文搜尋

Lucene4.7+mysql5.6 中文搜尋

在部落格上搜索到了很多關於Lucene+mysql的demo,但是針對中文的足夠好用的卻是找得很鬧心。

最初,我找的這個連結:Lucene+mysql對數字、英文確實能夠查詢,但是輪到中文就完蛋了。

然後找到了,結合IKAnalyzer的一份demo:IKAnalyzer分詞示例 因為中文和英文不一樣,英文字身就是詞,但是中文分為字和詞,進行索引的時候,需要先分詞。這個demo確實能夠使用,但是存在兩個問題,一是使用的函式過老,二是從資料庫匯入資料進行處理的時候就失效了(原因我也不知道,也許是編碼的問題)。

最後,查詢了Field和StringFiled等方法的的區別。找到以下兩篇博文了解:

各種Field欄位說明 

TextField與StringField對比

最終才發現是方法函式的鍋。

以下是我後面最後能夠成功使用的程式碼,程式碼中使用了阿里的Druid進行資料庫連線,使用了Dbutils來查詢資料。將這些修改掉就基本能夠直接使用了。

public class LuceneTest3 {
	private static QueryRunner qr = new QueryRunner(DruidUtil.getDataSource());	
	public static void main(String[] args) throws IOException, SQLException {
        Analyzer analyzer = new IKAnalyzer(true);
        MMapDirectory directory = new MMapDirectory(new File("G:\\index01"));
       // RAMDirectory directory = new RAMDirectory();
        IndexWriterConfig writerConfig = new IndexWriterConfig(Version.LUCENE_47, analyzer);
        IndexWriter indexWriter = new IndexWriter(directory, writerConfig);       
		Document document = null;
		String sqlQuery = "select * from news_corpus limit 300";
		List<NewsCorpus> list = qr.query(sqlQuery, new BeanListHandler<NewsCorpus>(NewsCorpus.class));
		for (NewsCorpus terrorismdb_zh : list) {
			document = new Document();
			document.add(new TextField("id",terrorismdb_zh.getId(),Field.Store.YES));
			document.add(new TextField("title",terrorismdb_zh.getTitle(),Field.Store.YES));
			document.add(new TextField("des",terrorismdb_zh.getDes(),Field.Store.YES));
			document.add(new TextField("content",terrorismdb_zh.getContent(),Field.Store.YES));
			indexWriter.addDocument(document);
		} 
		indexWriter.close();
        //搜尋
        IndexReader indexReader = DirectoryReader.open(directory);
        IndexSearcher searcher = new IndexSearcher(indexReader);
        String fieldName = "title";
        String request = "中國";
        QueryParser parser = new QueryParser(Version.LUCENE_47, new String(fieldName.getBytes(),"UTF-8"), analyzer);
        parser.setDefaultOperator(QueryParser.AND_OPERATOR);
        try {
			Query query = parser.parse(new String(request.getBytes(),"UTF-8"));
			TopDocs topDocs = searcher.search(query, 20);
			System.out.println("命中數:"+topDocs.totalHits);
			ScoreDoc[] docs = topDocs.scoreDocs;
			for(ScoreDoc doc : docs){
				Document d = searcher.doc(doc.doc);
				System.out.println("id:"+d.get("id"));
				System.out.println("標題:"+d.get("title"));
				System.out.println("簡介:"+d.get("des"));
				System.out.println("內容:"+d.get("content"));
			}
		} catch (ParseException e) {
			e.printStackTrace();
		}finally{
			if(indexReader != null){
				try{
					indexReader.close();
				}catch (IOException e) {
					e.printStackTrace();
				}
			}			
			if(directory != null){
				try{
					directory.close();
				}catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
        
	}		
}

相關jar下載