SpringDataSolr
1.区间过滤
new Criteria(“item_price”).greaterThanEqual(price[0]); 大于等于
new Criteria(“item_price”).lessThanEqual(price[1]); 小于等于
private Map
searchList(Map searchMap
){
......
if(!"".equals(searchMap
.get("price"))){
String
[] price
= ((String
) searchMap
.get("price")).split("-");
if(!price
[0].equals("0")){
Criteria filterCriteria
=new Criteria("item_price").greaterThanEqual(price
[0]);
FilterQuery filterQuery
=new SimpleFilterQuery(filterCriteria
);
query
.addFilterQuery(filterQuery
);
}
if(!price
[1].equals("*")){
Criteria filterCriteria
=new Criteria("item_price").lessThanEqual(price
[1]);
FilterQuery filterQuery
=new SimpleFilterQuery(filterCriteria
);
query
.addFilterQuery(filterQuery
);
}
}
}
2.分页
private Map
searchList(Map searchMap
){
Integer pageNo
= (Integer
) searchMap
.get("pageNo");
if(pageNo
==null
){
pageNo
=1;
}
Integer pageSize
=(Integer
) searchMap
.get("pageSize");
if(pageSize
==null
){
pageSize
=20;
}
query
.setOffset((pageNo
-1)*pageSize
);
query
.setRows(pageSize
);
......
Map map
=new HashMap<>();
map
.put("rows", page
.getContent());
map
.put("totalPages", page
.getTotalPages());
map
.put("total", page
.getTotalElements());
return map
;
}
3.多关键字搜索
solr在搜索时是将搜索关键字进行分词,然后按照或的关系来进行搜索的。
有些用户会在关键字中间习惯性的输入一些空格,而这个空格输入后,很有可能查询不到结果了。所以我们还要对空格至于做一下处理,删除关键字中的空格。
@Override
public Map
<String, Object> search(Map searchMap
) {
String keywords
= (String
) searchMap
.get("keywords");
searchMap
.put("keywords", keywords
.replace(" ", ""));
..................
}
4.排序
private Map
searchList(Map searchMap
){
........
String sortValue
= (String
) searchMap
.get("sort");
String sortField
= (String
) searchMap
.get("sortField");
if(sortValue
!=null
&& !sortValue
.equals("")){
if(sortValue
.equals("ASC")){
Sort sort
=new Sort(Sort
.Direction
.ASC
, "item_"+sortField
);
query
.addSort(sort
);
}
if(sortValue
.equals("DESC")){
Sort sort
=new Sort(Sort
.Direction
.DESC
, "item_"+sortField
);
query
.addSort(sort
);
}
}
......
return map
;
}
searchService 1.0
package com
.pyg
.search
.service
;
import java
.util
.List
;
import java
.util
.Map
;
public interface ItemSearchService {
Map
<String,Object> search(Map searchMap
);
void importList(List list
);
void deleteByGoodsIds(List goodsIdList
);
}
package com
.pyg
.search
.service
.impl
;
import com
.alibaba
.dubbo
.config
.annotation
.Service
;
import com
.pyg
.pojo
.TbItem
;
import com
.pyg
.search
.service
.ItemSearchService
;
import org
.apache
.solr
.common
.util
.Hash
;
import org
.springframework
.beans
.factory
.annotation
.Autowired
;
import org
.springframework
.data
.domain
.Page
;
import org
.springframework
.data
.domain
.Sort
;
import org
.springframework
.data
.redis
.core
.RedisTemplate
;
import org
.springframework
.data
.solr
.core
.SolrTemplate
;
import org
.springframework
.data
.solr
.core
.query
.*
;
import org
.springframework
.data
.solr
.core
.query
.result
.*
;
import java
.util
.*
;
@Service(timeout
= 3000)
public class ItemServiceImpl implements ItemSearchService {
@Autowired
private SolrTemplate solrTemplate
;
@Autowired
private RedisTemplate redisTemplate
;
@Override
public Map
<String, Object> search(Map searchMap
) {
Map resultMap
=new HashMap();
String keywords
= (String
) searchMap
.get("keywords");
keywords
= keywords
.replace(" ", "");
searchMap
.put("keywords",keywords
);
resultMap
.putAll(searchList(searchMap
));
List
<String> categoryList
= searchCategory(searchMap
);
resultMap
.put("categoryList",categoryList
);
String category
= (String
) searchMap
.get("category");
if(!category
.equals("")){
resultMap
.putAll(searchBrandAndSpec(category
));
}else if(categoryList
.size()>0){
resultMap
.putAll(searchBrandAndSpec(categoryList
.get(0)));
}
return resultMap
;
}
private Map
searchList(Map searchMap
){
Map map
=new HashMap();
HighlightQuery query
= new SimpleHighlightQuery();
Criteria criteria
= new Criteria("item_keywords").is(searchMap
.get("keywords"));
HighlightOptions options
= new HighlightOptions();
options
.setSimplePrefix("<em style='color:red'>");
options
.setSimplePostfix("</em>");
options
.addField("item_title");
query
.addCriteria(criteria
);
query
.setHighlightOptions(options
);
if(!searchMap
.get("category").equals("")){
FilterQuery filterQuery
= new SimpleFilterQuery();
Criteria filterCriteria
= new Criteria("item_category").is(searchMap
.get("category"));
filterQuery
.addCriteria(filterCriteria
);
query
.addFilterQuery(filterQuery
);
}
if(!searchMap
.get("brand").equals("")){
FilterQuery filterQuery
= new SimpleFilterQuery();
Criteria filterCriteria
= new Criteria("item_brand").is(searchMap
.get("brand"));
filterQuery
.addCriteria(filterCriteria
);
query
.addFilterQuery(filterQuery
);
}
if(searchMap
.get("spec")!=null
){
Map
<String,String> spec
= (Map
) searchMap
.get("spec");
for (String key
: spec
.keySet()) {
FilterQuery filterQuery
= new SimpleFilterQuery();
Criteria filterCriteria
= new Criteria("item_spec_" + key
).is(spec
.get(key
));
filterQuery
.addCriteria(filterCriteria
);
query
.addFilterQuery(filterQuery
);
}
}
if(!searchMap
.get("price").equals("")){
String price
= (String
) searchMap
.get("price");
String
[] split
= price
.split("-");
if(!split
[0].equals("0")){
FilterQuery filterQuery
=new SimpleFilterQuery();
Criteria criteria1
= new Criteria("item_price").greaterThanEqual(split
[0]);
filterQuery
.addCriteria(criteria1
);
query
.addFilterQuery(filterQuery
);
}
if(!split
[1].equals("*")){
FilterQuery filterQuery
=new SimpleFilterQuery();
Criteria criteria1
= new Criteria("item_price").lessThanEqual(split
[1]);
filterQuery
.addCriteria(criteria1
);
query
.addFilterQuery(filterQuery
);
}
}
String sortValue
= (String
) searchMap
.get("sort");
String sortField
= (String
) searchMap
.get("sortField");
if(sortField
!=null
&&!sortValue
.equals("")){
if(sortValue
.equals("ASC")){
Sort sort
= new Sort(Sort
.Direction
.ASC
, "item_" + sortField
);
query
.addSort(sort
);
}
if(sortValue
.equals("DESC")){
Sort sort
= new Sort(Sort
.Direction
.DESC
, "item_" + sortField
);
query
.addSort(sort
);
}
}
Integer pageNo
= (Integer
) searchMap
.get("pageNo");
if(pageNo
==null
){
pageNo
=1;
}
Integer pageSize
= (Integer
) searchMap
.get("pageSize");
if(pageSize
==null
){
pageSize
=20;
}
query
.setOffset((pageNo
-1)*pageSize
);
query
.setRows(pageSize
);
HighlightPage
<TbItem> highlightPage
= solrTemplate
.queryForHighlightPage(query
, TbItem
.class);
List
<HighlightEntry
<TbItem>> entryList
= highlightPage
.getHighlighted();
for (HighlightEntry
<TbItem> entry
: entryList
) {
TbItem item
= entry
.getEntity();
List
<HighlightEntry.Highlight> highlights
= entry
.getHighlights();
for (HighlightEntry
.Highlight highlight
: highlights
) {
String title
= highlight
.getSnipplets().get(0);
item
.setTitle(title
);
}
}
map
.put("rows",highlightPage
.getContent());
map
.put("totalPages",highlightPage
.getTotalPages());
map
.put("total",highlightPage
.getTotalElements());
return map
;
}
private List
<String> searchCategory(Map searchMap
){
List list
=new ArrayList();
Query query
= new SimpleQuery();
Criteria criteria
= new Criteria("item_keywords").is(searchMap
.get("keywords"));
query
.addCriteria(criteria
);
GroupOptions options
= new GroupOptions();
options
.addGroupByField("item_category");
query
.setGroupOptions(options
);
GroupPage
<TbItem> groupPage
= solrTemplate
.queryForGroupPage(query
, TbItem
.class);
GroupResult
<TbItem> groupResult
= groupPage
.getGroupResult("item_category");
Page
<GroupEntry
<TbItem>> groupEntries
= groupResult
.getGroupEntries();
List
<GroupEntry
<TbItem>> content
= groupEntries
.getContent();
for (GroupEntry
<TbItem> entry
: content
) {
String value
= entry
.getGroupValue();
list
.add(value
);
}
return list
;
}
private Map
searchBrandAndSpec(String category
){
Map map
=new HashMap();
Object typeId
= redisTemplate
.boundHashOps("itemCat").get(category
);
if(typeId
!=null
){
Object brandList
= redisTemplate
.boundHashOps("brandList").get(typeId
);
Object specList
= redisTemplate
.boundHashOps("specList").get(typeId
);
map
.put("brandList",brandList
);
map
.put("specList",specList
);
}
return map
;
}
@Override
public void importList(List list
) {
solrTemplate
.saveBeans(list
);
solrTemplate
.commit();
}
@Override
public void deleteByGoodsIds(List goodsIdList
) {
Query query
=new SimpleQuery();
Criteria criteria
=new Criteria("item_goodsid").in(goodsIdList
);
query
.addCriteria(criteria
);
solrTemplate
.delete(query
);
solrTemplate
.commit();
}
}