type : query

ICE 내부 특정 NodeType에 대한 쿼리를 실행하기 위한 API 유형으로, 다음과 같은 추가적인 항목을 정의한다.

pid

valueType

description

pid

valueType

description

tid

REFERENCE

대상 Node Type

customFilter

STRING

프로그래밍으로 검색 질의를 작성하고 싶은 경우 해당 필터 클래스 설정

query

CHILDREN

ICE내에서 공통으로 사용하는 Lucene 기반의 쿼리를 이용하여 검색 조건을 정의

(apiQuery 에 상세 정의)

 

apiQuery

pid

valueType

description

pid

valueType

description

methohd

CODE

조회형식, 검색조건

  • "method": "matching"

  • "method": "sorting"

  • "method": "page"

(아래 method 상세 정의)

field

STRING

검색할 대상 nodeType의 propertyType id (pid)

value

STRING

조건값

useCacheKey

BOOLEAN

cacheKey 조합에 사용 여부

 

useCacheKey

cacheKey조합에 사용 여부를 apiQuery field 단위로 설정할 수 있다.

apiConfig의 "cacheable": true, cacheTime 설정이 되어있어야 useCacheKey 사용 가능하다.

default : true

{ "typeId": "api", "category": "snack", "apiId": "list", "apiName": "snack List", "apiType": "service", "method": "GET", "parameters": [ ], "statistic": true, "aggregation": false, "root": { "configId": "root", "tid": "snack", "type": "query", "cacheable": true, "cacheTime": 60, "customResponse": "sampleResponse", "query": [ { "method": "matchingShould", "field": "id", "value": "{{:id}}" }, { "method": "matchingShould", "field": "name", "value": "{{:name}}" } ], "response": [ { "field": "_all_", "type": "all" } ] }

{{protocol}}://{{hostname}}:{{port}}/svc/snack/list?_siteId=bestshop&id=104&name=오레오

cacheKey api::snack>list?&id.matchingShould=104&name.matchingShould=오레오

{     "result": "200",     "resultMessage": "SUCCESS",     "totalCount": 2,     "totalTypeCount": 20,     "resultCount": 2,     "items": [         {             "id": "104",             "label": "쿠크다스",             "name": "쿠크다스",             "idx": 1         },         {             "id": "103",             "label": "오레오",             "name": "오레오",             "idx": 2         }     ] }

 

{ "typeId": "api", "category": "snack", "apiId": "list", "apiName": "snack List", "apiType": "service", "method": "GET", "parameters": [ ], "statistic": true, "aggregation": false, "root": { "configId": "root", "tid": "snack", "type": "query", "cacheable": true, "cacheTime": 60, "customResponse": "sampleResponse", "query": [ { "method": "matchingShould", "field": "id", "value": "{{:id}}", "useCacheKey": false }, { "method": "matchingShould", "field": "name", "value": "{{:name}}" } ], "response": [ { "field": "_all_", "type": "all" } ] } }

{{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=오레오

cacheKey에서 id 제외

[ id=104, name=오레오 ] 로 검색 후 cacheKey에 60초간 캐싱

이후 [ id=105, name=오레오 ] 로 검색하더라도 60초간 응답결과는 변화가 없다.

 

 

method

 

 

customFilter

apiConfig의 query 조건으로 정의가 힘든 경우 직접 검색 질의를 커스텀 할 수 있다.

apiQuery에 customFilter가 AND로 질의가 추가된다.

커스텀 처리가 필요한 경우 해당 서비스 정의를 해야한다.

 

아래는 customFilter를 추가하는 사례이다.

  • Class 추가

    • location : net/ion/ice/core/query/filter

    • implements QueryFilter 하는 class 를 하나 생성한다.

  • @Component 어노테이션 추가

    • @Component("productSearchFilter")

  • custom 질의 작성

    • createQuery안에 Lucene에서 제공하는 쿼리로 직접 질의를 작성할 수 있다.

 

  • apiConfig에 customFilter 세팅

    • @Component 어노테이션 명으로 작성한다.

  • 아래 API 설명

    • apiConfig query

      • name을 wildcard로 쿼리

    • customFilter

      • tags를 matching으로 쿼리

name의 "analyzer": "simple" - like 검색을 wildcard로 할 수 있다.

tags의 "analyzer": "code" - 콤마로 tokenize 되어있으므로 쪼개진 word에 대하여 matching으로 equals 검색을 할 수 있다.

 

  • name like ‘%오레오%’인 검색 결과

  • name like ‘%오레오%’ 이고 tags include ‘민트초코’ 인 검색 결과