ICE 내부 특정 NodeType에 대한 쿼리를 실행하기 위한 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 추가
location : net/ion/ice/core/query/filter
implements QueryFilter
하는 class 를 하나 생성한다.
@Component 어노테이션 추가
@Component("productSearchFilter")
custom 질의 작성
createQuery안에 Lucene에서 제공하는 쿼리로 직접 질의를 작성할 수 있다.
Lucene Query
|
Code Block |
---|
...
@Component("sampleFilter") public |
...
class |
...
SampleFilter implements QueryFilter{ @Override |
...
|
...
public |
...
Query |
...
createQuery(QueryContext context) { |
...
BooleanQuery.Builder |
...
searchQueryBuilder = new |
...
BooleanQuery. |
...
Builder( |
...
);
String |
...
tags = context.getDataStringValue(" |
...
tags"); |
...
if ("".equals( |
...
tags)) { return null; } |
...
BooleanQuery.Builder searchValueQueryBuilder = new BooleanQuery.Builder |
...
( |
...
); try { |
...
|
...
|
...
Query tagsQuery = LuceneQueryUtils.createLuceneQuery(new QueryTerm(QueryTerm.QueryTermType.NODE, "tags", "code", "matching", |
...
tags, PropertyType.ValueType.STRING)); |
...
apiConfig에 customFilter 세팅
@Component 어노테이션 명으로 작성한다.
...
...
|
...
|
...
|
...
|
...
searchValueQueryBuilder.add(tagsQuery, BooleanClause.Occur.SHOULD); |
...
|
...
} |
...
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", catch (IOException e) { } searchQueryBuilder.add(searchValueQueryBuilder.build(), BooleanClause.Occur.MUST); return searchQueryBuilder.build(); } } |
apiConfig에 customFilter 세팅
@Component 어노테이션 명으로 작성한다.
아래 API 설명
apiConfig query
name을 wildcard로 쿼리
customFilter
tags를 matching으로 쿼리
name의
"analyzer": "simple"
- like 검색을 wildcard로 할 수 있다.tags의
"analyzer": "code"
- 콤마로 tokenize 되어있으므로 쪼개진 word에 대하여 matching으로 equals 검색을 할 수 있다.
Expand | ||
---|---|---|
| ||
|
Code Block |
---|
{ "typeId": "api", "category": "snack", "apiId": "search", "apiName": "snack search List", "apiType": "service", "method": "GET", "parameters": [ { "parameter": "name", "name": "이름", "valueType": "STRING", "required": false }, { "parameter": "tags", "name": "검색어", "valueType": "STRING", "required": false } ], "statistic": true, "aggregation": false, "root": { "configId": "root", "tid": "snack", "type": "query", "customFilter": "sampleFilter", "query": [ { "valuemethod": "approvalwildcard", }, "field": "name", { "value"method: "{{: "matching",name}}" } "field": "saleStatus", ], "valueresponse": "selling" [ }, { { "methodfield": "matchingid", "fieldtype": "exposurefield", "value": "true" }, { "methodfield": "matchingname", "fieldtype": "deletedfield", "value": ""false" }, { "methodfield": "matchingvendor", "fieldtype": "sitefield", "value": "{{:_siteId}}" } ], }, "response": [ { { "field": "idtags", "type": "field", "value": "" }, { "field": "name", } ] "type": "field", } } |
name like ‘%오레오%’인 검색 결과
Code Block |
---|
{{protocol}}://{{hostname}}:{{port}}/svc/snack/search?_siteId=bestshop&name=오레오 { "valueresult": "" }, { "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" } ] }200", "resultMessage": "SUCCESS", "totalCount": 3, "totalTypeCount": 20, "resultCount": 3, "items": [ { "id": "103", "name": "오레오", "vendor": "크래프트푸즈,동서식품", "tags": "초콜릿쿠키,하얀크림,샌드" }, { "id": "119", "name": "오레오 민트초코", "vendor": "크래프트푸즈,동서식품", "tags": "민트초코,초코쿠키" }, { "id": "120", "name": "오레오 딸기", "vendor": "크래프트푸즈,동서식품", "tags": "딸기" } ] } |
name like ‘%오레오%’ 이고 tags include ‘민트초코’ 인 검색 결과
Code Block |
---|
{{protocol}}://{{hostname}}:{{port}}/svc/snack/search?_siteId=bestshop&name=오레오&tags=민트초코
{
"result": "200",
"resultMessage": "SUCCESS",
"totalCount": 1,
"totalTypeCount": 20,
"resultCount": 1,
"items": [
{
"id": "119",
"name": "오레오 민트초코",
"vendor": "크래프트푸즈,동서식품",
"tags": "민트초코,초코쿠키"
}
]
} |