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

来源:转载


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(); }




分享给朋友:
您可能感兴趣的文章:
随机阅读: