设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客

AWS云搜索的使用:极简Java API

2013-7-19 12:07| 发布者: joejoe0332| 查看: 5530| 评论: 0|原作者: Boris Lublinsky|来自: InfoQ

摘要:   当前,许多应用重度依赖于搜索功能。从电子商务网站中寻找合适的产品,到社交网络中搜索寻人,再到地图网站中寻找POI和地址,依赖于搜索的应用非常广泛。   亚马逊新推出的云搜索服务,为自行实现搜索功能或定 ...

  查询定义


  除了数据定义,实现搜索API还需要查询定义。我们已经创建了一组类,用来实现亚马逊的查询定义


  这个搜索查询的核心是过滤器。我们引入了SearchQueryFilter 接口,并提供了两种实现方式——Search Query Value Filter(列表3)和Search Query Filter Operation(列表4)。

public class SearchQueryValueFilter implements SearchQueryFilter{

    private String _field;
    private String _value;
    private boolean _isExclude;
    private boolean _isNumeric;
	  
    public SearchQueryValueFilter(){}

    public SearchQueryValueFilter(String field, String value, boolean isNumeric, boolean isExclude){
        _field = field;
        _value = value;
        _isExclude = isExclude;
	_isNumeric = isNumeric;
    }

	    public String getField() {
	        return _field;
	    }

	    public void setField(String field) {
	        _field = field;
	    }

	    public String getValue() {
	        return _value;
	    }

	    public void setValue(String value) {
	        _value = value;
	    }

	    public boolean isExclude() {
	        return _isExclude;
	    }

	    public void setExclude(boolean isExclude) {
	        _isExclude = isExclude;
	    }

	    public boolean isNumeric() {
	        return _isNumeric;
	    }

	    public void setNumeric(boolean isNumeric) {
	        _isNumeric = isNumeric;
	    }

	    @Override
	    public String toString(){
	        StringBuffer sb = new StringBuffer();
	        if(_isExclude){
	            sb.append("(not ");
	        }
	        if(_field != null){
	            sb.append(_field);
	            sb.append(":");
	        }
	        if(!_isNumeric){
	            sb.append("'");        
	        }
	        sb.append(_value);
	        if(!_isNumeric){
	            sb.append("'");        
	        }
	        if(_isExclude){
	            sb.append(")");
	        }
	        return sb.toString();
        }
}

Listing 3 Value filter implementation

public class SearchQueryFilterOperation implements SearchQueryFilter {
	    
	List<SearchQueryFilter> _filters;
	FilterOperation _operation;
	    
	public SearchQueryFilterOperation(){
	        _operation = FilterOperation.and;
	        _filters = new LinkedList<SearchQueryFilter>();
	}    
	    
	public List<SearchQueryFilter> getFilters() {
	        return _filters;
	}

	public void setFilters(List<SearchQueryFilter> filters) {
	        _filters = filters;
	}

	public void addFilters(SearchQueryFilter filter) {
	        _filters.add(filter);
	}

	public FilterOperation getOperation() {
	        return _operation;
	}

	public void setOperation(FilterOperation operation) {
	        _operation = operation;
	}

        @Override
	public String toString() {
	        StringBuffer sb = new StringBuffer();
	        sb.append("(");
	        sb.append(_operation);
	        for(SearchQueryFilter f : _filters){
	                 sb.append(" ");
	                 sb.append(f);
	        }
	        sb.append(")");
	        return sb.toString();
	}

	public enum FilterOperation{
	        and, or
	}
}

Listing 4 Operation filter implementation


  Search Query Value Filter类支持开发者使用等于、小于、大于、区间(同样支持负值比较)等运算符设置单个字段的限制。而Search Query Filter Operation类还支持开发者使用AND/OR操作符,将多个Search Query Value Filters和Search Query Filter Operations组合使用。通过这两个类的组合使用,就能实现亚马逊云搜索所支持的任意查询过滤器的表达式了。


  亚马逊云搜索支持分面分类(Faceted classification):


“分面分类系统支持对一个对象赋予多个特征(属性),支持按照多种方式对分类排序,而非按照单一的、预定的分类顺序。一个分面包括‘定义清晰、相互独立、完全穷尽的方面,某类属性、特征或是特定的主题’。【1】例如,藏书可以按照作者,主题,日期等归类。”


  分面分类应用于分面搜索系统,用户在这种系统中能够从多方面进行信息的导航(译者注:如书籍可以从作者、主题、出版日期等不同的分面),多方面对应于不同顺序的分面。


  AWS支持按分面控制搜索执行以及对搜索结果排序。同时还支持开发者控制返回的搜索结果中包含的分面数量。所有的分面操作由Search Query Facet(列表5)这个类来实现。

public class SearchQueryFacet {
	    
          private String _name;
	  private int _maxFacets;
	  private List<String> _constraints;
          private FacetSort _sort;
	    
	  public SearchQueryFacet(String name){
	           _name = name;
	           _maxFacets = -1;
	           _constraints = null;
	           _sort = FacetSort.none;
	  }

	  public SearchQueryFacet(String name, int maxFacets){
	           _name = name;
	           _maxFacets = maxFacets;
	           _constraints = null;
	           _sort = FacetSort.none;
	  }

	  public SearchQueryFacet(String name, int maxFacets, FacetSort sort){
	           _name = name;
	           _maxFacets = maxFacets;
	           _constraints = null;
	           _sort = sort;
	  }

	  public SearchQueryFacet(String name, int maxFacets, List<String> constraints){
	           _name = name;
	           _maxFacets = maxFacets;
	           _constraints = constraints;
	           _sort = FacetSort.none;
	  }

	  public SearchQueryFacet(String name, List<String> constraints){
	           _name = name;
	           _maxFacets = -1;
	           _constraints = constraints;
	           _sort = FacetSort.none;
	  }

	  public SearchQueryFacet(String name, FacetSort sort, List<String> constraints){
	           _name = name;
	           _maxFacets = -1;
	           _constraints = constraints;
	           _sort = sort;
	  }

	  public SearchQueryFacet(String name, FacetSort sort){
	           _name = name;
	           _maxFacets = -1;
	           _constraints = null;
	           _sort = sort;
	  }

	  public String getName() {
	           return _name;
	  }

	  public void setName(String name) {
	           _name = name;
	  }

	  public int getMaxFacets() {
	           return _maxFacets;
	  }

	  public void setMaxFacets(int maxFacets) {
	           _maxFacets = maxFacets;
	  }

	  public FacetSort getSort() {
	           return _sort;
	  }

	  public void setSort(FacetSort sort) {
	           _sort = sort;
	  }

	  public int get_maxFacets() {
	           return _maxFacets;
	  }

	  public void set_maxFacets(int _maxFacets) {
	           this._maxFacets = _maxFacets;
	  }

	  public List<String> getConstraints() {
	           return _constraints;
	  }

	  public void setConstraints(List<String> constraints) {
	           _constraints = constraints;
	  }

	  public void addConstraint(String constraint) {
	           if(_constraints == null)
	                      _constraints = new LinkedList<String>();
	           _constraints.add(constraint);
	  }

	  @Override
	  public String toString(){
	           StringBuffer sb = new StringBuffer();
	           sb.append("&facet=");
	           sb.append(_name);
	           if(_maxFacets > 0){
	                      sb.append("&facet-");
	                      sb.append(_name);
	                      sb.append("-top-n=");
	                      sb.append(_maxFacets);
	           }
	           if((_constraints != null) && (_constraints.size() > 0)){
	                      sb.append("&facet-");
	                      sb.append(_name);
	                      sb.append("-constraints=");
	                      boolean first = true;
	                      for(String c : _constraints){
	                                if(!first)
	                                           sb.append("%2C");
	                                else
	                                           first = false;
	                                sb.append("%27");
	                                sb.append(c);
	                                sb.append("%27");
	                     }
	           }
	           if(!_sort.equals(FacetSort.none)){
	                      sb.append("&facet-");
	                      sb.append(_name);
	                      sb.append("-sort=");
	                      sb.append(_sort);
	           }
	        
	           return sb.toString();
	  }
	    
	  public enum FacetSort{
	           none, alpha, count, max, sum
	  }
}
Listing 5 Facets control class


酷毙
2

雷人

鲜花

鸡蛋
1

漂亮

刚表态过的朋友 (3 人)

  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部