`

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

阅读更多
一、首先是从数据库查询数据并添加索引
/**
	 * 写入数据库索引
	 * @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();
分享到:
评论

相关推荐

    lucence.net查询

    本文将深入探讨Lucene.NET的多字段查询、建立索引以及组合查询等核心知识点。 一、Lucene.NET基础 1. **建立索引**:Lucene.NET的核心功能之一是创建全文索引,这使得快速检索成为可能。首先,我们需要创建一个`...

    基于Lucence的个性化搜索引擎研究

    为此,李晓丽和杜振龙在《基于Lucence的个性化搜索引擎研究》一文中提出了一种新的个性化搜索引擎方案。该方案通过分析用户的Cookie文件来构建用户兴趣模型,并以此指导搜索引擎提供更加精准的搜索结果。 #### 关键...

    Lucence查询的实现

    ### Lucene查询实现详解 #### 一、Lucene简介 Lucene是一款高性能、全功能的文本搜索引擎库。它提供了一套完整的搜索应用解决方案,包括全文检索、文档索引、相似度评分等功能。Lucene的核心是索引和搜索,开发者...

    lucene 全文检索数据库

    标题和描述中提到的知识点是关于Lucene全文检索数据库的应用示例,特别是在处理大量数据和多表查询时的性能优化。下面将详细阐述Lucene的基本概念、如何在Java环境中使用Lucene进行全文检索,以及结合MySQL数据库的...

    一头扎进 lucence 视频教程 java1234出品

    - 多字段搜索:支持在一个文档的多个字段上进行查询。 - 断词查询(Wildcard Query):允许用户使用通配符进行部分匹配搜索。 - 范围查询(Range Query):可以限制搜索结果在特定的数值范围或日期范围内。 - ...

    HiGo垂直搜索引擎门户系统(基于lucence mysql asp.net) V7.3源码.rar

    HiGo垂直搜索引擎开源版系统需要独立服务器支持,也可以用你本地电脑做服务器来调试,基于lucence mysql asp.net,支持数据索引,中文分词,模糊查询,爬虫采集,精确采集规则模式和模糊采集规则模式相混合(模糊采集...

    lucence全文检索引擎

    每个文档由一个或多个字段(Field)组成,每个字段有自己的类型(如文本、数字、日期等)。 - **倒排索引**: Lucene的核心数据结构,它将每个词映射到包含该词的文档列表,使得通过词查找文档变得高效。 **2. ...

    lucence视频全面例子

    2. 多字段搜索:可以在多个字段上同时进行搜索,提高检索的灵活性。 3. 分片与分布式搜索:大型应用中,Lucene可以通过分片技术将索引分散在多台机器上,实现分布式搜索。 4. 自定义分析器:根据实际需求,可以...

    HiGo垂直搜索引擎系统开源版(基于lucence mysql asp.net) v2.2.rar

     HiGo垂直搜索引擎开源版系统需要独立服务器支持,也可以用你本地电脑做服务器来调试,基于lucence mysql asp.net, 支持数据索引,中文分词,模糊查询,爬虫采集,精确采集规则模式和模糊采集规则模式相混合(模糊...

    Lucence简介以及应用

    Lucence的描述以及重要的几个方法详解说明,Lucence的应用以及实例

    lucence 测试代码可运行

    在实际使用中,你可能需要根据自己的数据源和需求进行相应的调整,比如更改Analyzer类型、添加新的字段或处理查询结果的逻辑。 总之,Lucene 是一个强大的全文检索工具,通过掌握其核心概念和API,可以构建出高效的...

    用Lucene检索数据库

    - 传统的数据库访问方式是通过JDBC(Java Database Connectivity)接口,编写SQL查询语句来获取数据。 - 从数据库中读取用户信息,例如Authors表中的Au_id, Au_name, Phone, Address, City, State, Zip和contract...

    lucence jar.4.6.0版本所需jar包集合

    对于Lucence 4.6.0版本,这些JAR文件涵盖了核心库、分析器、查询解析器、索引工具、存储组件等多个方面的内容。下面我们将详细探讨这些知识点: 1. **Lucence核心库**:这是Lucence的核心组件,包含索引和搜索的...

    springboot整合lucence完整代码

    SpringBoot整合Lucene是一个常见的需求,特别是在构建高性能的全文搜索引擎时。Lucene是Apache软件基金会...同时,可以考虑使用更高级的搜索引擎库,如Elasticsearch,它基于Lucene但提供了更多的管理和集群扩展能力。

    lucence3.6.1 示例完整包

    本文将深入探讨Lucene 3.6.1版本,结合“庖丁解牛”分词器以及其在数据库表索引、文件索引及分页搜索的应用,为初学者提供一套完整的入门教程。 一、Lucene 3.6.1 概述 Lucene 3.6.1是Apache软件基金会的开源项目...

    lucence学习笔记

    lucence学习笔记,中文的,适用于初学者学习,知识点案例较多。

    lucence完整项目

    在 Lucene 中,一个文档是由多个字段组成的,每个字段代表了数据的一个方面。例如,一个新闻文章可以有标题、作者、内容等字段。每个字段都可以被设置不同的分析器(Analyzer),以进行分词和其他预处理操作。 **3....

    Lucence搜索

    每个文档由多个字段(Field)组成,每个字段有其特定的属性,如文本、标题等。 3. **Analyzer**:Analyzer负责将输入的文本分解为可搜索的词项(Token)。这包括了分词、去除停用词、词形还原等一系列预处理操作。 ...

Global site tag (gtag.js) - Google Analytics