利用Solrj对索引进行增删改查

来源:互联网 发布:下一个朝代知乎 编辑:程序博客网 时间:2024/06/02 11:36
1. Solr介绍
Solr它是一种开放源码的、基于 Lucene Java 的搜索服务器,易于加入到 Web 应用程序中。Solr 提供了层面搜索(就是统计)、命中醒目显示并且支持多种输出格式(包括XML/XSLT 和JSON等格式)。它易于安装和配置,而且附带了一个基于HTTP 的管理界面。可以使用 Solr 的表现优异的基本搜索功能,也可以对它进行扩展从而满足企业的需要。Solr的特性包括:
• 高级的全文搜索功能 
• 专为高通量的网络流量进行的优化 
• 基于开放接口(XML和HTTP)的标准 
• 综合的HTML管理界面 
• 可伸缩性-能够有效地复制到另外一个Solr搜索服务器 
• 使用XML配置达到灵活性和适配性 
• 可扩展的插件体系
2. Lucene 介绍
Lucene是一个基于Java的全文信息检索工具包,它不是一个完整的搜索应用程序,而是为你的应用程序提供索引和搜索功能。Lucene 目前是 Apache Jakarta(雅加达) 家族中的一个开源项目。也是目前最为流行的基于Java开源全文检索工具包。目前已经有很多应用程序的搜索功能是基于 Lucene ,比如Eclipse 帮助系统的搜索功能。Lucene能够为文本类型的数据建立索引,所以你只要把你要索引的数据格式转化的文本格式,Lucene 就能对你的文档进行索引和搜索。
3. Solr vs Lucene
Solr与Lucene 并不是竞争对立关系,恰恰相反Solr 依存于Lucene,因为Solr底层的核心技术是使用Lucene 来实现的,Solr和Lucene的本质区别有以下三点:搜索服务器,企业级和管理。Lucene本质上是搜索库,不是独立的应用程序,而Solr是。Lucene专注于搜索底层的建设,而Solr专注于企业应用。Lucene不负责支撑搜索服务所必须的管理,而Solr负责。所以说,一句话概括 Solr: Solr是Lucene面向企业搜索应用的扩展。
4.如何查询全文数据?
顺序扫描法(Serial Scanning):所谓顺序扫描,比如要找内容包含某一个字符串的文件,就是一个文档一个文档的看,对于每一个文档,从头看到尾,如果此文档包含此字符串,则此文档为我们要找的文件,接着看下一个文件,直到扫描完所有的文件。比如Window自带的搜索。
如何提升全文检索的速度?

对非结构化数据顺序扫描很慢,对结构化数据的搜索却相对较快(由于结构化数据有一定的结构可以采取一定的搜索算法加快速度),那么把我们的非结构化数据想办法弄得有一定结构不就行了吗?关系数据库中存储的都是结构化数据,因此很检索都比较快。
从非结构化数据中提取出的然后重新组织的信息,我们称之索引。
字典及图书目录的原理。

不讲Solr基于Tomcat的配置了。只讲Solrj对索引的增删改查

分页查询
 创建SolrServer对象,要对solr

HttpSolrServer server = new HttpSolrServer(url);        //连接solr服务器超时时间 单位毫秒         server.setConnectionTimeout(timeout);        //是否允许跟踪重定向 默认false         server.setFollowRedirects(followRedirects);      //是否允许压缩         server.setAllowCompression(allowCompression);     //最大重新连接次数         server.setMaxRetries(maxRetries);//创建查询对象 SolrQuery query = communitySolrHandler.createQuery(pagination);public SolrQuery createQuery(Pagination<CommunitySolrField> pagination){       SolrQuery query = new SolrQuery();       CommunitySolrField k  = pagination.getDto();       String value = k.getShortPy();       StringBuilder sb = new StringBuilder();       //拼接查询条件       if (!CollectionUtils.isEmpty(k.getRegionIds())){           for (String regionId:k.getRegionIds()){               sb.append(" regionId:"+regionId);           }       }       if (!CollectionUtils.isEmpty(k.getProjectIds())){           for (String projectId:k.getProjectIds()){               sb.append(" projectId:"+projectId);           }       }       query.setQuery(sb.toString());       //在满足上面条件之外 过滤下面的条件       if (StringUtils.hasText(value)){           if (ToolUtils.matcherZh(value)){               query.addFilterQuery(" communityName:"+value);           }else {               query.addFilterQuery("shortPiny:"+value.toLowerCase()+"*" );           }       }       //分页返回结果       int  start =  ToolUtils.start(pagination.getPageNo(), pagination.getPageSize()) ;     // 从第几条开始查询       query.setStart(start);       query.setRows(pagination.getPageSize());       return  query;   }//更新索引 一般这段代码是用定时任务来跑得 ConcurrentUpdateSolrServer server = new ConcurrentUpdateSolrServer(solrJSearchClient.getUrl()+ SolrTable.community.toString(), solrJSearchClient.getQueueSize(), solrJSearchClient.getThreadCount());        List<CommunityDto> list =  communityDao.findAllCommunitySolr() ;        if (CollectionUtils.isEmpty(list)) {            return;        }        List<String> ids = new ArrayList<String>();        List<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();        SolrInputDocument doc;        HanZi hanZi;        for (CommunityDto communityDto:list){            doc = new SolrInputDocument();            hanZi = new HanZi(communityDto.getName());            doc.addField("id",communityDto.getId());            doc.addField("communityName",communityDto.getName());            doc.addField("piny",communityDto.getPiny());            doc.addField("shortPiny",hanZi.getPinYinHeadChar());            doc.addField("sortDefault",communityDto.getSortDefault());            doc.addField("regionId",communityDto.getDicRegionId());            doc.addField("projectId",communityDto.getProjectId());            docs.add(doc);            ids.add(communityDto.getId());        }        try {            //先删除            server.deleteById(ids);            server.commit();            //再添加/更新索引            server.add(docs);            //对索引进行优化            server.optimize();            server.commit();        } catch (Exception e) {            e.printStackTrace();        }


0 0
原创粉丝点击