ICE 내부 특정 NodeType에 대한 쿼리를 실행하기 위한 API 유형으로, 다음과 같은 추가적인 항목을 정의한다.
pid | valueType | description |
---|---|---|
tid | REFERENCE | 대상 Node Type |
customFilter | STRING | 프로그래밍으로 검색 질의를 작성하고 싶은 경우 해당 필터 클래스 설정 |
query | CHILDREN | ICE내에서 공통으로 사용하는 Lucene 기반의 쿼리를 이용하여 검색 조건을 정의 (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
{{protocol}}://{{hostname}}:{{port}}/svc/snack/list?_siteId=bestshop&id=104&name=오레오 cacheKey api::snack>list?&id.matchingShould=104&name.matchingShould=오레오
|
{{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=오레오
|
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": "민트초코,초코쿠키" } ] } |