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下载

猜你喜欢

转载自blog.csdn.net/u011809553/article/details/81056369