ICE 내부 특정 NodeType에 대한 쿼리를 실행하기 위한 API 유형으로, 다음과 같은 추가적인 항목을 정의한다.
pid | valueType | description |
---|---|---|
tid | REFERENCE | 대상 Node Type |
customFilter | STRING | 프로그래밍으로 검색 질의를 작성하고 싶은 경우 해당 필터 클래스 설정 |
query | CHILDREN | ICE내에서 공통으로 사용하는 Lucene 기반의 쿼리를 이용하여 검색 조건을 정의 (apiQuery 에 상세 정의) |
apiQuery
pid | valueType | description |
---|---|---|
methohd | CODE | 조회형식, 검색조건
(아래 method 상세 정의) |
field | STRING | 검색할 대상 nodeType의 propertyType id (pid) |
value | STRING | 조건값 |
useCacheKey | BOOLEAN | cacheKey 조합에 사용 여부 |
useCacheKey
cacheKey조합에 사용 여부를 apiQuery field 단위로 설정할 수 있다.
apiConfig의 "cacheable": true
, cacheTime
설정이 되어있어야 useCacheKey 사용 가능하다.
default : true
method
PropertyType analyzer에 의한 색인(index)에 query Method로 질의를 할 수 있다.
analyzer에 따라 같은 Method 질의의 결과가 달라질 수 있다.
ID | Description |
---|---|
matching | like |
notMatching | not like |
matchingShould | or 검색 should 끼리 or로 처리 |
wildcard | like |
notWildcard | not like |
wildcardShould | or 검색 should 끼리 or로 처리 |
equals | only DB |
above | >= |
below | <= |
excess | > |
under | < |
fromto | { "field": "created", "method": "fromto", "value": "20200101~20201231" } |
hasReferenced | |
referenceJoin | PropertyType의 참조 nodeType (referenceType)에 Join 을 할 수 있다 { "field": "product", "method": "referenceJoin", "value": "saleSatatus_matching=selling&saleEndDate_above={{:today}}" } |
sorting | 정렬 { "method": "sorting", "value": "created desc" } |
page | 페이지 번호 default : 1 |
pageSize | 페이징 기준 사이즈 default : 10
{ "result": "200", "resultMessage": "SUCCESS", "totalCount": 38, "totalTypeCount": 489, "resultCount": 10, "pageSize": 10, "pageCount": 4, "currentPage": 1, "items": [ { "id": 1716647245, "title": "공지합니다. (수정)", "owner": { "value": "anonymous", "label": "Anonymous User", "refId": "user::anonymous" }, "created": "2020-07-30 15:38:09" } ... ] } |
includeReferenced | PropertyType의 하위 노드 리스트를 pid 객체에 반환
{ "method": "includeReferenced", "value": "users" }
{ "result": "200", "resultMessage": "SUCCESS", "item": { "id": "admin", "typeId": "adminGroup", "name": "Admin Group", "users": [ { "id": "admin1", "group": { "value": "admin", "label": "Admin Group", "refId": "admin" }, "name": "관리자테스트", }, { "id": "defaultAdmin", "group": { "value": "admin", "label": "Admin Group", "refId": "admin" }, "name": "Default Admin User" } ] } } |
referenceView | PropertyType의 참조 객체 데이터를 읽어와서 Object로 pid 객체의 item에 리턴 { "method": "referenceView", "value": "seller" }
{ "result": "200", "resultMessage": "SUCCESS", "totalCount": 311, "totalTypeCount": 311, "resultCount": 1, "more": true, "moreCount": 311, "items": [ { "id": 1762538, "label": "LG G pad 5 10.1 FHD WiFi", "seller": { "value": "1174839437", "label": "[seller] LG U+", "refId": "1174839437" } } ] }
{ "result": "200", "resultMessage": "SUCCESS", "totalCount": 311, "totalTypeCount": 311, "resultCount": 1, "more": true, "moreCount": 311, "items": [ { "id": 1762538, "label": "LG G pad 5 10.1 FHD WiFi", "seller": { "value": "1174839437", "label": "[seller] LG U+", "refId": "1174839437", "item": { "id": "1174839437", "name": "[seller] LG U+", "sellerType": { "value": "individual", "label": "개인" }, "address": { "id": "3366057", "address": "서울 강남구", "detailAddress": "테헤란로10길 15", "zipCode": "06234", "fullAddress": "(06234) 서울 강남구 테헤란로10길 15", "label": "" } ... } } } ] } |
facet | value 기준 group by 된 count 를 Object로 반환 { "method": "facet", "value": "apiType,user" } { "result": "200", "resultMessage": "SUCCESS", "totalCount": 81, "totalTypeCount": 81, "resultCount": 81, "facets": { "apiType": { "internal": 5, "service": 12, "admin": 64 }, "user": { "customer::233174268": 11, "admin::system": 58 } }, "items": [ { ... } ] } |
limit | 쿼리 결과 제한 건수 { "method": "limit", "value": "2" } resultCount : 2 { "result": "200", "resultMessage": "SUCCESS", "totalCount": 311, "totalTypeCount": 311, "resultCount": 2, "more": true, "moreCount": 155, "items": [ ... ] } |
customFilter
apiConfig의 query 조건으로 정의가 힘든 경우 직접 검색 질의를 커스텀 할 수 있다.
apiQuery에 customFilter가 AND로 질의가 추가된다.
커스텀 처리가 필요한 경우 해당 서비스 정의를 해야한다.
아래는 상품 통합 검색 API에 customFilter를 추가하는 사례이다.
Class 추가
implements QueryFilter
하는 class 를 하나 생성한다.
@Component 어노테이션 추가
@Component("productSearchFilter")
custom 질의 작성
createQuery안에 Lucene에서 제공하는 쿼리로 직접 질의를 작성할 수 있다.
Lucene Query
|
@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 어노테이션 명으로 작성한다.
{ "configId": "root", "tid": "siteProduct", "type": "query", "customFilter": "productSearchFilter", }
Sample
{ "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" } ] } }