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로 질의가 추가된다.
커스텀 처리가 필요한 경우 해당 서비스 정의를 해야한다.
아래는 customFilter를 추가하는 사례이다.
Class 추가
location : net/ion/ice/core/query/filter
implements QueryFilter
하는 class 를 하나 생성한다.
@Component 어노테이션 추가
@Component("productSearchFilter")
custom 질의 작성
createQuery안에 Lucene에서 제공하는 쿼리로 직접 질의를 작성할 수 있다.
Lucene Query
|
@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)); searchValueQueryBuilder.add(tagsQuery, BooleanClause.Occur.SHOULD); } 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 검색을 할 수 있다.
{ "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": [ { "method": "wildcard", "field": "name", "value": "{{:name}}" } ], "response": [ { "field": "id", "type": "field", "value": "" }, { "field": "name", "type": "field", "value": "" }, { "field": "vendor", "type": "field", "value": "" }, { "field": "tags", "type": "field", "value": "" } ] } }
name like ‘%오레오%’인 검색 결과
{{protocol}}://{{hostname}}:{{port}}/svc/snack/search?_siteId=bestshop&name=오레오 { "result": "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 ‘민트초코’ 인 검색 결과
{{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": "민트초코,초코쿠키" } ] }