您的位置:首页 > 其它

solr入门之搜索建议的具体查询及拼音加汉字搜索建议的思考

2016-03-29 18:38 519 查看
今天项目主要是完善已经完成的代码优化

----昨天写的多线程处理solr字段的问题可能会存在内存溢出的问题,还需要优化 下 ....

下面是拼音,汉字完成自动补全的 代码

/**
* 索引建议查询类
* @author songqinghu
*
*/
@Controller
@RequestMapping("/suggest/query")
public class QuerySuggestController {

@Resource
private  QuerySuggestService querySuggestServiceImpl;

/**
*
* @描述:根据查询条件  查询提示词
* @return
* @return ResultData<List<BaseSuggestIndex>>
* @exception
* @createTime:2016年3月28日
* @author: songqinghu
*/
@RequestMapping(value="/auto.json")
@ResponseBody
public ResultData<List<BaseSuggestIndex>> auto(SearchParams params){

ResultData<List<BaseSuggestIndex>> result = querySuggestServiceImpl.search(params);

if(result ==null){
result =  new ResultData<List<BaseSuggestIndex>>();
result.setSuccess(false);
}
return result;
}

}


/**
* 搜索条件封装类
* @author songqinghu
*
*/
public class SearchParams {

private String q; //搜索主条件
private String order; //排序规则
private Integer start = 0;//起始坐标
private Integer rows = 30;//查询个数--产品要求30个
private String fl;//显示字段

private String type;//要查询的分类

public String getType() {
return type;
}

public void setType(String type) {
this.type = type;
}

public String getQ() {
return q;
}

public void setQ(String q) {
this.q = q;
}

public String getOrder() {
return order;
}

public void setOrder(String order) {
this.order = order;
}

public Integer getStart() {
return start;
}

public void setStart(Integer start) {
this.start = start;
}

public Integer getRows() {
return rows;
}

public void setRows(Integer rows) {
this.rows = rows;
}

public String getFl() {
return fl;
}

public void setFl(String fl) {
this.fl = fl;
}
}


@Service("querySuggestServiceImpl")
public class QuerySuggestServiceImpl implements QuerySuggestService ,InitializingBean {

private  Logger logger = LoggerFactory.getLogger(QuerySuggestServiceImpl.class);

@Resource
private SolrServiceWrapper solrServiceWrapperImpl;
//连接客户端
private SolrClient solrClient;

@Value("${SORL_SUGGEST_NAME}")
private String solrSuggestName;

/**
* 搜索接口主类
*/
@Override
public ResultData<List<BaseSuggestIndex>> search(SearchParams params) {

String q = params.getQ();

SolrQuery query = new SolrQuery();

Formula f = new Formula();
//设置主查询条件--只有主条件呀
if(q !=null && q.trim().length()>0){
f.append(new Query(BaseSuggestIndex.Fd.suggest.name(), q+"*"));//关键在这一步  solr会完成搜索建议
}
//设置显示的 字段 --固定值 word
if(params.getFl() !=null && params.getFl().length()>0){
query.set(CommonParams.FL,params.getFl());
}
//过滤的类型--确定属性
if(params.getType() !=null && params.getType().trim().length()>0){
query.setFilterQueries(BaseSuggestIndex.Fd.type.name()+":"+params.getType());
}
String exe  = f.toString();
//主条件--如果传过来的是空   ---先暂时返回空  以后可能返回热词语
if(exe.isEmpty()){
ResultData<List<BaseSuggestIndex>> result = new ResultData<List<BaseSuggestIndex>>();
result.setData(null);
result.setTotalCount(0l);
result.setSuccess(false);
result.setMessage("查询条件为空");
return result;
}
query.set(CommonParams.Q,exe);
query.setStart(params.getStart());
query.setRows(params.getRows());
query.setSort(BaseSuggestIndex.Fd.count.name(), ORDER.desc);

//查询结果
try {
QueryResponse response = solrClient.query(query);
long numFound = response.getResults().getNumFound();
List<BaseSuggestIndex> words = response.getBeans(BaseSuggestIndex.class);
logger.info("Date={},formula={},NumFound={}",new Date(), exe,numFound);

ResultData<List<BaseSuggestIndex>> result = new ResultData<List<BaseSuggestIndex>>();
result.setData(words);
result.setTotalCount(numFound);
result.setSuccess(true);
return result;
} catch (Exception e) {
logger.error(" q={} in job solr query fail.", query.getQuery(), e);
return null;
}
}

/**
* 类加载后执行  客户端赋值
*/
@Override
public void afterPropertiesSet() throws Exception {
solrClient = solrServiceWrapperImpl.getCollection(solrSuggestName);
}

}


关于拼音加汉字完成搜索就建议的思考:

查看百度的 搜索建议可以发现如下图



可以发现 百度做的处理也就是将汉字变为了拼音 然后再搜索即可

具体实现--

如果传过来的都是汉字---

如果传过来的都是字符--

如果传过来的是汉字加字符

三种方式的 处理方式---判断后在处理下

代码的实现大概都是差不多了 使用pinyin4j.jar来 完成汉字到拼音的 工作即可

其余的优化 下 代码就可以了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: