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的效果比多输入框输入查询条件,简洁方便多了,可多条件查询,结果按匹配度排序,实在是很实用。

   

原创粉丝点击