elementname="time-ms"type="xsd:
int"/>
elementname="cpu-time-ms"type="xsd:
int"/>
elementname="messages"type="messageType"maxOccurs="unbounded"/>
sequence>
complexType>
elementname="error"type="errorType"/>
schema>
Listing2Searchresultsdataschema
我们使用xjcbindingcompiler生成上述的两种模式的Java类,这样就能通过JavaArchitectureforXMLBinding(JAXB)进行自动封装/解封装。
查询定义
除了数据定义,实现搜索API还需要查询定义。
我们已经创建了一组类,用来实现亚马逊的查询定义。
这个搜索查询的核心是过滤器。
我们引入了SearchQueryFilter接口,并提供了两种实现方式——SearchQueryValueFilter(列表3)和SearchQueryFilterOperation(列表4)。
publicclassSearchQueryValueFilterimplementsSearchQueryFilter{
privateString_field;
privateString_value;
privateboolean_isExclude;
privateboolean_isNumeric;
publicSearchQueryValueFilter(){}
publicSearchQueryValueFilter(Stringfield,Stringvalue,booleanisNumeric,booleanisExclude){
_field=field;
_value=value;
_isExclude=isExclude;
_isNumeric=isNumeric;
}
publicStringgetField(){
return_field;
}
publicvoidsetField(Stringfield){
_field=field;
}
publicStringgetValue(){
return_value;
}
publicvoidsetValue(Stringvalue){
_value=value;
}
publicbooleanisExclude(){
return_isExclude;
}
publicvoidsetExclude(booleanisExclude){
_isExclude=isExclude;
}
publicbooleanisNumeric(){
return_isNumeric;
}
publicvoidsetNumeric(booleanisNumeric){
_isNumeric=isNumeric;
}
@Override
publicStringtoString(){
StringBuffersb=newStringBuffer();
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(")");
}
returnsb.toString();
}
}
Listing3Valuefilterimplementation
publicclassSearchQueryFilterOperationimplementsSearchQueryFilter{
List_filters;
FilterOperation_operation;
publicSearchQueryFilterOperation(){
_operation=FilterOperation.and;
_filters=newLinkedList();
}
publicListgetFilters(){
return_filters;
}
publicvoidsetFilters(Listfilters){
_filters=filters;
}
publicvoidaddFilters(SearchQueryFilterfilter){
_filters.add(filter);
}
publicFilterOperationgetOperation(){
return_operation;
}
publicvoidsetOperation(FilterOperationoperation){
_operation=operation;
}
@Override
publicStringtoString(){
StringBuffersb=newStringBuffer();
sb.append("(");
sb.append(_operation);
for(SearchQueryFilterf:
_filters){
sb.append("");
sb.append(f);
}
sb.append(")");
returnsb.toString();
}
publicenumFilterOperation{
and,or
}
}
Listing4Operationfilterimplementation
SearchQueryValueFilter类支持开发者使用等于、小于、大于、区间(同样支持负值比较)等运算符设置单个字段的限制。
而SearchQueryFilterOperation类还支持开发者使用AND/OR操作符,将多个SearchQueryValueFilters和SearchQueryFilterOperations组合使用。
通过这两个类的组合使用,就能实现亚马逊云搜索所支持的任意查询过滤器的表达式了。
亚马逊云搜索支持分面分类(Facetedclassification):
“分面分类系统支持对一个对象赋予多个特征(属性),支持按照多种方式对分类排序,而非按照单一的、预定的分类顺序。
一个分面包括‘定义清晰、相互独立、完全穷尽的方面,某类属性、特征或是特定的主题’。
【1】例如,藏书可以按照作者,主题,日期等归类。
”
分面分类应用于分面搜索系统,用户在这种系统中能够从多方面进行信息的导航(译者注:
如书籍可以从作者、主题、出版日期等不同的分面),多方面对应于不同顺序的分面。
AWS支持按分面控制搜索执行以及对搜索结果排序。
同时还支持开发者控制返回的搜索结果中包含的分面数量。
所有的分面操作由SearchQueryFacet(列表5)这个类来实现。
publicclassSearchQueryFacet{
privateString_name;
privateint_maxFacets;
privateList_constraints;
privateFacetSort_sort;
publicSearchQueryFacet(Stringname){
_name=name;
_maxFacets=-1;
_constraints=null;
_sort=FacetSort.none;
}
publicSearchQueryFacet(Stringname,intmaxFacets){
_name=name;
_maxFacets=maxFacets;
_constraints=null;
_sort=FacetSort.none;
}
publicSearchQueryFacet(Stringname,intmaxFacets,FacetSortsort){
_name=name;
_maxFacets=maxFacets;
_constraints=null;
_sort=sort;
}
publicSearchQueryFacet(Stringname,intmaxFacets,Listconstraints){
_name=name;
_maxFacets=maxFacets;
_constraints=constraints;
_sort=FacetSort.none;
}
publicSearchQueryFacet(Stringname,Listconstraints){
_name=name;
_maxFacets=-1;
_constraints=constraints;
_sort=FacetSort.none;
}
publicSearchQueryFacet(Stringname,FacetSortsort,Listconstraints){
_name=name;
_maxFacets=-1;
_constraints=constraints;
_sort=sort;
}
publicSearchQueryFacet(Stringname,FacetSortsort){
_name=name;
_maxFacets=-1;
_constraints=null;
_sort=sort;
}
publicStringgetName(){
return_name;
}