ICE 내부 특정 NodeType에 대한 쿼리를 ICE 내부 특정 NodeType에 대한 쿼리를 실행하기 위한 API 유형으로, 다음과 같은 추가적인 항목을 정의한다.
pid | valueType | description |
---|---|---|
tid | REFERENCE | 대상 Node Type |
customFilter | STRING | 프로그래밍으로 검색 질의를 작성하고 싶은 경우 해당 필터 클래스 설정 |
query | CHILDREN | ICE내에서 공통으로 사용하는 Lucene 기반의 쿼리를 이용하여 검색 조건을 정의 (apiQuery 에 상세 정의) |
apiQuery
customFilter
apiConfig의 query 조건으로 정의가 힘든 경우 직접 검색 질의를 커스텀 할 수 있다.
apiQuery에 customFilter가 AND로 질의가 추가된다.
커스텀 처리가 필요한 경우 해당 서비스 정의를 해야한다.
...
title | 아래는 상품 통합 검색 API에 customFilter를 추가하는 사례이다. |
---|
Class 추가
implements QueryFilter
하는 class 를 하나 생성한다.
@Component 어노테이션 추가
@Component("productSearchFilter")
custom 질의 작성
createQuery안에 Lucene에서 제공하는 쿼리로 직접 질의를 작성할 수 있다.
...
Lucene Query
org.apache.lucene.search.Query
Direct Known Subclasses:BlendedTermQuery, BooleanQuery, BoostQuery, ConstantScoreQuery, DisjunctionMaxQuery, DocValuesFieldExistsQuery, IndexOrDocValuesQuery, MatchAllDocsQuery, MatchNoDocsQuery, MultiPhraseQuery, MultiTermQuery, NGramPhraseQuery, NormsFieldExistsQuery, PhraseQuery, PointInSetQuery, PointRangeQuery, SpanQuery, SynonymQuery, TermInSetQuery, TermQuery
...
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
Expand | ||
---|---|---|
| ||
|
...
|
...
|
...
|
...
|
...
|
...
|
...
|
...
|
...
|
...
|
...
|
...
|
...
apiConfig에 customFilter 세팅
@Component 어노테이션 명으로 작성한다.
Code Block |
---|
{
"configId": "root",
"tid": "siteProduct",
"type": "query",
"customFilter": "productSearchFilter",
} |
apiQuery
...
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
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?&id.matchingShould=104&name.matchingShould=오레오 Code Block |
|
method
...
Include Page |
---|
...
title | "useCacheKey": true |
---|
...
|
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 |
---|
...
Sample
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"field": "id", {"value": "{{:id}}",Query tagsQuery = LuceneQueryUtils.createLuceneQuery(new QueryTerm(QueryTerm.QueryTermType.NODE, "tags", "code", "useCacheKey matching": ,false tags, PropertyType.ValueType.STRING));}, {
searchValueQueryBuilder.add(tagsQuery, BooleanClause.Occur.SHOULD);"method": "matchingShould", "field": "name", } catch (IOException e) {"value": "{{:name}} "
} ],
searchQueryBuilder.add(searchValueQueryBuilder.build(), BooleanClause.Occur.MUST);"response": [return searchQueryBuilder.build();{ "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=오레오
|
method
...
{ "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",} } |
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": [ { "valuemethod": "approvalwildcard", }, "field": "name", { "value"method: "{{: "matching",name}}" } "field": "saleStatus", ], "valueresponse": "selling" [ }, { { "methodfield": "matchingid", "fieldtype": "exposurefield", "value": "true" }, { "methodfield": "matchingname", "fieldtype": "deletedfield", "value": ""false" }, { "methodfield": "matchingvendor", "fieldtype": "sitefield", "value": "{{:_siteId}}" } ], }, "response": [ { { "field": "idtags", "type": "field", "value": "" }, { "field": "name", } ] "type": "field", } } |
name like ‘%오레오%’인 검색 결과
Code Block |
---|
{{protocol}}://{{hostname}}:{{port}}/svc/snack/search?_siteId=bestshop&name=오레오 { "valueresult": "" }, { "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" } ] }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": "민트초코,초코쿠키"
}
]
} |