AWS云搜索的使用极简Java API.docx

上传人:b****8 文档编号:13119525 上传时间:2023-06-11 格式:DOCX 页数:17 大小:23.60KB
下载 相关 举报
AWS云搜索的使用极简Java API.docx_第1页
第1页 / 共17页
AWS云搜索的使用极简Java API.docx_第2页
第2页 / 共17页
AWS云搜索的使用极简Java API.docx_第3页
第3页 / 共17页
AWS云搜索的使用极简Java API.docx_第4页
第4页 / 共17页
AWS云搜索的使用极简Java API.docx_第5页
第5页 / 共17页
AWS云搜索的使用极简Java API.docx_第6页
第6页 / 共17页
AWS云搜索的使用极简Java API.docx_第7页
第7页 / 共17页
AWS云搜索的使用极简Java API.docx_第8页
第8页 / 共17页
AWS云搜索的使用极简Java API.docx_第9页
第9页 / 共17页
AWS云搜索的使用极简Java API.docx_第10页
第10页 / 共17页
AWS云搜索的使用极简Java API.docx_第11页
第11页 / 共17页
AWS云搜索的使用极简Java API.docx_第12页
第12页 / 共17页
AWS云搜索的使用极简Java API.docx_第13页
第13页 / 共17页
AWS云搜索的使用极简Java API.docx_第14页
第14页 / 共17页
AWS云搜索的使用极简Java API.docx_第15页
第15页 / 共17页
AWS云搜索的使用极简Java API.docx_第16页
第16页 / 共17页
AWS云搜索的使用极简Java API.docx_第17页
第17页 / 共17页
亲,该文档总共17页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

AWS云搜索的使用极简Java API.docx

《AWS云搜索的使用极简Java API.docx》由会员分享,可在线阅读,更多相关《AWS云搜索的使用极简Java API.docx(17页珍藏版)》请在冰点文库上搜索。

AWS云搜索的使用极简Java API.docx

AWS云搜索的使用极简JavaAPI

AWS云搜索的使用:

极简JavaAPI

当前,许多应用重度依赖于搜索功能。

从电子商务网站中寻找合适的产品,到社交网络中搜索寻人,再到地图网站中寻找POI和地址,依赖于搜索的应用非常广泛。

亚马逊新推出的云搜索服务,为自行实现搜索功能或定制安装ApacheLucene、ApacheSolr和elasticsearch等流行产品提供了可行的替代方式。

他们这样描述该服务:

“它是一个完全托管的云搜索服务,该服务允许用户十分方便地在应用中集成快速且高度可扩展的搜索功能。

【它】让用户摆脱了运营和扩展搜索平台的负担。

用户不用再去关心硬件配置、数据分区和软件补丁的问题了。

这个实现方式中,我们发现的唯一缺点是缺乏用于上传数据和实现搜索的JavaAPI。

虽然亚马逊提供的RESTAPI也能达到上述的目的,但是在Java代码中使用它们并不方便。

为了简化搜索调用和数据上传功能,我们开发了一些简单的JavaAPI,将在本文中逐一介绍。

数据定义

尽管亚马逊提供了数据上传和搜索响应的数据定义(以XML和JSON两种方式),但数据上传的文档中仅定义了RelaxNG模式,而搜索响应则未定义任何模式。

在我们的实现方式中,我们决定使用XML数据格式而不是JSON,这是因为进行XML数据封装更加简单——XML使用规范的数据格式,而JSON则是动态的(JSON的标签是动态定义,每个请求各异)。

我们分别用下边的两种模式(列表1和列表2)来上传数据和搜索结果。

xmlversion="1.0"encoding="UTF-8"?

>

schemaxmlns:

xsd="http:

//2001/XMLSchema"elementFormDefault="qualified">

………………………………………………………………………………………….

complexTypename="fieldType">

simpleContent>

extensionbase="xsd:

string">

attributename="name"type="field_nameType"/>

extension>

simpleContent>

complexType>

complexTypename="addType">

sequence>

elementname="field"type="fieldType"maxOccurs="unbounded"/>

sequence>

attributename="id"type="IDType"/>

attributename="version"type="versionType"/>

attributename="lang"type="xsd:

language"/>

complexType>

complexTypename="deleteType">

attributename="id"type="IDType"/>

attributename="version"type="versionType"/>

complexType>

complexTypename="batchType">

sequence>

elementname="add"type="addType"minOccurs="0"maxOccurs="unbounded"/>

elementname="delete"type="deleteType"minOccurs="0"maxOccurs="unbounded"/>

sequence>

complexType>

elementname="batch"type="batchType"/>

simpleTypename="statusType">

restrictionbase="xsd:

string">

enumerationvalue="success"/>

enumerationvalue="error"/>

restriction>

simpleType>

complexTypename="errorsType">

sequence>

elementname="error"type="xsd:

string"maxOccurs="unbounded"/>

sequence>

complexType>

complexTypename="warningsType">

sequence>

elementname="warning"type="xsd:

string"maxOccurs="unbounded"/>

sequence>

complexType>

complexTypename="responseType">

sequence>

elementname="errors"type="errorsType"minOccurs="0"/>

elementname="warnings"type="warningsType"minOccurs="0"/>

sequence>

attributename="status"type="statusType"/>

attributename="adds"type="xsd:

int"/>

attributename="deletes"type="xsd:

int"/>

complexType>

elementname="response"type="responseType"/>

schema>

Listing1Uploaddataschema

schemaxmlns:

xsd="http:

//www.w3.org/2001/XMLSchema"

targetNamespace="

xmlns="

elementFormDefault="qualified">

complexTypename="constraintType">

attributename="value"type="xsd:

string"/>

attributename="count"type="xsd:

int"/>

complexType>

complexTypename="facetType">

sequence>

elementname="constraint"type="constraintType"maxOccurs="unbounded"/>

sequence>

attributename="name"type="xsd:

string"/>

complexType>

complexTypename="facetsType">

sequence>

elementname="facet"type="facetType"maxOccurs="unbounded"/>

sequence>

complexType>

complexTypename="infoType">

attributename="rid"type="xsd:

string"/>

attributename="time-ms"type="xsd:

int"/>

attributename="cpu-time-ms"type="xsd:

int"/>

complexType>

complexTypename="dType">

simpleContent>

extensionbase="xsd:

string">

attributename="name"type="xsd:

string"/>

extension>

simpleContent>

complexType>

complexTypename="hitType">

sequence>

elementname="d"type="dType"maxOccurs="unbounded"/>

sequence>

attributename="id"type="xsd:

string"/>

complexType>

complexTypename="hitsType">

sequence>

elementname="hit"type="hitType"maxOccurs="unbounded"/>

sequence>

attributename="found"type="xsd:

int"/>

attributename="start"type="xsd:

int"/>

complexType>

complexTypename="resultsType">

sequence>

elementname="rank"type="xsd:

string"/>

elementname="match-expr"type="xsd:

string"/>

elementname="hits"type="hitsType"minOccurs="0"/>

elementname="facets"type="facetsType"minOccurs="0"/>

elementname="info"type="infoType"/>

sequence>

complexType>

elementname="results"type="resultsType"/>

complexTypename="messageType">

attributename="severity"type="xsd:

string"/>

attributename="code"type="xsd:

string"/>

attributename="message"type="xsd:

string"/>

complexType>

complexTypename="errorType">

sequence>

elementname="error"type="xsd:

string"/>

elementname="rid"type="xsd:

string"/>

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;

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2