lucence 3.0.3 +Struts 搜索 数据库内容

1 篇文章 0 订阅
1 篇文章 0 订阅

   最近在做一个项目管理的系统,在做传统的搜索界面时,用户每次需要填写大量的数据,但是如果只有一个输入框,类似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的效果比多输入框输入查询条件,简洁方便多了,可多条件查询,结果按匹配度排序,实在是很实用。

   

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值