搜索系统4:简单的通用搜索模块

来源:互联网 发布:造价师网络教育 编辑:程序博客网 时间:2024/06/01 10:17
上文说的导入业务数据,实际上说的构建索引。有了索引,就可以提供搜索服务了。如果使用solrj,比较简单:
SolrQuery query = new SolrQuery();
query.set("q", "*:*");
//传入的选择条件
query.setStart(0);
query.setRows(500);
QueryResponse rsp = server.query(query);
List list = rsp.getBeans(ViewItem.class);

这里需要定义一下ViewItem由那些字段组成,并且把这些字段与solr的schemal里配置的字段关连起来。如下:
class ViewItem {
@Field
private String id;
@Field
private String name;

对于传入的条件,可以先用一个Map的params传进来,再遍历设置一下:
List fqs = new ArrayList();
for(Entry entry:params.entrySet()){
fqs.add(entry.getKey()+":"+entry.getValue());
}
if (fqs.size() > 0) {
String[] fqsArray = fqs.toArray(new String[0]);
query.setFilterQueries(fqsArray);
}
如果要把这代码做得再通用一些,可以把collection(相当于数据表)与返回实体类也传进来,定义如下Controller接口:
public List queryPage(String collection,String resultCls, int start,int pageSize,HttpServletRequest req)
这样,传那个collection,返回什么对象类型都可以自定义了。至于过滤的条件,可以用param.开头的参数来定义。比如:
要查询name中包含"中中"的,那么参数就是param.name='中中',再把这个解析为上面传入的选择条件(params)就可以了。
当然实际的业务情况比这复杂得多,还有大于小于、转换等情况,在后面遇到实际的项目再说。
比如下面的这种搜索需求,就不能用这样简单的搜索,因为还要对"拼团“这个词做特殊处理。