欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-15 23:19:41
...
一、首先是从数据库查询数据并添加索引
/**
	 * 写入数据库索引
	 * @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();
相关标签: java Lucene