商城首页搜索引擎之初见——solr技术的应用

版权声明:本文为博主原创文章,转载请注明出处,尊重劳动成果,谢谢~ https://blog.csdn.net/zhanglf02/article/details/86650269

目前的java应用的搜索引擎常见的有两种:Elasticsearch与Solr,他们都是基于apach基金会的Lucene为内核开发的。看到一篇不错的介绍,如果感兴趣可以好好看看,收获颇多。

1.搜索引擎选型调研文档
2. sola

上面这两个建议看看,能大致了解了啥事sola,咋用的这两个心中的疑问。由于本人也是没有开发过搜索这块的功能,借着项目里有对大数据量的商城查询的功能,接触了庐山真面目。捋了两天算是弄个差不多,去掉业务部分,抽出主要技术部分分享一下。

项目为maven ssm项目。

  1. 要用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

猜你喜欢

转载自blog.csdn.net/zhanglf02/article/details/86650269