ICE 내부 특정 NodeType에 대한 쿼리를 실행하기 위한 API 유형으로, 다음과 같은 추가적인 항목을 정의한다.
...
Expand | ||||
---|---|---|---|---|
| ||||
{{protocol}}://{{hostname}}:{{port}}/svc/snack/list?_siteId=bestshop&id=104&name=오레오 cacheKey api::snack>list?&id.matchingShould=104&name.matchingShould=오레오
|
Expand | ||||
---|---|---|---|---|
| ||||
{{protocol}}://{{hostname}}:{{port}}/svc/snack/list?_siteId=bestshop&id=104&name=오레오{{protocol}}://{{hostname}}:{{port}}/svc/snack/list?_siteId=bestshop&id=105&name=오레오 cacheKey api::snack>list?&name.matchingShould=오레오
|
...
커스텀 처리가 필요한 경우 해당 서비스 정의를 해야한다. title Expand
아래는 상품 통합 검색 API에 customFilter를 추가하는 사례이다.
Class 추가
implements QueryFilter
하는 class 를 하나 생성한다.
@Component 어노테이션 추가
@Component("productSearchFilter")
custom 질의 작성
createQuery안에 Lucene에서 제공하는 쿼리로 직접 질의를 작성할 수 있다.
Lucene Query
|
Code Block |
---|
@Override
public Query createQuery(QueryContext context) {
BooleanQuery.Builder searchQueryBuilder = new BooleanQuery.Builder();
String searchValue = context.getDataStringValue("searchValue");
String reSearchValue = context.getDataStringValue("reSearchValue"); //결과 내 재검색
if ("".equals(searchValue)) {
return null;
}
if (!"".equals(searchValue)) {
BooleanQuery.Builder searchValueQueryBuilder = getSearchValueBuilder(searchValue);
searchQueryBuilder.add(searchValueQueryBuilder.build(), BooleanClause.Occur.MUST);
}
return searchQueryBuilder.build();
} |
apiConfig에 customFilter 세팅
@Component 어노테이션 명으로 작성한다.
Code Block |
---|
{
"configId": "root",
"tid": "siteProduct",
"type": "query",
"customFilter": "productSearchFilter",
} |
Sample
Code Block | ||
---|---|---|
| ||
{ "typeId": "api", "category": "product", "apiId": "read", "apiName": "상품 조회", "apiType": "service", "method": "GET", "parameters": [ { "parameter": "productId", "name": "상품ID", "valueType": "STRING", "required": true } ], "statistic": true, "aggregation": false, "root": { "configId": "root", "tid": "siteProduct", "type": "query", "resultType": "OBJECT", "cacheable": false, "cacheTime": 1, "allowParams": false, "orderNo": 1, "customResponse": "productReadResponse", "query": [ { "method": "matching", "field": "id", "value": "{{:productId}}" }, { "method": "matching", "field": "approvalStatus", "value": "approval" }, { "method": "matching", "field": "saleStatus", "value": "selling" }, { "method": "matching", "field": "exposure", "value": "true" }, { "method": "matching", "field": "deleted", "value": "false" }, { "method": "matching", "field": "site", "value": "{{:_siteId}}" } ], "response": [ { "field": "id", "type": "field", "value": "" }, { "field": "name", "type": "field", "value": "" }, { "field": "siteProductSaleInfo", "type": "field", "value": "" }, { "field": "optionType", "type": "field", "value": "baseProduct.productOptionInfo.optionType" }, { "field": "productOptionCodes", "type": "field", "value": "baseProduct.productOptionInfo.productOptionCodes" }, { "field": "productOptions", "type": "field", "value": "baseProduct.productOptionInfo.productOptions" }, { "field": "productDetail", "type": "field", "value": "baseProduct.productDetail" }, { "field": "images", "type": "field", "value": "baseProduct.images" }, { "field": "videos", "type": "field", "value": "baseProduct.videos" } ] } } |
...