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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值