Lucene4.7+mysql5.6 中文搜尋
阿新 • • 發佈:2018-11-19
在部落格上搜索到了很多關於Lucene+mysql的demo,但是針對中文的足夠好用的卻是找得很鬧心。
最初,我找的這個連結:Lucene+mysql對數字、英文確實能夠查詢,但是輪到中文就完蛋了。
然後找到了,結合IKAnalyzer的一份demo:IKAnalyzer分詞示例 因為中文和英文不一樣,英文字身就是詞,但是中文分為字和詞,進行索引的時候,需要先分詞。這個demo確實能夠使用,但是存在兩個問題,一是使用的函式過老,二是從資料庫匯入資料進行處理的時候就失效了(原因我也不知道,也許是編碼的問題)。
最後,查詢了Field和StringFiled等方法的的區別。找到以下兩篇博文了解:
最終才發現是方法函式的鍋。
以下是我後面最後能夠成功使用的程式碼,程式碼中使用了阿里的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(); } } } } }