solr 文件
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-solr</artifactId>
<version>${spring.data.solr.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-solr</artifactId>
</dependency>
<!-- 默认 starter 会加载 solrj 进来, 下面这个可不引-->
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>6.6.2</version>
</dependency>
application.yml
data:
solr:
host: http://xxx.com/solr
搜索类:
/**
* 商品搜索,排序
* @param pname 名称
* @param page 页码
* @param size 每页的数量
* @param cid 分类id
* @param from_where 来源
* @param pid 商品id
* @param price_min 最小价格
* @param price_max 最大价格
* @param discount_min 最少折扣
* @param discount_max 最大折扣
* @param sort 排序
* @param min_time 同步时间
* @param max_time
* @param sid 供应商id
* @return
* @throws ParseException
*/
@RequestMapping("/getSolrData2")
public Object getSolrData2(String pname,Integer page,Integer size,String cid,String from_where,String pid,
String price_min,String price_max,String discount_min,String discount_max,
String sort,String min_time,String max_time,String sid) throws ParseException {
if("0000".equals(cid)){
Map<String,Object> result = new HashMap<>();
result.put("status","9");
result.put("msg","没有数据");
result.put("data",null);
return result;
}
SolrQuery query = new SolrQuery();
query.set("defType","edismax");
query.set("mm","100%");
// 创建组合条件串
StringBuilder params = new StringBuilder();
if(StringUtils.isNoneBlank(pname)){
params.append("item_ProName:"+pname);
}else{
params.append("item_ProName:*");
}
// 默认搜索字段
query.set("df", "item_ProName");
try {
// 设置过滤条件,设置分页
if(page==null)page=1;
if(size==null)size=60;
query.setStart((page-1)*size);//page-1 * rows
query.setRows(size);
params.append(" AND item_IsOnSell:1");
// 来源
if(StringUtils.isNoneBlank(from_where)){
productService.getFromWhere(from_where,params);
}
// String sell = "1";
// params.append(" AND item_IsOnSell2:"+"("+sell+")");
// item_SupplierId
if(StringUtils.isNoneBlank(sid)){
params.append(" AND item_SupplierId:"+sid);
}
// 分类id
if(StringUtils.isNoneBlank(cid)){
// params.append(" AND item_CategoryId:"+cid);
productService.getCategoryCid(cid,params);
}
// 排序
if(StringUtils.isNoneBlank(sort)){
productService.getSort(sort,query);
}else{
// productService.getSort("1",query);
}
//根据添加时间搜索
if(StringUtils.isNoneBlank(min_time) || StringUtils.isNoneBlank(max_time)){
productService.getAddDateSort(min_time,max_time,query,params);
}
// 多个商品id
if(StringUtils.isNoneBlank(pid)){
productService.getManeyPid(pid,params);
}
// 价格
if(StringUtils.isNoneBlank(price_min) || StringUtils.isNoneBlank(price_max)){
productService.getPriceSort(price_min,price_max,params);
}
// 折扣
if(StringUtils.isNoneBlank(discount_min) || StringUtils.isNoneBlank(discount_max)){
productService.getDiscount(discount_min,discount_max,params);
}
if(cid!=null && !"".equals(cid)){
if(pname!=null && !"".equals(pname)){
query.setFilterQueries(pname);
}
}
} catch (Exception e) {
e.printStackTrace();
Map<String,Object> result = new HashMap<>();
result.put("status","1");
result.put("msg","参数错误");
return result;
}
Map<String,Object> result = new HashMap<>();
try {
if("".equals(pname) || pname == null ){
}else{
//2.3设置高亮
query.setHighlight(true);
query.setHighlightSimplePre("<em style=\"color:red\">");
query.setHighlightSimplePost("</em>");
query.addHighlightField("item_ProName");//设置高亮显示的域
}
query.setQuery(params.toString());
// 这里需要对价格进行处理,暂时没处理
// 就是需要判断是否登录,然后价格乘以折扣
// List<SolrProduct> solrProducts = productService.getSolrProduct(query,from_where,pname,cid);
Map<String,Object> solrProducts = productService.getSolrProduct(query,from_where,pname,cid);
Map<String,Object> data = new HashMap<>();
if(solrProducts!=null){
data.put("total",solrProducts.get("total"));
data.put("data_list",solrProducts.get("solrProducts"));
} else {
data.put("total",0);
data.put("data_list",null);
}
result.put("status","0");
result.put("msg","获取列表数据成功");
result.put("data",data);
return result;
} catch (Exception e) {
e.printStackTrace();
}
result.put("status","2");
result.put("msg","数据异常");
return result;
}
/**
* 给搜索添加排序
* @param sort
*/
@Override
public void getSort(String sort,SolrQuery query ) {
if(StringUtils.isNoneBlank(sort)) {
if (sort.equals("1")) {
query.setSort("item_Discount", SolrQuery.ORDER.asc);
}
if (sort.equals("2")) {
query.setSort("item_prosum", SolrQuery.ORDER.asc);
}
if (sort.equals("3")) {
query.setSort("item_prosum", SolrQuery.ORDER.desc);
}
if (sort.equals("4")) {
query.setSort("item_Prices", SolrQuery.ORDER.asc);
}
if (sort.equals("5")) {
query.setSort("item_Prices", SolrQuery.ORDER.desc);
}
if (sort.equals("6")) {
query.setSort("item_Discount", SolrQuery.ORDER.desc);
}
}
}
/**
* 按照同步时间排序
* @param min_time 小时间
* @param max_time 大时间
* @param query
*/
@Override
public void getAddDateSort(String min_time, String max_time, SolrQuery query,StringBuilder params) {
try {
if(StringUtils.isNoneBlank(min_time)){
Date mindate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(min_time);
if(StringUtils.isNoneBlank(max_time)){
Date maxdate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(min_time);
params.append(" AND item_AddDate2:"+"["+mindate.getTime()+" TO "+maxdate.getTime()+"]");
}
params.append(" AND item_AddDate2:["+mindate.getTime()+" TO *]");
}
if(StringUtils.isNoneBlank(max_time)){
Date maxdate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(min_time);
params.append(" AND item_AddDate2:[* TO "+maxdate.getTime()+"]");
}
} catch (ParseException e) {
e.printStackTrace();
}
}
/**
* 根据商品id 查询多个商品
* @param pid
* @param params
*/
@Override
public void getManeyPid(String pid, StringBuilder params) {
String[] strs = pid.split(",");
StringBuilder builder = new StringBuilder();
for(int i=0;i<strs.length;i++){
builder.append(strs[i]+" OR ");
}
String item = builder.toString().trim().substring(0,builder.toString().trim().length()-2);
params.append(" AND id:"+"("+item+")");
}
/**
* 商品分类这里:
* 不知道传的是一级还是二级还是三级,
* 需要一点一点的匹配
* 需要solr配置文件里的字段合并
* @param cid
* @param params
*/
@Override
public void getCategoryCid(String cid, StringBuilder params) {
String[] strs = cid.split(",");
StringBuilder builder = new StringBuilder();
for(int i=0;i<strs.length;i++){
builder.append(strs[i]+" OR ");
}
String item = builder.toString().trim().substring(0,builder.toString().trim().length()-2);
params.append(" AND cate:"+"("+item+")");
}
@Override
public void getFromWhere(String fromwhere, StringBuilder params) {
String[] strs = fromwhere.split(",");
StringBuilder builder = new StringBuilder();
for(int i=0;i<strs.length;i++){
builder.append(strs[i]+" OR ");
}
String item = builder.toString().trim().substring(0,builder.toString().trim().length()-2);
params.append(" AND item_from_where:"+"("+item+")");
}
/**
* 根据商品价格排序
* solr只能long,所以要*100
* @param price_min
* @param price_max
* @param params
*/
@Override
public void getPriceSort(String price_min, String price_max, StringBuilder params) {
long min = 0;
if(price_min!=null & !"".equals(price_min)){
min = Math.round(Double.parseDouble(price_min)*100);
}
long max = 0;
if(price_max!=null && !"".equals(price_max)){
max = Math.round(Double.parseDouble(price_max)*100);
}
if(price_min==null || "".equals(price_min)){
params.append(" AND item_Prices:[* TO "+max+"]");
}
if(price_max==null || "".equals(price_max)){
params.append(" AND item_Prices:["+min+" TO *]");
}
if(price_min!=null & !"".equals(price_min) && price_max!=null && !"".equals(price_max)){
params.append(" AND item_Prices:"+"["+min+" TO "+max+"]");
}
}
/**
* 根据商品折扣排序
* @param discount_min
* @param discount_max
* @param params
*/
@Override
public void getDiscount(String discount_min, String discount_max, StringBuilder params) {
long min = 0;
if(discount_min!=null && !"".equals(discount_min)){
min = Math.round(Double.parseDouble(discount_min)*10);
}
long max = 0;
if(discount_max!=null && !"".equals(discount_max)){
max = Math.round(Double.parseDouble(discount_max)*10);
}
if(discount_min==null || "".equals(discount_min)){
params.append(" AND item_Discount1:[* TO "+max+"]");
}
if(discount_max==null || "".equals(discount_max)){
params.append(" AND item_Discount1:["+min+" TO *]");
}
if(discount_min!=null & !"".equals(discount_min) && discount_max!=null && !"".equals(discount_max)){
params.append(" AND item_Discount1:["+min+" TO "+max+"]");
}
}
Solr:schema.xml
<!-- 业务域 -->
<field name="item_ProId" type="string" indexed="false" stored="true" />
<field name="item_ProName" type="text_ik" indexed="true" stored="true" />
<field name="item_BalancePrice" type="double" indexed="true" stored="true" />
<field name="item_VipPrice" type="string" indexed="true" stored="true" />
<field name="item_ProImg" type="string" indexed="false" stored="true" />
<field name="item_IsOnSell" type="long" indexed="true" stored="true" />
<field name="item_wholesale_price" type="double" indexed="false" stored="true" />
<field name="item_categoryIdName" type="text_ik" indexed="true" stored="true" />
<field name="item_CategoryCode" type="text_ik" indexed="true" stored="true" />
<field name="item_CategoryThird" type="text_ik" indexed="true" stored="true" />
<field name="item_from_where" type="string" indexed="true" stored="true" />
<field name="item_Prices" type="long" indexed="true" stored="true" />
<field name="item_Discount" type="string" indexed="true" stored="true" />
<field name="item_CategoryId" type="long" indexed="true" stored="true" />
<field name="item_SupplierId" type="long" indexed="true" stored="true" />
<field name="item_prosum" type="long" indexed="true" stored="true" />
<field name="item_AddDate" type="string" indexed="true" stored="true" />
<field name="item_AddDate2" type="long" indexed="true" stored="true" />
<!-- 折扣率 -->
<field name="item_Discount1" type="long" indexed="true" stored="true" />
<field name="item_CategoryCode2" type="long" indexed="true" stored="true" />
<field name="item_CategoryThird2" type="long" indexed="true" stored="true" />
<!-- 为了查询多个分类,我这里的业务是一个分类id不知道是几级的所以这样做了 -->
<field name="cate" type="string" indexed="true" stored="true" multiValued="true"/>
<copyField source="item_CategoryId" dest="cate"/>
<copyField source="item_CategoryCode2" dest="cate"/>
<copyField source="item_CategoryThird2" dest="cate"/>
上面的cate就是下面的,你也可以用商品名称,关键词等等一些可以搜到的商品名字做。