java搜索功能封装,我封装的搜索引擎之lucene篇

最近利用晚上下班还有周末的时间自己捣腾的封装了一个我自己的搜索引擎(基于lucene和solr).现在将大概的思路给写出来,分享下:

1.首先是索引对象,也可以说是查询的VO对象.封装了几个常用字段(如:主键,所属者ID,所属者姓名,进入详情页面的link,创建时间等),其他各个模块的字段(如:标题,内容,邮箱等)

SearchBean.java

字段的代码如下:

1

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif/** *//********以下 共有字段***********/21fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif/** *//**3d18c02628675d0a2c816449d98bda930.png     * 检索的内容48f1ba5b45633e9678d1db480c16cae3f.png*/54f1150b881333f12a311ae9ef34da474.pngprotectedString keyword;61fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif/** *//**7d18c02628675d0a2c816449d98bda930.png     * 拥有者ID88f1ba5b45633e9678d1db480c16cae3f.png*/94f1150b881333f12a311ae9ef34da474.pngprotectedString owerId;101fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif/** *//**11d18c02628675d0a2c816449d98bda930.png     * 拥有者name128f1ba5b45633e9678d1db480c16cae3f.png*/134f1150b881333f12a311ae9ef34da474.pngprotectedString owerName;141fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif/** *//**15d18c02628675d0a2c816449d98bda930.png     * 检索对象的唯一标识位的值168f1ba5b45633e9678d1db480c16cae3f.png*/174f1150b881333f12a311ae9ef34da474.pngprotectedString id;181fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif/** *//**19d18c02628675d0a2c816449d98bda930.png     * 检索出对象后进入详情页面的链接208f1ba5b45633e9678d1db480c16cae3f.png*/214f1150b881333f12a311ae9ef34da474.pngprotectedString link;221fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif/** *//**23d18c02628675d0a2c816449d98bda930.png     * 创建时间248f1ba5b45633e9678d1db480c16cae3f.png*/254f1150b881333f12a311ae9ef34da474.pngprotectedString createDate;261fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif/** *//**27d18c02628675d0a2c816449d98bda930.png     * index类型288f1ba5b45633e9678d1db480c16cae3f.png*/294f1150b881333f12a311ae9ef34da474.pngprotectedString indexType;304f1150b881333f12a311ae9ef34da474.png314f1150b881333f12a311ae9ef34da474.png//setter,getter方法省略321fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif/** *//********以上 共有字段***********/334f1150b881333f12a311ae9ef34da474.png341fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif/** *//*************以下 其他字段************/351fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif/** *//**36d18c02628675d0a2c816449d98bda930.png     * 需要检索出来的字段及其值的对应map378f1ba5b45633e9678d1db480c16cae3f.png*/384f1150b881333f12a311ae9ef34da474.pngprivateMapsearchValues;394f1150b881333f12a311ae9ef34da474.png401fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif/** *//**41d18c02628675d0a2c816449d98bda930.png     * 值对象428f1ba5b45633e9678d1db480c16cae3f.png*/434f1150b881333f12a311ae9ef34da474.pngprivateObject object;444f1150b881333f12a311ae9ef34da474.png451fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif/** *//**46d18c02628675d0a2c816449d98bda930.png     * 获取检索出来的doIndexFields字段的值47d18c02628675d0a2c816449d98bda930.png     *48d18c02628675d0a2c816449d98bda930.png     *@return498f1ba5b45633e9678d1db480c16cae3f.png*/501fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifpublicMapgetSearchValues()9b8a8a44dd1c74ae49c20a7cd451974e.png{51d18c02628675d0a2c816449d98bda930.pngreturnsearchValues;528f1ba5b45633e9678d1db480c16cae3f.png    }534f1150b881333f12a311ae9ef34da474.png541fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif/** *//**55d18c02628675d0a2c816449d98bda930.png     * 设置检索出来的doIndexFields字段的值56d18c02628675d0a2c816449d98bda930.png     *57d18c02628675d0a2c816449d98bda930.png     *@paramsearchValues588f1ba5b45633e9678d1db480c16cae3f.png*/591fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifpublicvoidsetSearchValues(MapsearchValues)9b8a8a44dd1c74ae49c20a7cd451974e.png{60d18c02628675d0a2c816449d98bda930.pngthis.searchValues=searchValues;618f1ba5b45633e9678d1db480c16cae3f.png    }621fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif/** *//********************以上 其他字段*******************/

抽象方法代码如下:

1

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif/** *//*****************以下 抽象方法******************/21fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif/** *//**3d18c02628675d0a2c816449d98bda930.png     * 返回需要进行检索的字段4d18c02628675d0a2c816449d98bda930.png     *5d18c02628675d0a2c816449d98bda930.png     *@return68f1ba5b45633e9678d1db480c16cae3f.png*/74f1150b881333f12a311ae9ef34da474.pngpublicabstractString[] getDoSearchFields();84f1150b881333f12a311ae9ef34da474.png91fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif/** *//**10d18c02628675d0a2c816449d98bda930.png     * 进行索引的字段11d18c02628675d0a2c816449d98bda930.png     *12d18c02628675d0a2c816449d98bda930.png     *@return138f1ba5b45633e9678d1db480c16cae3f.png*/144f1150b881333f12a311ae9ef34da474.pngpublicabstractString[] getDoIndexFields();154f1150b881333f12a311ae9ef34da474.png161fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif/** *//**17d18c02628675d0a2c816449d98bda930.png     * 初始化searchBean中的公共字段(每个对象都必须创建的索引字段)18d18c02628675d0a2c816449d98bda930.png     *@throwsException198f1ba5b45633e9678d1db480c16cae3f.png*/204f1150b881333f12a311ae9ef34da474.pngpublicabstractvoidinitPublicFields()throwsException;214f1150b881333f12a311ae9ef34da474.png221fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif/** *//**23d18c02628675d0a2c816449d98bda930.png     * 返回索引类型24d18c02628675d0a2c816449d98bda930.png     *25d18c02628675d0a2c816449d98bda930.png     *@return268f1ba5b45633e9678d1db480c16cae3f.png*/274f1150b881333f12a311ae9ef34da474.pngpublicabstractString getIndexType();281fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif/** *//*****************以上 抽象方法********************/

共有的方法:

1

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif/** *//*******************以下 公共方法**********************/21fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif/** *//**3d18c02628675d0a2c816449d98bda930.png     * 获取需要创建索引字段的键值对map4d18c02628675d0a2c816449d98bda930.png     *5d18c02628675d0a2c816449d98bda930.png     *@return68f1ba5b45633e9678d1db480c16cae3f.png*/71fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifpublicMapgetIndexFieldValues()9b8a8a44dd1c74ae49c20a7cd451974e.png{897e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifif(this.object==null)9b8a8a44dd1c74ae49c20a7cd451974e.png{9d18c02628675d0a2c816449d98bda930.png            logger.warn("given object is null!");10d18c02628675d0a2c816449d98bda930.pngreturnCollections.emptyMap();11ecedf933ec37d714bd4c2545da43add2.png        }12d18c02628675d0a2c816449d98bda930.png13d18c02628675d0a2c816449d98bda930.png        String[] doIndexFields=this.getDoIndexFields();1497e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifif(doIndexFields==null||doIndexFields.length<1)9b8a8a44dd1c74ae49c20a7cd451974e.png{15d18c02628675d0a2c816449d98bda930.png            logger.debug("given no doIndexFields!");16d18c02628675d0a2c816449d98bda930.pngreturnCollections.emptyMap();17ecedf933ec37d714bd4c2545da43add2.png        }18d18c02628675d0a2c816449d98bda930.png19d18c02628675d0a2c816449d98bda930.png        MapextInfo=newHashMap();2097e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.giffor(String f : doIndexFields)9b8a8a44dd1c74ae49c20a7cd451974e.png{21d18c02628675d0a2c816449d98bda930.png            String value=getValue(f, object);22d18c02628675d0a2c816449d98bda930.png            extInfo.put(f, value);23ecedf933ec37d714bd4c2545da43add2.png        }24d18c02628675d0a2c816449d98bda930.png25d18c02628675d0a2c816449d98bda930.pngreturnextInfo;268f1ba5b45633e9678d1db480c16cae3f.png    }274f1150b881333f12a311ae9ef34da474.png281fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif/** *//**29d18c02628675d0a2c816449d98bda930.png     * 获取一个对象中的某个字段的值,结果转化成string类型30d18c02628675d0a2c816449d98bda930.png     *31d18c02628675d0a2c816449d98bda930.png     *@paramfield         字段名称32d18c02628675d0a2c816449d98bda930.png     *@paramobj           对象33d18c02628675d0a2c816449d98bda930.png     *@return348f1ba5b45633e9678d1db480c16cae3f.png*/351fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifprivateString getValue(String field, Object obj)9b8a8a44dd1c74ae49c20a7cd451974e.png{3697e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifif(StringUtils.isEmpty(field))9b8a8a44dd1c74ae49c20a7cd451974e.png{37d18c02628675d0a2c816449d98bda930.png            logger.warn("field is empty!");38d18c02628675d0a2c816449d98bda930.pngreturnStringUtils.EMPTY;39ecedf933ec37d714bd4c2545da43add2.png        }40d18c02628675d0a2c816449d98bda930.png41d18c02628675d0a2c816449d98bda930.png        String result=StringUtils.EMPTY;4297e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.giftry9b8a8a44dd1c74ae49c20a7cd451974e.png{43d18c02628675d0a2c816449d98bda930.png            Object value=ObjectUtils.getFieldValue(object, field);44d18c02628675d0a2c816449d98bda930.pngif(value==null)45d18c02628675d0a2c816449d98bda930.png                result=StringUtils.EMPTY;46d18c02628675d0a2c816449d98bda930.pngelseif(valueinstanceofString)47d18c02628675d0a2c816449d98bda930.png                result=(String) value;48d18c02628675d0a2c816449d98bda930.pngelseif(valueinstanceofCollections||valueinstanceofMap)49d18c02628675d0a2c816449d98bda930.png                result=ToStringBuilder.reflectionToString(object);50d18c02628675d0a2c816449d98bda930.pngelseif(valueinstanceofDate)51d18c02628675d0a2c816449d98bda930.png                result=DateUtils.formatDate((Date) value);52d18c02628675d0a2c816449d98bda930.pngelse53d18c02628675d0a2c816449d98bda930.png                result=value.toString();54d18c02628675d0a2c816449d98bda930.png5597e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif        }catch(IllegalAccessException e)9b8a8a44dd1c74ae49c20a7cd451974e.png{56d18c02628675d0a2c816449d98bda930.png            logger.error("can not find a value for field '{}' in object class '{}'!", field, object.getClass());57ecedf933ec37d714bd4c2545da43add2.png        }58d18c02628675d0a2c816449d98bda930.png59d18c02628675d0a2c816449d98bda930.pngreturnresult;608f1ba5b45633e9678d1db480c16cae3f.png    }614f1150b881333f12a311ae9ef34da474.png621fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif/** *//**63d18c02628675d0a2c816449d98bda930.png     * you must use this method when you create the index, set what object you will to be created its index!64d18c02628675d0a2c816449d98bda930.png     *65d18c02628675d0a2c816449d98bda930.png     *@paramobject            the object which you will want to be create index668f1ba5b45633e9678d1db480c16cae3f.png*/671fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifpublicvoidsetObject(Object object)9b8a8a44dd1c74ae49c20a7cd451974e.png{68d18c02628675d0a2c816449d98bda930.pngthis.object=object;698f1ba5b45633e9678d1db480c16cae3f.png    }704f1150b881333f12a311ae9ef34da474.png711fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif/** *//**72d18c02628675d0a2c816449d98bda930.png     * get what object you want to be created index!73d18c02628675d0a2c816449d98bda930.png     *74d18c02628675d0a2c816449d98bda930.png     *@return758f1ba5b45633e9678d1db480c16cae3f.png*/761fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifpublicObject getObject()9b8a8a44dd1c74ae49c20a7cd451974e.png{77d18c02628675d0a2c816449d98bda930.pngreturnthis.object;788f1ba5b45633e9678d1db480c16cae3f.png    }791fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif/** *//***************以上 公共方法*************/

2.现在有很多开源或者闭源的索引引擎可以用在项目上使用,所以我写了一个接口和一个抽取了一些公共方法的抽象类,只需要将你选择的搜索引擎的具体创建索引,检索等功能的实现代码写在一个继承上面这个抽象类的子类中,就可以随意的切换使用的目标引擎.贴上接口和抽象类

SearchEngine.java

1

4f1150b881333f12a311ae9ef34da474.pngpackagecom.message.base.search.engine;24f1150b881333f12a311ae9ef34da474.png34f1150b881333f12a311ae9ef34da474.pngimportcom.message.base.pagination.PaginationSupport;44f1150b881333f12a311ae9ef34da474.pngimportcom.message.base.search.SearchBean;54f1150b881333f12a311ae9ef34da474.png64f1150b881333f12a311ae9ef34da474.pngimportjava.util.List;74f1150b881333f12a311ae9ef34da474.png81fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif/** *//**9d18c02628675d0a2c816449d98bda930.png * 索引引擎实现构建索引.删除索引.更新索引.检索等操作.10d18c02628675d0a2c816449d98bda930.png *11d18c02628675d0a2c816449d98bda930.png *@authorsunhao(sunhao.java@gmail.com)12d18c02628675d0a2c816449d98bda930.png *@versionV1.013d18c02628675d0a2c816449d98bda930.png * @createTime 13-5-5 上午1:38148f1ba5b45633e9678d1db480c16cae3f.png*/151fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifpublicinterfaceSearchEngine9b8a8a44dd1c74ae49c20a7cd451974e.png{16d18c02628675d0a2c816449d98bda930.png1797e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif/** *//**18d18c02628675d0a2c816449d98bda930.png     * 创建索引(考虑线程安全)19d18c02628675d0a2c816449d98bda930.png     *20d18c02628675d0a2c816449d98bda930.png     *@paramsearchBeans       对象21d18c02628675d0a2c816449d98bda930.png     *@throwsException22ecedf933ec37d714bd4c2545da43add2.png*/23d18c02628675d0a2c816449d98bda930.pngpublicvoiddoIndex(ListsearchBeans)throwsException;24d18c02628675d0a2c816449d98bda930.png2597e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif/** *//**26d18c02628675d0a2c816449d98bda930.png     * 删除索引27d18c02628675d0a2c816449d98bda930.png     *28d18c02628675d0a2c816449d98bda930.png     *@parambean              对象29d18c02628675d0a2c816449d98bda930.png     *@throwsException30ecedf933ec37d714bd4c2545da43add2.png*/31d18c02628675d0a2c816449d98bda930.pngpublicvoiddeleteIndex(SearchBean bean)throwsException;32d18c02628675d0a2c816449d98bda930.png3397e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif/** *//**34d18c02628675d0a2c816449d98bda930.png     * 删除索引(删除多个)35d18c02628675d0a2c816449d98bda930.png     *36d18c02628675d0a2c816449d98bda930.png     *@parambeans             对象37d18c02628675d0a2c816449d98bda930.png     *@throwsException38ecedf933ec37d714bd4c2545da43add2.png*/39d18c02628675d0a2c816449d98bda930.pngpublicvoiddeleteIndexs(Listbeans)throwsException;40d18c02628675d0a2c816449d98bda930.png4197e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif/** *//**42d18c02628675d0a2c816449d98bda930.png     * 进行检索43d18c02628675d0a2c816449d98bda930.png     *44d18c02628675d0a2c816449d98bda930.png     *@parambean              检索对象(一般只需要放入值keyword,即用来检索的关键字)45d18c02628675d0a2c816449d98bda930.png     *@paramisHighlighter     是否高亮46d18c02628675d0a2c816449d98bda930.png     *@paramstart             开始值47d18c02628675d0a2c816449d98bda930.png     *@paramnum               偏移量48d18c02628675d0a2c816449d98bda930.png     *@return49d18c02628675d0a2c816449d98bda930.png     *@throwsException50ecedf933ec37d714bd4c2545da43add2.png*/51d18c02628675d0a2c816449d98bda930.pngpublicPaginationSupport doSearch(SearchBean bean,booleanisHighlighter,intstart,intnum)throwsException;52d18c02628675d0a2c816449d98bda930.png5397e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif/** *//**54d18c02628675d0a2c816449d98bda930.png     * 进行多个检索对象的检索55d18c02628675d0a2c816449d98bda930.png     *56d18c02628675d0a2c816449d98bda930.png     *@parambeans             多个检索对象(一般只需要放入值keyword,即用来检索的关键字)57d18c02628675d0a2c816449d98bda930.png     *@paramisHighlighter     是否高亮58d18c02628675d0a2c816449d98bda930.png     *@paramstart             开始值59d18c02628675d0a2c816449d98bda930.png     *@paramnum               偏移量60d18c02628675d0a2c816449d98bda930.png     *@return61d18c02628675d0a2c816449d98bda930.png     *@throwsException62ecedf933ec37d714bd4c2545da43add2.png*/63d18c02628675d0a2c816449d98bda930.pngpublicPaginationSupport doSearch(Listbeans,booleanisHighlighter,intstart,intnum)throwsException;64d18c02628675d0a2c816449d98bda930.png6597e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif/** *//**66d18c02628675d0a2c816449d98bda930.png     * 删除某个类型的所有索引(考虑线程安全)67d18c02628675d0a2c816449d98bda930.png     *68d18c02628675d0a2c816449d98bda930.png     *@paramclazz             索引类型69d18c02628675d0a2c816449d98bda930.png     *@throwsException70ecedf933ec37d714bd4c2545da43add2.png*/71d18c02628675d0a2c816449d98bda930.pngpublicvoiddeleteIndexsByIndexType(Class<?extendsSearchBean>clazz)throwsException;72d18c02628675d0a2c816449d98bda930.png7397e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif/** *//**74d18c02628675d0a2c816449d98bda930.png     * 删除某个类型的所有索引(考虑线程安全)75d18c02628675d0a2c816449d98bda930.png     *76d18c02628675d0a2c816449d98bda930.png     *@paramindexType         索引类型77d18c02628675d0a2c816449d98bda930.png     *@throwsException78ecedf933ec37d714bd4c2545da43add2.png*/79d18c02628675d0a2c816449d98bda930.pngpublicvoiddeleteIndexsByIndexType(String indexType)throwsException;80d18c02628675d0a2c816449d98bda930.png8197e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif/** *//**82d18c02628675d0a2c816449d98bda930.png     * 删除所有的索引83d18c02628675d0a2c816449d98bda930.png     *84d18c02628675d0a2c816449d98bda930.png     *@throwsException85ecedf933ec37d714bd4c2545da43add2.png*/86d18c02628675d0a2c816449d98bda930.pngpublicvoiddeleteAllIndexs()throwsException;87d18c02628675d0a2c816449d98bda930.png8897e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif/** *//**89d18c02628675d0a2c816449d98bda930.png     * 更新索引90d18c02628675d0a2c816449d98bda930.png     *91d18c02628675d0a2c816449d98bda930.png     *@paramsearchBean        需要更新的bean92d18c02628675d0a2c816449d98bda930.png     *@throwsException93ecedf933ec37d714bd4c2545da43add2.png*/94d18c02628675d0a2c816449d98bda930.pngpublicvoidupdateIndex(SearchBean searchBean)throwsException;95d18c02628675d0a2c816449d98bda930.png9697e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif/** *//**97d18c02628675d0a2c816449d98bda930.png     * 批量更新索引98d18c02628675d0a2c816449d98bda930.png     *99d18c02628675d0a2c816449d98bda930.png     *@paramsearchBeans       需要更新的beans100d18c02628675d0a2c816449d98bda930.png     *@throwsException101ecedf933ec37d714bd4c2545da43add2.png*/102d18c02628675d0a2c816449d98bda930.pngpublicvoidupdateIndexs(ListsearchBeans)throwsException;1038f1ba5b45633e9678d1db480c16cae3f.png}

AbstractSearchEngine.java

1

4f1150b881333f12a311ae9ef34da474.pngpackagecom.message.base.search.engine;24f1150b881333f12a311ae9ef34da474.png34f1150b881333f12a311ae9ef34da474.pngimportcom.message.base.pagination.PaginationSupport;44f1150b881333f12a311ae9ef34da474.pngimportcom.message.base.pagination.PaginationUtils;54f1150b881333f12a311ae9ef34da474.pngimportcom.message.base.search.SearchBean;64f1150b881333f12a311ae9ef34da474.pngimportcom.message.base.utils.StringUtils;74f1150b881333f12a311ae9ef34da474.pngimportorg.slf4j.Logger;84f1150b881333f12a311ae9ef34da474.pngimportorg.slf4j.LoggerFactory;94f1150b881333f12a311ae9ef34da474.png104f1150b881333f12a311ae9ef34da474.pngimportjava.util.Collections;114f1150b881333f12a311ae9ef34da474.png121fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif/** *//**13d18c02628675d0a2c816449d98bda930.png * 搜索引擎的公用方法.14d18c02628675d0a2c816449d98bda930.png *15d18c02628675d0a2c816449d98bda930.png *@authorsunhao(sunhao.java@gmail.com)16d18c02628675d0a2c816449d98bda930.png *@versionV1.017d18c02628675d0a2c816449d98bda930.png * @createTime 13-5-8 下午10:53188f1ba5b45633e9678d1db480c16cae3f.png*/191fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifpublicabstractclassAbstractSearchEngineimplementsSearchEngine9b8a8a44dd1c74ae49c20a7cd451974e.png{20d18c02628675d0a2c816449d98bda930.pngprivatestaticfinalLogger logger=LoggerFactory.getLogger(AbstractSearchEngine.class);21d18c02628675d0a2c816449d98bda930.png2297e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif/** *//**23d18c02628675d0a2c816449d98bda930.png     * 进行高亮处理时,html片段的前缀24ecedf933ec37d714bd4c2545da43add2.png*/25d18c02628675d0a2c816449d98bda930.pngprivateString htmlPrefix="

";2697e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif/** *//**27d18c02628675d0a2c816449d98bda930.png     * 进行高亮处理时,html片段的后缀28ecedf933ec37d714bd4c2545da43add2.png*/29d18c02628675d0a2c816449d98bda930.pngprivateString htmlSuffix="

";30 d18c02628675d0a2c816449d98bda930.png31 97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicString getHtmlPrefix()9b8a8a44dd1c74ae49c20a7cd451974e.png{32d18c02628675d0a2c816449d98bda930.pngreturnhtmlPrefix;33ecedf933ec37d714bd4c2545da43add2.png    }34d18c02628675d0a2c816449d98bda930.png3597e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicvoidsetHtmlPrefix(String htmlPrefix)9b8a8a44dd1c74ae49c20a7cd451974e.png{36d18c02628675d0a2c816449d98bda930.pngthis.htmlPrefix=htmlPrefix;37ecedf933ec37d714bd4c2545da43add2.png    }38d18c02628675d0a2c816449d98bda930.png3997e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicString getHtmlSuffix()9b8a8a44dd1c74ae49c20a7cd451974e.png{40d18c02628675d0a2c816449d98bda930.pngreturnhtmlSuffix;41ecedf933ec37d714bd4c2545da43add2.png    }42d18c02628675d0a2c816449d98bda930.png4397e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicvoidsetHtmlSuffix(String htmlSuffix)9b8a8a44dd1c74ae49c20a7cd451974e.png{44d18c02628675d0a2c816449d98bda930.pngthis.htmlSuffix=htmlSuffix;45ecedf933ec37d714bd4c2545da43add2.png    }46d18c02628675d0a2c816449d98bda930.png4797e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicPaginationSupport doSearch(SearchBean bean,booleanisHighlighter,intstart,intnum)throwsException9b8a8a44dd1c74ae49c20a7cd451974e.png{4897e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifif(bean==null)9b8a8a44dd1c74ae49c20a7cd451974e.png{49d18c02628675d0a2c816449d98bda930.png            logger.debug("given search bean is empty!");50d18c02628675d0a2c816449d98bda930.pngreturnPaginationUtils.getNullPagination();51ecedf933ec37d714bd4c2545da43add2.png        }52d18c02628675d0a2c816449d98bda930.png53d18c02628675d0a2c816449d98bda930.pngreturndoSearch(Collections.singletonList(bean), isHighlighter, start, num);54ecedf933ec37d714bd4c2545da43add2.png    }55d18c02628675d0a2c816449d98bda930.png5697e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif/** *//**57d18c02628675d0a2c816449d98bda930.png     * 获取index类型58d18c02628675d0a2c816449d98bda930.png     *59d18c02628675d0a2c816449d98bda930.png     *@parambean60d18c02628675d0a2c816449d98bda930.png     *@return61ecedf933ec37d714bd4c2545da43add2.png*/6297e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicString getIndexType(SearchBean bean)9b8a8a44dd1c74ae49c20a7cd451974e.png{63d18c02628675d0a2c816449d98bda930.pngreturnStringUtils.isNotEmpty(bean.getIndexType())?bean.getIndexType() : bean.getClass().getSimpleName();64ecedf933ec37d714bd4c2545da43add2.png    }658f1ba5b45633e9678d1db480c16cae3f.png}

3.开始谈谈lucene

贴上代码先:

LuceneSearchEngine.java

1

4f1150b881333f12a311ae9ef34da474.pngpackagecom.message.base.search.engine;24f1150b881333f12a311ae9ef34da474.png34f1150b881333f12a311ae9ef34da474.pngimportcom.message.base.pagination.PaginationSupport;44f1150b881333f12a311ae9ef34da474.pngimportcom.message.base.pagination.PaginationUtils;54f1150b881333f12a311ae9ef34da474.pngimportcom.message.base.search.SearchBean;64f1150b881333f12a311ae9ef34da474.pngimportcom.message.base.search.SearchInitException;74f1150b881333f12a311ae9ef34da474.pngimportcom.message.base.utils.StringUtils;84f1150b881333f12a311ae9ef34da474.pngimportorg.apache.lucene.analysis.Analyzer;94f1150b881333f12a311ae9ef34da474.pngimportorg.apache.lucene.analysis.SimpleAnalyzer;104f1150b881333f12a311ae9ef34da474.pngimportorg.apache.lucene.document.Document;114f1150b881333f12a311ae9ef34da474.pngimportorg.apache.lucene.document.Field;124f1150b881333f12a311ae9ef34da474.pngimportorg.apache.lucene.index.IndexReader;134f1150b881333f12a311ae9ef34da474.pngimportorg.apache.lucene.index.IndexWriter;144f1150b881333f12a311ae9ef34da474.pngimportorg.apache.lucene.index.Term;154f1150b881333f12a311ae9ef34da474.pngimportorg.apache.lucene.queryParser.MultiFieldQueryParser;164f1150b881333f12a311ae9ef34da474.pngimportorg.apache.lucene.search.BooleanClause;174f1150b881333f12a311ae9ef34da474.pngimportorg.apache.lucene.search.IndexSearcher;184f1150b881333f12a311ae9ef34da474.pngimportorg.apache.lucene.search.Query;194f1150b881333f12a311ae9ef34da474.pngimportorg.apache.lucene.search.ScoreDoc;204f1150b881333f12a311ae9ef34da474.pngimportorg.apache.lucene.search.highlight.Highlighter;214f1150b881333f12a311ae9ef34da474.pngimportorg.apache.lucene.search.highlight.QueryScorer;224f1150b881333f12a311ae9ef34da474.pngimportorg.apache.lucene.search.highlight.SimpleHTMLFormatter;234f1150b881333f12a311ae9ef34da474.pngimportorg.apache.lucene.store.Directory;244f1150b881333f12a311ae9ef34da474.pngimportorg.apache.lucene.store.FSDirectory;254f1150b881333f12a311ae9ef34da474.pngimportorg.apache.lucene.util.Version;264f1150b881333f12a311ae9ef34da474.pngimportorg.slf4j.Logger;274f1150b881333f12a311ae9ef34da474.pngimportorg.slf4j.LoggerFactory;284f1150b881333f12a311ae9ef34da474.pngimportorg.springframework.beans.BeanUtils;294f1150b881333f12a311ae9ef34da474.png304f1150b881333f12a311ae9ef34da474.pngimportjava.io.File;314f1150b881333f12a311ae9ef34da474.pngimportjava.io.IOException;324f1150b881333f12a311ae9ef34da474.pngimportjava.util.*;334f1150b881333f12a311ae9ef34da474.png341fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif/** *//**35d18c02628675d0a2c816449d98bda930.png * 基于lucene实现的索引引擎.36d18c02628675d0a2c816449d98bda930.png *37d18c02628675d0a2c816449d98bda930.png *@authorsunhao(sunhao.java@gmail.com)38d18c02628675d0a2c816449d98bda930.png *@versionV1.039d18c02628675d0a2c816449d98bda930.png * @createTime 13-5-5 上午10:38408f1ba5b45633e9678d1db480c16cae3f.png*/411fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifpublicclassLuceneSearchEngineextendsAbstractSearchEngine9b8a8a44dd1c74ae49c20a7cd451974e.png{42d18c02628675d0a2c816449d98bda930.pngprivatestaticfinalLogger logger=LoggerFactory.getLogger(LuceneSearchEngine.class);4397e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif/** *//**44d18c02628675d0a2c816449d98bda930.png     * 索引存放路径45ecedf933ec37d714bd4c2545da43add2.png*/46d18c02628675d0a2c816449d98bda930.pngprivateString indexPath;4797e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif/** *//**48d18c02628675d0a2c816449d98bda930.png     * 分词器49ecedf933ec37d714bd4c2545da43add2.png*/50d18c02628675d0a2c816449d98bda930.pngprivateAnalyzer analyzer=newSimpleAnalyzer();51d18c02628675d0a2c816449d98bda930.png5297e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicsynchronizedvoiddoIndex(ListsearchBeans)throwsException9b8a8a44dd1c74ae49c20a7cd451974e.png{53d18c02628675d0a2c816449d98bda930.pngthis.createOrUpdateIndex(searchBeans,true);54ecedf933ec37d714bd4c2545da43add2.png    }55d18c02628675d0a2c816449d98bda930.png5697e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicsynchronizedvoiddeleteIndex(SearchBean bean)throwsException9b8a8a44dd1c74ae49c20a7cd451974e.png{5797e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifif(bean==null)9b8a8a44dd1c74ae49c20a7cd451974e.png{58d18c02628675d0a2c816449d98bda930.png            logger.warn("Get search bean is empty!");59d18c02628675d0a2c816449d98bda930.pngreturn;60ecedf933ec37d714bd4c2545da43add2.png        }61d18c02628675d0a2c816449d98bda930.png62d18c02628675d0a2c816449d98bda930.png        String id=bean.getId();63d18c02628675d0a2c816449d98bda930.png6497e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifif(StringUtils.isEmpty(id))9b8a8a44dd1c74ae49c20a7cd451974e.png{65d18c02628675d0a2c816449d98bda930.png            logger.warn("get id and id value from bean is empty!");66d18c02628675d0a2c816449d98bda930.pngreturn;67ecedf933ec37d714bd4c2545da43add2.png        }68d18c02628675d0a2c816449d98bda930.png        String indexType=getIndexType(bean);69d18c02628675d0a2c816449d98bda930.png        Directory indexDir=this.getIndexDir(indexType);70d18c02628675d0a2c816449d98bda930.png        IndexWriter writer=this.getWriter(indexDir);71d18c02628675d0a2c816449d98bda930.png72d18c02628675d0a2c816449d98bda930.png        writer.deleteDocuments(newTerm("pkId", id));73d18c02628675d0a2c816449d98bda930.png        writer.commit();74d18c02628675d0a2c816449d98bda930.pngthis.destroy(writer);75ecedf933ec37d714bd4c2545da43add2.png    }76d18c02628675d0a2c816449d98bda930.png7797e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicsynchronizedvoiddeleteIndexs(Listbeans)throwsException9b8a8a44dd1c74ae49c20a7cd451974e.png{7897e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifif(beans==null)9b8a8a44dd1c74ae49c20a7cd451974e.png{79d18c02628675d0a2c816449d98bda930.png            logger.warn("Get beans is empty!");80d18c02628675d0a2c816449d98bda930.pngreturn;81ecedf933ec37d714bd4c2545da43add2.png        }82d18c02628675d0a2c816449d98bda930.png8397e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.giffor(SearchBean bean : beans)9b8a8a44dd1c74ae49c20a7cd451974e.png{84d18c02628675d0a2c816449d98bda930.pngthis.deleteIndex(bean);85ecedf933ec37d714bd4c2545da43add2.png        }86ecedf933ec37d714bd4c2545da43add2.png    }87d18c02628675d0a2c816449d98bda930.png8897e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicPaginationSupport doSearch(Listbeans,booleanisHighlighter,intstart,intnum)throwsException9b8a8a44dd1c74ae49c20a7cd451974e.png{8997e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifif(beans==null||beans.isEmpty())9b8a8a44dd1c74ae49c20a7cd451974e.png{90d18c02628675d0a2c816449d98bda930.png            logger.debug("given search beans is empty!");91d18c02628675d0a2c816449d98bda930.pngreturnPaginationUtils.getNullPagination();92ecedf933ec37d714bd4c2545da43add2.png        }93d18c02628675d0a2c816449d98bda930.png94d18c02628675d0a2c816449d98bda930.png        List queryResults=newArrayList();95d18c02628675d0a2c816449d98bda930.pngintcount=0;9697e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.giffor(SearchBean bean : beans)9b8a8a44dd1c74ae49c20a7cd451974e.png{97d18c02628675d0a2c816449d98bda930.png            String indexType=getIndexType(bean);98d18c02628675d0a2c816449d98bda930.png99d18c02628675d0a2c816449d98bda930.png            IndexReader reader=IndexReader.open(this.getIndexDir(indexType));100d18c02628675d0a2c816449d98bda930.png101d18c02628675d0a2c816449d98bda930.png            ListfieldNames=newArrayList();//查询的字段名102d18c02628675d0a2c816449d98bda930.pngListqueryValue=newArrayList();//待查询字段的值103d18c02628675d0a2c816449d98bda930.pngListflags=newArrayList();104d18c02628675d0a2c816449d98bda930.png105d18c02628675d0a2c816449d98bda930.png//要进行检索的字段106d18c02628675d0a2c816449d98bda930.pngString[] doSearchFields=bean.getDoSearchFields();107d18c02628675d0a2c816449d98bda930.pngif(doSearchFields==null||doSearchFields.length==0)108d18c02628675d0a2c816449d98bda930.pngreturnPaginationUtils.getNullPagination();109d18c02628675d0a2c816449d98bda930.png110d18c02628675d0a2c816449d98bda930.png//默认字段11197e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifif(StringUtils.isNotEmpty(bean.getKeyword()))9b8a8a44dd1c74ae49c20a7cd451974e.png{11297e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.giffor(String field : doSearchFields)9b8a8a44dd1c74ae49c20a7cd451974e.png{113d18c02628675d0a2c816449d98bda930.png                    fieldNames.add(field);114d18c02628675d0a2c816449d98bda930.png                    queryValue.add(bean.getKeyword());115d18c02628675d0a2c816449d98bda930.png                    flags.add(BooleanClause.Occur.SHOULD);116ecedf933ec37d714bd4c2545da43add2.png                }117ecedf933ec37d714bd4c2545da43add2.png            }118d18c02628675d0a2c816449d98bda930.png11997e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif            Query query=MultiFieldQueryParser.parse(Version.LUCENE_CURRENT, queryValue.toArray(newString[]9b8a8a44dd1c74ae49c20a7cd451974e.png{}), fieldNames.toArray(newString[]9b8a8a44dd1c74ae49c20a7cd451974e.png{}),12097e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif                    flags.toArray(newBooleanClause.Occur[]9b8a8a44dd1c74ae49c20a7cd451974e.png{}), analyzer);121d18c02628675d0a2c816449d98bda930.png122d18c02628675d0a2c816449d98bda930.png            logger.debug("make query string is '{}'!", query.toString());123d18c02628675d0a2c816449d98bda930.png            IndexSearcher searcher=newIndexSearcher(reader);124d18c02628675d0a2c816449d98bda930.png            ScoreDoc[] scoreDocs=searcher.search(query,1000000).scoreDocs;125d18c02628675d0a2c816449d98bda930.png126d18c02628675d0a2c816449d98bda930.png//查询起始记录位置127d18c02628675d0a2c816449d98bda930.pngintbegin=(start==-1&&num==-1)?0: start;128d18c02628675d0a2c816449d98bda930.png//查询终止记录位置129d18c02628675d0a2c816449d98bda930.pngintend=(start==-1&&num==-1)?scoreDocs.length : Math.min(begin+num, scoreDocs.length);130d18c02628675d0a2c816449d98bda930.png131d18c02628675d0a2c816449d98bda930.png//高亮处理132d18c02628675d0a2c816449d98bda930.pngHighlighter highlighter=null;13397e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifif(isHighlighter)9b8a8a44dd1c74ae49c20a7cd451974e.png{134d18c02628675d0a2c816449d98bda930.png                SimpleHTMLFormatter formatter=newSimpleHTMLFormatter(this.getHtmlPrefix(),this.getHtmlSuffix());135d18c02628675d0a2c816449d98bda930.png                highlighter=newHighlighter(formatter,newQueryScorer(query));136ecedf933ec37d714bd4c2545da43add2.png            }137d18c02628675d0a2c816449d98bda930.png138d18c02628675d0a2c816449d98bda930.png            Listresults=newArrayList();13997e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.giffor(inti=begin; i{140d18c02628675d0a2c816449d98bda930.png                SearchBean result=BeanUtils.instantiate(bean.getClass());141d18c02628675d0a2c816449d98bda930.png142d18c02628675d0a2c816449d98bda930.pngintdocID=scoreDocs[i].doc;143d18c02628675d0a2c816449d98bda930.png                Document hitDoc=searcher.doc(docID);144d18c02628675d0a2c816449d98bda930.png145d18c02628675d0a2c816449d98bda930.png                result.setId(hitDoc.get("pkId"));146d18c02628675d0a2c816449d98bda930.png                result.setLink(hitDoc.get("link"));147d18c02628675d0a2c816449d98bda930.png                result.setOwerId(hitDoc.get("owerId"));148d18c02628675d0a2c816449d98bda930.png                result.setOwerName(hitDoc.get("owerName"));149d18c02628675d0a2c816449d98bda930.png                result.setCreateDate(hitDoc.get("createDate"));150d18c02628675d0a2c816449d98bda930.png                result.setIndexType(indexType);151d18c02628675d0a2c816449d98bda930.png152d18c02628675d0a2c816449d98bda930.png                String keyword=StringUtils.EMPTY;153d18c02628675d0a2c816449d98bda930.pngif(isHighlighter&&highlighter!=null)154d18c02628675d0a2c816449d98bda930.png                    keyword=highlighter.getBestFragment(analyzer,"keyword", hitDoc.get("keyword"));155d18c02628675d0a2c816449d98bda930.png156d18c02628675d0a2c816449d98bda930.pngif(StringUtils.isEmpty(keyword))157d18c02628675d0a2c816449d98bda930.png                    keyword=hitDoc.get("keyword");158d18c02628675d0a2c816449d98bda930.png159d18c02628675d0a2c816449d98bda930.png                result.setKeyword(keyword);160d18c02628675d0a2c816449d98bda930.png161d18c02628675d0a2c816449d98bda930.png                MapextendValues=newHashMap();16297e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.giffor(String field : doSearchFields)9b8a8a44dd1c74ae49c20a7cd451974e.png{163d18c02628675d0a2c816449d98bda930.png                    String value=hitDoc.get(field);164d18c02628675d0a2c816449d98bda930.pngif(isHighlighter&&highlighter!=null)165d18c02628675d0a2c816449d98bda930.png                        value=highlighter.getBestFragment(analyzer, field, hitDoc.get(field));166d18c02628675d0a2c816449d98bda930.png167d18c02628675d0a2c816449d98bda930.pngif(StringUtils.isEmpty(value))168d18c02628675d0a2c816449d98bda930.png                        value=hitDoc.get(field);169d18c02628675d0a2c816449d98bda930.png170d18c02628675d0a2c816449d98bda930.png                    extendValues.put(field, value);171ecedf933ec37d714bd4c2545da43add2.png                }172d18c02628675d0a2c816449d98bda930.png173d18c02628675d0a2c816449d98bda930.png                result.setSearchValues(extendValues);174d18c02628675d0a2c816449d98bda930.png175d18c02628675d0a2c816449d98bda930.png                results.add(result);176ecedf933ec37d714bd4c2545da43add2.png            }177d18c02628675d0a2c816449d98bda930.png178d18c02628675d0a2c816449d98bda930.png            queryResults.addAll(results);179d18c02628675d0a2c816449d98bda930.png            count+=scoreDocs.length;180d18c02628675d0a2c816449d98bda930.png            searcher.close();181d18c02628675d0a2c816449d98bda930.png            reader.close();182ecedf933ec37d714bd4c2545da43add2.png        }183d18c02628675d0a2c816449d98bda930.png184d18c02628675d0a2c816449d98bda930.png        PaginationSupport paginationSupport=PaginationUtils.makePagination(queryResults, count, num, start);185d18c02628675d0a2c816449d98bda930.pngreturnpaginationSupport;186ecedf933ec37d714bd4c2545da43add2.png    }187d18c02628675d0a2c816449d98bda930.png18897e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicsynchronizedvoiddeleteIndexsByIndexType(Class<?extendsSearchBean>clazz)throwsException9b8a8a44dd1c74ae49c20a7cd451974e.png{189d18c02628675d0a2c816449d98bda930.png        String indexType=getIndexType(BeanUtils.instantiate(clazz));190d18c02628675d0a2c816449d98bda930.pngthis.deleteIndexsByIndexType(indexType);191ecedf933ec37d714bd4c2545da43add2.png    }192d18c02628675d0a2c816449d98bda930.png19397e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicsynchronizedvoiddeleteIndexsByIndexType(String indexType)throwsException9b8a8a44dd1c74ae49c20a7cd451974e.png{194d18c02628675d0a2c816449d98bda930.png//传入readOnly的参数,默认是只读的195d18c02628675d0a2c816449d98bda930.pngIndexReader reader=IndexReader.open(this.getIndexDir(indexType),false);196d18c02628675d0a2c816449d98bda930.pngintresult=reader.deleteDocuments(newTerm("indexType", indexType));197d18c02628675d0a2c816449d98bda930.png        reader.close();198d18c02628675d0a2c816449d98bda930.png        logger.debug("the rows of delete index is '{}'! index type is '{}'!", result, indexType);199ecedf933ec37d714bd4c2545da43add2.png    }200d18c02628675d0a2c816449d98bda930.png20197e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicsynchronizedvoiddeleteAllIndexs()throwsException9b8a8a44dd1c74ae49c20a7cd451974e.png{202d18c02628675d0a2c816449d98bda930.png        File indexFolder=newFile(this.indexPath);20397e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifif(indexFolder==null||!indexFolder.isDirectory())9b8a8a44dd1c74ae49c20a7cd451974e.png{204d18c02628675d0a2c816449d98bda930.png//不存在或者不是文件夹205d18c02628675d0a2c816449d98bda930.pnglogger.debug("indexPath is not a folder! indexPath: '{}'!", indexPath);206d18c02628675d0a2c816449d98bda930.pngreturn;207ecedf933ec37d714bd4c2545da43add2.png        }208d18c02628675d0a2c816449d98bda930.png209d18c02628675d0a2c816449d98bda930.png        File[] children=indexFolder.listFiles();21097e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.giffor(File child : children)9b8a8a44dd1c74ae49c20a7cd451974e.png{211d18c02628675d0a2c816449d98bda930.pngif(child==null||!child.isDirectory())continue;212d18c02628675d0a2c816449d98bda930.png213d18c02628675d0a2c816449d98bda930.png            String indexType=child.getName();214d18c02628675d0a2c816449d98bda930.png            logger.debug("Get indexType is '{}'!", indexType);215d18c02628675d0a2c816449d98bda930.png216d18c02628675d0a2c816449d98bda930.pngthis.deleteIndexsByIndexType(indexType);217ecedf933ec37d714bd4c2545da43add2.png        }218ecedf933ec37d714bd4c2545da43add2.png    }219d18c02628675d0a2c816449d98bda930.png22097e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicvoidupdateIndex(SearchBean searchBean)throwsException9b8a8a44dd1c74ae49c20a7cd451974e.png{221d18c02628675d0a2c816449d98bda930.pngthis.updateIndexs(Collections.singletonList(searchBean));222ecedf933ec37d714bd4c2545da43add2.png    }223d18c02628675d0a2c816449d98bda930.png22497e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicvoidupdateIndexs(ListsearchBeans)throwsException9b8a8a44dd1c74ae49c20a7cd451974e.png{225d18c02628675d0a2c816449d98bda930.pngthis.createOrUpdateIndex(searchBeans,false);226ecedf933ec37d714bd4c2545da43add2.png    }227d18c02628675d0a2c816449d98bda930.png22897e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif/** *//**229d18c02628675d0a2c816449d98bda930.png     * 创建或者更新索引230d18c02628675d0a2c816449d98bda930.png     *231d18c02628675d0a2c816449d98bda930.png     *@paramsearchBeans       需要创建或者更新的对象232d18c02628675d0a2c816449d98bda930.png     *@paramisCreate          是否是创建索引;true创建索引,false更新索引233d18c02628675d0a2c816449d98bda930.png     *@throwsException234ecedf933ec37d714bd4c2545da43add2.png*/23597e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifprivatesynchronizedvoidcreateOrUpdateIndex(ListsearchBeans,booleanisCreate)throwsException9b8a8a44dd1c74ae49c20a7cd451974e.png{23697e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifif(searchBeans==null||searchBeans.isEmpty())9b8a8a44dd1c74ae49c20a7cd451974e.png{237d18c02628675d0a2c816449d98bda930.png            logger.debug("do no index!");238d18c02628675d0a2c816449d98bda930.pngreturn;239ecedf933ec37d714bd4c2545da43add2.png        }240d18c02628675d0a2c816449d98bda930.png241d18c02628675d0a2c816449d98bda930.png        Directory indexDir=null;242d18c02628675d0a2c816449d98bda930.png        IndexWriter writer=null;24397e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.giffor(Iteratorit=searchBeans.iterator(); it.hasNext(); )9b8a8a44dd1c74ae49c20a7cd451974e.png{244d18c02628675d0a2c816449d98bda930.png            SearchBean sb=it.next();245d18c02628675d0a2c816449d98bda930.png            String indexType=getIndexType(sb);24697e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifif(sb==null)9b8a8a44dd1c74ae49c20a7cd451974e.png{247d18c02628675d0a2c816449d98bda930.png                logger.debug("give SearchBean is null!");248d18c02628675d0a2c816449d98bda930.pngreturn;249ecedf933ec37d714bd4c2545da43add2.png            }250d18c02628675d0a2c816449d98bda930.pngbooleananotherSearchBean=indexDir!=null&&!indexType.equals(((FSDirectory) indexDir).getFile().getName());25197e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifif(indexDir==null||anotherSearchBean)9b8a8a44dd1c74ae49c20a7cd451974e.png{252d18c02628675d0a2c816449d98bda930.png                indexDir=this.getIndexDir(indexType);253ecedf933ec37d714bd4c2545da43add2.png            }25497e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifif(writer==null||anotherSearchBean)9b8a8a44dd1c74ae49c20a7cd451974e.png{255d18c02628675d0a2c816449d98bda930.pngthis.destroy(writer);256d18c02628675d0a2c816449d98bda930.png                writer=this.getWriter(indexDir);257ecedf933ec37d714bd4c2545da43add2.png            }258d18c02628675d0a2c816449d98bda930.png259d18c02628675d0a2c816449d98bda930.png            Document doc=newDocument();260d18c02628675d0a2c816449d98bda930.png261d18c02628675d0a2c816449d98bda930.png//初始化一些字段262d18c02628675d0a2c816449d98bda930.pngsb.initPublicFields();263d18c02628675d0a2c816449d98bda930.png            String id=sb.getId();264d18c02628675d0a2c816449d98bda930.png265d18c02628675d0a2c816449d98bda930.png//主键的索引,不作为搜索字段,并且也不进行分词266d18c02628675d0a2c816449d98bda930.pngField idField=newField("pkId", id, Field.Store.YES, Field.Index.NOT_ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS);267d18c02628675d0a2c816449d98bda930.png            doc.add(idField);268d18c02628675d0a2c816449d98bda930.png26997e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif            logger.debug("create id index for '{}', value is '{}'! index is '{}'!",newObject[]9b8a8a44dd1c74ae49c20a7cd451974e.png{"pkId", id, idField});270d18c02628675d0a2c816449d98bda930.png271d18c02628675d0a2c816449d98bda930.png            String owerId=sb.getOwerId();27297e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifif(StringUtils.isEmpty(owerId))9b8a8a44dd1c74ae49c20a7cd451974e.png{273d18c02628675d0a2c816449d98bda930.pngthrownewSearchInitException("you must give a owerId");274ecedf933ec37d714bd4c2545da43add2.png            }275d18c02628675d0a2c816449d98bda930.png            Field owerId_=newField("owerId", owerId, Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS);276d18c02628675d0a2c816449d98bda930.png            doc.add(owerId_);277d18c02628675d0a2c816449d98bda930.png278d18c02628675d0a2c816449d98bda930.png            String owerName=sb.getOwerName();27997e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifif(StringUtils.isEmpty(owerName))9b8a8a44dd1c74ae49c20a7cd451974e.png{280d18c02628675d0a2c816449d98bda930.pngthrownewSearchInitException("you must give a owerName");281ecedf933ec37d714bd4c2545da43add2.png            }282d18c02628675d0a2c816449d98bda930.png            Field owerName_=newField("owerName", owerName, Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS);283d18c02628675d0a2c816449d98bda930.png            doc.add(owerName_);284d18c02628675d0a2c816449d98bda930.png285d18c02628675d0a2c816449d98bda930.png            String link=sb.getLink();28697e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifif(StringUtils.isEmpty(link))9b8a8a44dd1c74ae49c20a7cd451974e.png{287d18c02628675d0a2c816449d98bda930.pngthrownewSearchInitException("you must give a link");288ecedf933ec37d714bd4c2545da43add2.png            }289d18c02628675d0a2c816449d98bda930.png            Field link_=newField("link", link, Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS);290d18c02628675d0a2c816449d98bda930.png            doc.add(link_);291d18c02628675d0a2c816449d98bda930.png292d18c02628675d0a2c816449d98bda930.png            String keyword=sb.getKeyword();29397e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifif(StringUtils.isEmpty(keyword))9b8a8a44dd1c74ae49c20a7cd451974e.png{294d18c02628675d0a2c816449d98bda930.pngthrownewSearchInitException("you must give a keyword");295ecedf933ec37d714bd4c2545da43add2.png            }296d18c02628675d0a2c816449d98bda930.png            Field keyword_=newField("keyword", keyword, Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS);297d18c02628675d0a2c816449d98bda930.png            doc.add(keyword_);298d18c02628675d0a2c816449d98bda930.png299d18c02628675d0a2c816449d98bda930.png            String createDate=sb.getCreateDate();30097e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifif(StringUtils.isEmpty(createDate))9b8a8a44dd1c74ae49c20a7cd451974e.png{301d18c02628675d0a2c816449d98bda930.pngthrownewSearchInitException("you must give a createDate");302ecedf933ec37d714bd4c2545da43add2.png            }303d18c02628675d0a2c816449d98bda930.png            Field createDate_=newField("createDate", createDate, Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS);304d18c02628675d0a2c816449d98bda930.png            doc.add(createDate_);305d18c02628675d0a2c816449d98bda930.png306d18c02628675d0a2c816449d98bda930.png//索引类型字段307d18c02628675d0a2c816449d98bda930.pngField indexType_=newField("indexType", indexType, Field.Store.YES, Field.Index.NOT_ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS);308d18c02628675d0a2c816449d98bda930.png            doc.add(indexType_);309d18c02628675d0a2c816449d98bda930.png310d18c02628675d0a2c816449d98bda930.png//进行索引的字段311d18c02628675d0a2c816449d98bda930.pngString[] doIndexFields=sb.getDoIndexFields();312d18c02628675d0a2c816449d98bda930.png            MapindexFieldValues=sb.getIndexFieldValues();31397e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifif(doIndexFields!=null&&doIndexFields.length>0)9b8a8a44dd1c74ae49c20a7cd451974e.png{31497e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.giffor(String field : doIndexFields)9b8a8a44dd1c74ae49c20a7cd451974e.png{315d18c02628675d0a2c816449d98bda930.png                    Field extInfoField=newField(field, indexFieldValues.get(field), Field.Store.YES, Field.Index.ANALYZED,316d18c02628675d0a2c816449d98bda930.png                            Field.TermVector.WITH_POSITIONS_OFFSETS);317d18c02628675d0a2c816449d98bda930.png318d18c02628675d0a2c816449d98bda930.png                    doc.add(extInfoField);319ecedf933ec37d714bd4c2545da43add2.png                }320ecedf933ec37d714bd4c2545da43add2.png            }321d18c02628675d0a2c816449d98bda930.png322d18c02628675d0a2c816449d98bda930.pngif(isCreate)323d18c02628675d0a2c816449d98bda930.png                writer.addDocument(doc);324d18c02628675d0a2c816449d98bda930.pngelse325d18c02628675d0a2c816449d98bda930.png                writer.updateDocument(newTerm("pkId", sb.getId()), doc);326d18c02628675d0a2c816449d98bda930.png327d18c02628675d0a2c816449d98bda930.png            writer.optimize();328ecedf933ec37d714bd4c2545da43add2.png        }329d18c02628675d0a2c816449d98bda930.png330d18c02628675d0a2c816449d98bda930.pngthis.destroy(writer);331d18c02628675d0a2c816449d98bda930.png        logger.debug("create or update index success!");332ecedf933ec37d714bd4c2545da43add2.png    }333d18c02628675d0a2c816449d98bda930.png33497e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicDirectory getIndexDir(String suffix)throwsException9b8a8a44dd1c74ae49c20a7cd451974e.png{335d18c02628675d0a2c816449d98bda930.pngreturnFSDirectory.open(newFile(indexPath+File.separator+suffix));336ecedf933ec37d714bd4c2545da43add2.png    }337d18c02628675d0a2c816449d98bda930.png33897e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicIndexWriter getWriter(Directory indexDir)throwsIOException9b8a8a44dd1c74ae49c20a7cd451974e.png{339d18c02628675d0a2c816449d98bda930.pngreturnnewIndexWriter(indexDir, analyzer, IndexWriter.MaxFieldLength.UNLIMITED);340ecedf933ec37d714bd4c2545da43add2.png    }341d18c02628675d0a2c816449d98bda930.png34297e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicvoiddestroy(IndexWriter writer)throwsException9b8a8a44dd1c74ae49c20a7cd451974e.png{343d18c02628675d0a2c816449d98bda930.pngif(writer!=null)344d18c02628675d0a2c816449d98bda930.png            writer.close();345ecedf933ec37d714bd4c2545da43add2.png    }346d18c02628675d0a2c816449d98bda930.png34797e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicvoidsetIndexPath(String indexPath)9b8a8a44dd1c74ae49c20a7cd451974e.png{348d18c02628675d0a2c816449d98bda930.pngthis.indexPath=indexPath;349ecedf933ec37d714bd4c2545da43add2.png    }350d18c02628675d0a2c816449d98bda930.png35197e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicvoidsetAnalyzer(Analyzer analyzer)9b8a8a44dd1c74ae49c20a7cd451974e.png{352d18c02628675d0a2c816449d98bda930.pngthis.analyzer=analyzer;353ecedf933ec37d714bd4c2545da43add2.png    }354d18c02628675d0a2c816449d98bda930.png3558f1ba5b45633e9678d1db480c16cae3f.png}

关于如何使用lucene这里我就不再重复了,网上一大堆这方面的资料,有什么不懂得可以谷歌一下.下面谈谈我的一些想法,有不对的,尽管拍砖,来吧:

....

也没啥好说的,等想到再补充吧,就是觉得有一点比较操蛋,窝心:

1

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifFSDirectory.open(newFile("D:\index\xxx"/** *//**一个不存在的目录,或者是一个不是索引的目录**/));

使用上面一段取到索引Directory的时候,如果目录不存在会报错.可以有人认为这没什么,就是应该,我封装的这代码里面,确实对这玩意有要求的.

上面的SearchBean.java中有一个字段叫indexType,当没有指定的时候,默认为类名,如MessageSerarchBean,如果我没有对Message进行创建索引操作,在检索的时候就报错了.我得想想用什么方法给解决掉.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值