1、AWS云搜索的使用极简Java APIAWS云搜索的使用:极简Java API 当前,许多应用重度依赖于搜索功能。从电子商务网站中寻找合适的产品,到社交网络中搜索寻人,再到地图网站中寻找POI和地址,依赖于搜索的应用非常广泛。 亚马逊新推出的云搜索服务,为自行实现搜索功能或定制安装Apache Lucene、Apache Solr和elasticsearch等流行产品提供了可行的替代方式。他们这样描述该服务:“它是一个完全托管的云搜索服务,该服务允许用户十分方便地在应用中集成快速且高度可扩展的搜索功能。【它】让用户摆脱了运营和扩展搜索平台的负担。用户不用再去关心硬件配置、数据分区和软件补丁的问
2、题了。”这个实现方式中,我们发现的唯一缺点是缺乏用于上传数 据和实现搜索的Java API。虽然亚马逊提供的REST API也能达到上述的目的,但是在Java代码中使用它们并不方便。为了简化搜索调用和数据上传功能,我们开发了一些简单的Java API,将在本文中逐一介绍。 数据定义 尽管亚马逊提供了数据上传和搜索响应的数据定义(以XML和JSON两种方式),但数据上传的文档中仅定义了Relax NG 模式,而搜索响应则未定义任何模式。 在我们的实现方式中,我们决定使用XML数据格式而不是JSON,这是因为进行XML数据封装更加简单XML使用规范的数据格式,而JSON则是动态的(JSON的标签是
3、动态定义,每个请求各异)。我们分别用下边的两种模式(列表1和列表2)来上传数据和搜索结果。 . Listing 1 Upload data schema Listing 2 Search results data schema 我们使用xjc binding compiler 生成上述的两种模式的Java类,这样就能通过Java Architecture for XML Binding (JAXB)进行自动封装/解封装。 查询定义除了数据定义,实现搜索API还需要查询定义。我们已经创建了一组类,用来实现亚马逊的查询定义。这个搜索查询的核心是过滤器。我们引入了SearchQueryFilter
4、接口,并提供了两种实现方式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 SearchQueryValu
5、eFilter(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 set
6、Value(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() String
7、Buffer 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 implementationpublic class SearchQ
8、uery FilterOperation implements SearchQueryFilter List _filters; FilterOperation _operation; public SearchQueryFilterOperation() _operation = FilterOperation.and; _filters = new LinkedList(); public List getFilters() return _filters; public void setFilters(List filters) _filters = filters; public vo
9、id 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
10、); for(SearchQueryFilter f : _filters) sb.append( ); sb.append(f); sb.append(); return sb.toString(); public enum FilterOperation and, or Listing 4 Operation filter implementationSearch Query Value Filter类支持开发者使用等于、小于、大于、区间(同样支持负值比较)等运算符设置单个字段的限制。而Search Query Filter Operation类还支持开发者使用AND/OR操作符,将多个S
11、earch Query Value Filters和Search Query Filter Operations组合使用。通过这两个类的组合使用,就能实现亚马逊云搜索所支持的任意查询过滤器的表达式了。 亚马逊云搜索支持分面分类(Faceted classification): “分面分类系统支持对一个对象赋予多个特征(属性),支持按照多种方式对分类排序,而非按照单一的、预定的分类顺序。一个分面包括定义清晰、相互独立、完全穷尽的方面,某类属性、特征或是特定的主题。【1】例如,藏书可以按照作者,主题,日期等归类。” 分面分类应用于分面搜索系统,用户在这种系统中能够从多方面进行信息的导航(译者注:如
12、书籍可以从作者、主题、出版日期等不同的分面),多方面对应于不同顺序的分面。 AWS支持按分面控制搜索执行以及对搜索结果排序。同时还支持开发者控制返回的搜索结果中包含的分面数量。所有的分面操作由Search Query Facet(列表5)这个类来实现。public class SearchQueryFacet private String _name; private int _maxFacets; private List _constraints; private FacetSort _sort; public SearchQueryFacet(String name) _name = n
13、ame; _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 = max
14、Facets; _constraints = null; _sort = sort; public SearchQueryFacet(String name, int maxFacets, List constraints) _name = name; _maxFacets = maxFacets; _constraints = constraints; _sort = FacetSort.none; public SearchQueryFacet(String name, List constraints) _name = name; _maxFacets = -1; _constraint
15、s = constraints; _sort = FacetSort.none; public SearchQueryFacet(String name, FacetSort sort, List 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;
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2