在博客上搜索到了很多关于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();
}
}
}
}
}