package cn.binux.search.service.impl;
import cn.binux.constant.Const;
import cn.binux.pojo.SearchResult;
import cn.binux.pojo.SolrItem;
import cn.binux.pojo.XbinResult;
import cn.binux.search.mapper.SearchMapper;
import cn.binux.search.service.SearchService;
import com.alibaba.dubbo.config.annotation.Service;
import org.apache.log4j.Logger;
import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* Solr Service 实现类
*
* @author xubin.
* @create 2017-02-04 下午4:43
*/
@Service(version = Const.XBIN_STORE_SEARCH_VERSION)
public class SearchServiceImpl implements SearchService {
@Autowired
private SearchMapper searchMapper;
//@Autowired
//private SolrServer solrServer;
@Autowired
private SolrClient solrClient;
private static Logger logger = Logger.getLogger(SearchServiceImpl.class);
@Override
public XbinResult importAllItems() {
List<SolrItem> solrItemList = searchMapper.getSolrItemList();
try {
for (SolrItem solrItem : solrItemList) {
SolrInputDocument document = new SolrInputDocument();
document.addField("id", solrItem.getId());
document.addField("item_category_name", solrItem.getCategory_name());
document.addField("item_title", solrItem.getTitle());
String image = solrItem.getImage();
String[] split = image.split(",");
document.addField("item_image", split[0]);
document.addField("item_price", solrItem.getPrice());
document.addField("item_sell_point", solrItem.getSell_point());
document.addField("item_desc", solrItem.getItem_desc());
solrClient.add(document);
}
solrClient.commit();
logger.info("===========>导入商品成功 导入商品" + solrItemList.size() + "件");
} catch (Exception e) {
logger.error("===========>导入Solr索引失败");
}
return XbinResult.ok();
}
@Override
public SearchResult search(String queryString, Integer page, Integer rows) throws Exception {
SearchResult searchResult = new SearchResult();
SolrQuery query = new SolrQuery();
//设置查询条件
query.setQuery(queryString);
//设置分页
query.setStart((page - 1) * rows);
query.setRows(rows);
//设置默认搜素域
query.set("df", "item_keywords");
query.setHighlight(true);
query.addHighlightField("item_title");
query.setHighlightSimplePre("<em style=\"color:red\">");
query.setHighlightSimplePost("</em>");
QueryResponse response = solrClient.query(query);
SolrDocumentList results = response.getResults();
searchResult.setRecordCount(results.getNumFound());
List<SolrItem> solrItems = new ArrayList<SolrItem>();
Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();
for (SolrDocument result : results) {
SolrItem solrItem = new SolrItem();
solrItem.setId((String) result.get("id"));
List<String> strings = highlighting.get(result.get("id")).get("item_title");
if (strings != null && strings.size() > 0) {
solrItem.setTitle(strings.get(0));
} else {
solrItem.setTitle((String) result.get("item_title"));
}
solrItem.setCategory_name((String) result.get("item_category_name"));
solrItem.setImage((String) result.get("item_image"));
solrItem.setSell_point((String) result.get("item_sell_point"));
solrItem.setItem_desc((String) result.get("item_desc"));
solrItem.setPrice((Long) result.get("item_price"));
solrItems.add(solrItem);
}
searchResult.setItemList(solrItems);
searchResult.setCurPage(page);
long recordCount = searchResult.getRecordCount();
long pageCount = recordCount / rows;
if (recordCount % rows > 0) {
pageCount++;
}
searchResult.setPageCount(pageCount);
return searchResult;
}
}