ICE 내부 특정 NodeType에 대한 쿼리를 실행하기 위한 API 유형으로, 다음과 같은 추가적인 항목을 정의한다.
...
apiConfig의 "cacheable": true
, cacheTime
설정이 되어있어야 useCacheKey 사용 가능하다.
default : true
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=오레오
|
method
Include Page | ||||
---|---|---|---|---|
|
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
|
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));
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 검색을 할 수 있다.
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": [
{
"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 ‘%오레오%’인 검색 결과
Code Block |
---|
{{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 ‘민트초코’ 인 검색 결과
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": "민트초코,초코쿠키"
}
]
} |