版权声明:本文为博主原创文章,转载请注明出处,尊重劳动成果,谢谢~ https://blog.csdn.net/zhanglf02/article/details/86650269
目前的java应用的搜索引擎常见的有两种:Elasticsearch与Solr,他们都是基于apach基金会的Lucene为内核开发的。看到一篇不错的介绍,如果感兴趣可以好好看看,收获颇多。
1.搜索引擎选型调研文档,
2. sola
上面这两个建议看看,能大致了解了啥事sola,咋用的这两个心中的疑问。由于本人也是没有开发过搜索这块的功能,借着项目里有对大数据量的商城查询的功能,接触了庐山真面目。捋了两天算是弄个差不多,去掉业务部分,抽出主要技术部分分享一下。
项目为maven ssm项目。
- 要用solr,首先项目中要引入依赖,没得说
<!--solr dependency begin-->
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>4.5.0</version>
</dependency>
2.项目中要使用solr查询方法的类要集成solr的类:extends HttpSolrServer
继承了这个类后就可以用solr的查询方法:
public QueryResponse query(SolrParams params) throws SolrServerException {
return new QueryRequest( params ).process( this );
}
这里先了解下我们的查询入参封装到SolrQuery对查询进行了层级提升,而不是用SolrParams :https://blog.csdn.net/john1337/article/details/85987378
查询条件的封装:
org.apache.solr.client.solrj.SolrQuery solrQuery = new SolrQuery();
solrQuery.setParam("fl", "*,score");
solrQuery.setQuery("鲁花");
solrQuery.addFilterQuery("platformId:20170810120");
solrQuery.addFilterQuery("itemStatus:4");
solrQuery.addFilterQuery("shopId:1002515 shopId:1003255 shopId:1003509 shopId:1003572 shopId:1003577");
solrQuery.setParam("defType", "edismax");
solrQuery.setParam("mm", "70%");
solrQuery.setParam("qf", "productId^20 itemName^10 saleAttrValueNames^5 saleAttrKeyNames^3 brandName^1 ad^1");
solrQuery.setParam("pf", "productId itemName saleAttrValueNames saleAttrKeyNames brandName ad");
solrQuery.addSort(sc);
solrQuery.setStart(solrQueryCondition.getStartRow());
solrQuery.setRows(solrQueryCondition.getPageSize());
solrQuery.setHighlight(true).setHighlightSnippets(1);
solrQuery.setParam("hl.fl", "itemName");
solrQuery.setHighlightSimplePre("<span class=\'color-1\'>");//设置开头
solrQuery.setHighlightSimplePost("</span>"); //设置结尾
执行查询:
org.apache.solr.client.solrj.response.QueryResponse response=new QueryResponse();
response = this.query(solrQuery);//这里的this指的是本类或者父类org.apache.solr.client.solrj.impl.HttpSolrServer下的一个实例,可以调用他们的方法。
处理查询结果:
org.apache.solr.common.SolrDocumentList solrDocuments = response.getResults();
SolrPaginagedList<T> paginatedList = new SolrPaginagedList<T>();
paginatedList.setCurPageNum(solrQueryCondition.getPage());
paginatedList.setPageSize(solrQueryCondition.getPageSize());
paginatedList.setTotalCount(Long.valueOf(solrDocuments.getNumFound()).intValue());
List<T> resList = new ArrayList<T>();
for (SolrDocument doc : solrDocuments) {
if (highlightList != null && highlightList.size()> 0) {
for (String str : highlightList) {
List<String> list = highlighting.get(doc.get("id").toString()).get(str);
if(list!=null)
{
doc.put(str,list.get(0));
}
}
log.info("------高亮显示设置成功----");
}
resList.add(this.convertBean(doc));
}
paginatedList.setResult(resList);
paginatedList.setFacetFields(response.getFacetFields());
return paginatedList