基于数据库lucence 3.6.2多字段配合多关键字的模糊查询

12 篇文章 0 订阅
9 篇文章 0 订阅
一、首先是从数据库查询数据并添加索引

/**
* 写入数据库索引
* @param sql 查询的sql语句
* @param indexPath 保存索引的硬盘绝对路径
* @return
*/
private int createDBIndex(String sql,String indexPath){
log.info("DBIndex is creating,wait a moment!");
long start=new Date().getTime();
IndexWriter writer;
Directory directory = null;
int numberindex = 0;
try {
File indexFile = new File(indexPath);
directory = new SimpleFSDirectory(indexFile);
writer = new IndexWriter(directory, new IKAnalyzer(),true, IndexWriter.MaxFieldLength.LIMITED);
ResultSet rs = getResultSet(sql);
while (rs.next()) {
Document doc = new Document();
String PATIENT_NAME = rs.getString("PATIENT_NAME") == null?"":rs.getString("PATIENT_NAME");
String PATIENT_SEX = rs.getString("PATIENT_SEX") == null ? "-1":rs.getString("PATIENT_SEX");
String PATIENT_AGE = rs.getString("PATIENT_AGE") == null ? "0":rs.getString("PATIENT_AGE");
String SENDED_DEPT = rs.getString("SENDED_DEPT") == null ? "":rs.getString("SENDED_DEPT");
String SENDED_DOCTOR = rs.getString("SENDED_DOCTOR") == null ?"":rs.getString("SENDED_DOCTOR");
String BODY_OF_CASE = rs.getString("BODY_OF_CASE") == null ? "":rs.getString("BODY_OF_CASE");
String SENDED_HOSPITAL = rs.getString("SENDED_HOSPITAL") == null ? "":rs.getString("SENDED_HOSPITAL");
String CHECK_METHOD = rs.getString("CHECK_METHOD")==null ? "":rs.getString("CHECK_METHOD");
String REPORT_DOCNAME = rs.getString("REPORT_DOCNAME")==null ? "":rs.getString("REPORT_DOCNAME");
String AUDIT_DOCNAME = rs.getString("AUDIT_DOCNAME")==null?"":rs.getString("AUDIT_DOCNAME");
String REPORT_DATE = rs.getString("REPORT_DATE")==null?"":rs.getString("REPORT_DATE");
String POSITIVE_FLAG = rs.getString("POSITIVE_FLAG")==null?"":rs.getString("POSITIVE_FLAG");
String REPORT_DESC_TXT = rs.getString("REPORT_DESC_TXT")==null?"":rs.getString("REPORT_DESC_TXT");
String REPORT_DIAG_TXT = rs.getString("REPORT_DIAG_TXT")==null?"":rs.getString("REPORT_DIAG_TXT");
String CLINIC_DESC = rs.getString("CLINIC_DESC")==null?"":rs.getString("CLINIC_DESC");
String CLINIC_DIAG = rs.getString("CLINIC_DIAG")==null?"":rs.getString("CLINIC_DIAG");
String CLINICAL_ADVICE = rs.getString("CLINIC_ADVICE")==null?"":rs.getString("CLINIC_ADVICE");
String HOSPITAL_CARDID = rs.getString("HOSPITAL_CARDID")==null?"":rs.getString("HOSPITAL_CARDID");
String CLINIC_HOSPITALNO = rs.getString("CLINIC_HOSPITALNO")==null?"":rs.getString("CLINIC_HOSPITALNO");
String FTPPATH = rs.getString("FTPPATH")==null?"":rs.getString("FTPPATH");
String SENDED_DATE = rs.getString("SENDED_DATE")==null?"":rs.getString("SENDED_DATE");

doc.add(new Field("PATIENT_NAME", PATIENT_NAME, Field.Store.YES,Field.Index.ANALYZED));
doc.add(new Field("PATIENT_SEX", PATIENT_SEX,Field.Store.YES, Field.Index.ANALYZED));
doc.add(new Field("PATIENT_AGE", PATIENT_AGE,Field.Store.YES, Field.Index.ANALYZED));
doc.add(new Field("SENDED_DEPT", SENDED_DEPT,Field.Store.YES, Field.Index.ANALYZED));
doc.add(new Field("SENDED_DOCTOR",SENDED_DOCTOR,Field.Store.YES, Field.Index.ANALYZED));
doc.add(new Field("BODY_OF_CASE",BODY_OF_CASE,Field.Store.YES, Field.Index.ANALYZED));
doc.add(new Field("SENDED_HOSPITAL",SENDED_HOSPITAL,Field.Store.YES, Field.Index.ANALYZED));
doc.add(new Field("CHECK_METHOD", CHECK_METHOD,Field.Store.YES, Field.Index.ANALYZED));
doc.add(new Field("REPORT_DOCNAME", REPORT_DOCNAME,Field.Store.YES, Field.Index.ANALYZED));
doc.add(new Field("AUDIT_DOCNAME", AUDIT_DOCNAME,Field.Store.YES, Field.Index.ANALYZED));
doc.add(new Field("REPORT_DATE",REPORT_DATE,Field.Store.YES, Field.Index.ANALYZED));
doc.add(new Field("POSITIVE_FLAG",POSITIVE_FLAG,Field.Store.YES, Field.Index.ANALYZED));
doc.add(new Field("REPORT_DESC_TXT",REPORT_DESC_TXT,Field.Store.YES, Field.Index.ANALYZED));
doc.add(new Field("REPORT_DIAG_TXT",REPORT_DIAG_TXT,Field.Store.YES, Field.Index.ANALYZED));
doc.add(new Field("CLINIC_DESC",CLINIC_DESC,Field.Store.YES, Field.Index.ANALYZED));
doc.add(new Field("CLINIC_DIAG",CLINIC_DIAG,Field.Store.YES, Field.Index.ANALYZED));
doc.add(new Field("CLINICAL_ADVICE",CLINICAL_ADVICE,Field.Store.YES, Field.Index.ANALYZED));
doc.add(new Field("HOSPITAL_CARDID",HOSPITAL_CARDID,Field.Store.YES, Field.Index.ANALYZED));
doc.add(new Field("CLINIC_HOSPITALNO",CLINIC_HOSPITALNO,Field.Store.YES, Field.Index.ANALYZED));
doc.add(new Field("FTPPATH",FTPPATH,Field.Store.YES, Field.Index.ANALYZED));
doc.add(new Field("SENDED_DATE",SENDED_DATE,Field.Store.YES, Field.Index.ANALYZED));
writer.addDocument(doc);

}
numberindex = writer.numDocs();
writer.optimize();
writer.close();
if(IndexWriter.isLocked(directory)){
IndexWriter.unlock(directory);
}
long end=new Date().getTime();
log.info("Opration sql: \n " + sql + " \n success,Create index " + numberindex + " sucess,spend time is " + (end-start) + " ms!");
} catch (Exception e) {
e.printStackTrace();
log.info("Create index failed......");
}
return numberindex;
}

二、从索引中查询数据

/**
* 从本地索引文件中搜索相关关键字
* @param indexDir 所要查询的索引文件保存地址
* @param fieldString 需要搜索出来的字段
* @param search 搜索关键字的字符串数组
* @throws CorruptIndexException
* @throws IOException
* @throws ParseException
* return List<Document>
*/
@SuppressWarnings({ "deprecation", "resource" })
public List<Document> searchData(File indexDir,String[] fieldString, List<ClassicCasesKeyWords> search) throws CorruptIndexException, IOException, ParseException{
List<Document> docList = new ArrayList<Document>();
long start=new Date().getTime();
IndexSearcher searcher= new IndexSearcher(FSDirectory.open(indexDir),true);

BooleanQuery bQuery = new BooleanQuery(); //组合查询
WildcardQuery w1 = null;
for (int i = 0; i < fieldString.length; i++) {
for (int j = 0; j < search.size(); j++) {
w1 = new WildcardQuery(new Term(fieldString[i], "*" +search.get(j).getKeyName() + "*"));//加通配符才能正常查询完整的模糊查询数据
bQuery.add(w1,BooleanClause.Occur.SHOULD);//or关系
}
}

TopDocs topDocs = searcher.search(bQuery,TOP_NUM);//
ScoreDoc[] hits = topDocs.scoreDocs;
for (int j = 0; j < hits.length; j++) {
int DocId = hits[j].doc;
Document document = searcher.doc(DocId);
docList.add(document);
}
long end=new Date().getTime();
// log.info("\n\n Query "+docList.size()+" result on "+(end-start)+" ms!");
System.out.println("\n\n Query "+docList.size()+" result on "+(end-start)+" ms!");
return docList;
}

以上返回Document的集合,再将每个Document中值遍历

document.getField("BODY_OF_CASE").stringValue();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值