lucence 3.0.3 +Struts 搜索 数据库内容
来源:互联网 发布:centos安装armlinuxgcc 编辑:程序博客网 时间:2024/06/07 02:22
最近在做一个项目管理的系统,在做传统的搜索界面时,用户每次需要填写大量的数据,但是如果只有一个输入框,类似google一样,就能达到输入多个搜索条件按相关度排序的效果,岂不是更好,据项目经理推荐使用了lucence开源技术,下面把我在使用个过程中的一些经验分享入下:
1.安装jdk,网上大把的资料就不重复了。
2.导入lucence库,我用的版本是lucene-3.0.3 下载地址:http://apache.org/dist/lucene/java/3.0.3/
压缩下载完成的zip文件,里面有两个比较重要的jar文件,一个是lucene-core-3.0.3.jar,是lucence的核心库文件,一个是lucene-demos-3.0.3.jar,里面是写好的一些实例方法
3.配置classpath,在系统环境变量classpath中添加:D:\Java\lucence3.0.3\lucene-core-3.0.3.jar;D:\Java\lucence3.0.3\lucene-demos-3.0.3.jar; 具体路径根据jar存放的目录而定。
4.使用eclipse导入库文件的话,可直接引用jar库中的方法。
5.创建索引,根据关键词搜索匹配一行数据,将匹配的项目id保存到List集合中
/* 创建索引初始化,执行这些语句将创建或清空d:\\save\\目录下所有索引 */IndexWriter writer = new IndexWriter("d:\\save\\", new StandardAnalyzer(), true);writer.close();/*从数据中查询字段值,其中数据库中一行数据对应一个document对象,数据库中的一个字段对应document中的一个域Filed*/IndexWriter writer = new IndexWriter("d:\\save\\", new StandardAnalyzer(), false); writer.setUseCompoundFile(true); /* 创建一份文件 */ Document doc; /* 从数据库中查询数据,放置在List集合中,这就是struts中一个简单的查询 */ List projectList=getVOformDB(); /* 创建一个项目vo对象,读取数据库一行数据 */ ProjectVO objProjectVO; /* 遍历查询出的vo对象,将相关的字段以及字段的值放入document中 */ for(int i=0;i<projectList.size();i++) { objProjectVO=(ProjectVO)projectList.get(i); doc=VOtoDocument(objProjectVO); writer.addDocument(doc); } /* 关闭 */ writer.optimize(); writer.close(); } //从数据库中获取字段,以及字段的值,Document中; private List getVOformDB()throws Exception { ProjectDAO objProjectDAO = new ProjectDAO(); List<QueryCondition> lstCondition = new ArrayList<QueryCondition>(2); //lstCondition.add(new QueryCondition("", "", sortFieldName, "ORDER", sortType, "")); lstCondition.add(new QueryCondition("", "","projectId", "ORDER", "desc", "")); List projectList = objProjectDAO.queryProjectList(lstCondition,1,512); return projectList; } /*将vo中的数据存放到document对象中*/ private Document VOtoDocument(ProjectVO objProjectVO) { /* 创建一份文件 */ Document doc = new Document(); /* 创建一个Field对象,存放数据库的字段信息 */ Field field; /*设置域:项目编号,并添加内容*/ field=new Field("projectId", String.valueOf(objProjectVO.getProjectId()), Field.Store.YES, Field.Index.TOKENIZED); doc.add(field); /*设置域:项目名称,并添加内容*/ field=new Field("projectName", String.valueOf(objProjectVO.getProjectName()), Field.Store.YES, Field.Index.TOKENIZED); doc.add(field); /*设置字域:项目摘要,并添加内容*/ field=new Field("projectRemark", String.valueOf(objProjectVO.getProjectRemark()), Field.Store.YES, Field.Index.TOKENIZED); doc.add(field); return doc; }下面进行数据检索/*下面进行数据检索*//*此方法根据搜索结果获取项目id,再根据项目id可获取项目的全面数据*/private List<String> search(String serchString) throws Exception { /*根据关键词,搜索项目id*/ List<String> ids=new ArrayList<String>(); /* 创建一个搜索,搜索刚才创建的d:\\save\\目录下的索引 */ IndexSearcher indexSearcher = new IndexSearcher("d:\\save\\"); /* 在这里我们只需要搜索一个目录 */ IndexSearcher indexSearchers[] = { indexSearcher }; /* 我们需要搜索两个域"projectName", "projectRemark"里面的内容 */ String[] fields = { "projectName","projectRemark" }; /* 下面这个表示要同时搜索这两个域,而且只要一个域里面有满足我们搜索的内容就行 */ BooleanClause.Occur[] clauses = { BooleanClause.Occur.SHOULD, BooleanClause.Occur.SHOULD}; /* * MultiFieldQueryParser表示多个域解析, 同时可以解析含空格的字符串 */ MultiFieldQueryParser mfq = new MultiFieldQueryParser(fields,new StandardAnalyzer()); mfq.setDefaultOperator(QueryParser.AND_OPERATOR); Query query = mfq.parse(serchString, fields, clauses, new StandardAnalyzer()); /* Multisearcher表示多目录搜索,在这里我们只有一个目录 */ MultiSearcher searcher = new MultiSearcher(indexSearchers); /* 开始搜索 */ Hits h = searcher.search(query); /* 把搜索出来的所有文件的projectId域里的内容放到List集合中 */ for (int i = 0; i < h.length(); i++) { /* 获取文件里面projectId域里面的内容 */ ids.add(h.doc(i).get("projectId")); } /* 关闭 */ searcher.close(); return ids; }
可根据具体需要,调用查询结果集合ids;
经过测试,使用lucence的效果比多输入框输入查询条件,简洁方便多了,可多条件查询,结果按匹配度排序,实在是很实用。
- lucence 3.0.3 +Struts 搜索 数据库内容
- lucence基于数据库的搜索
- Lucence全文搜索框架
- Lucence全文搜索框架
- Lucence全文搜索框架
- Lucence搜索实例
- lucence 搜索篇 (五)
- lucence
- lucence
- lucence
- lucence
- lucence
- Lucence
- Lucence
- lucence
- JAVA大数据搜索之Lucence
- Lucence全文索引与数据库索引
- Struts中将数据库中的内容动态生成下拉列表内容
- ProClarity
- 如何用maven创建opencms模块,并打包成zip?
- Java程序排序之交换排序
- 日本人的友好
- js 获取url参数方法
- lucence 3.0.3 +Struts 搜索 数据库内容
- POI实战-java开发excel详解(第二章 单元格各类型数据读取)
- Openlayers展现点元素
- 线程Thread传递一个或多个参数问题
- 字符串提取数字
- 关于getResource("/")的读取路径问题
- 北京灿烂的历史文化
- js关于时间日期的一些方法汇总
- c++测试下载速度