IBM Cloudant 검색 사용
검색 인덱스는 Lucene 쿼리 구문 분석기 구문을 사용하여 데이터베이스를 쿼리하는 방법을 제공합니다. 검색 인덱스는 문서에서 하나 이상의 필드를 사용합니다.
검색 인덱스를 사용하여 조회를 실행하거나, 포함된 컨텐츠를 기반으로 문서를 찾거나, 그룹, 패싯 또는 지리적 검색 관련 작업을 수행할 수 있습니다.
검색 인덱스를 작성하려면 데이터베이스의 디자인 문서에 JavaScript 함수를 추가하십시오. 하나의 검색 요청을 처리하거나 서버에서 문서 업데이트를 발견한 후 인덱스가 빌드됩니다. index
함수에서는 다음과 같은 매개변수를 사용합니다.
- 필드 이름 - 인덱스를 조회할 때 사용할 필드의 이름입니다. 이 매개변수를
default
로 설정하는 경우 조회 구문에서 필드를 지정하지 않으면 이 필드가 조회됩니다. - 인덱싱할 데이터입니다(예:
doc.address.country
). - (선택사항) 세 번째 매개변수에는
boost
,facet
,index
및store
필드가 포함되어 있습니다. 이러한 필드에 대해서는 나중에 자세히 설명합니다.
기본적으로 검색 인덱스 응답에서는 25행을 리턴합니다. 리턴되는 행 수는 limit
매개변수를 사용하여 변경할 수 있습니다. 하지만 검색의 결과 세트는 200행으로 제한됩니다. 각각의 응답에는 bookmark
필드가 포함되어 있습니다. 나중에 조회에 bookmark
필드의 값을 포함시켜 응답을 확인할 수 있습니다.
URI, IBM Cloudant 대시보드, curl 또는 브라우저 플러그인(예: Postman 또는 RESTClient) 중 하나의 방법을 사용하여 API를 조회할 수 있습니다.
다음과 같이 검색 인덱스를 정의하는 디자인 문서 예제를 참조하십시오.
{
"_id": "_design/search_example",
"indexes": {
"animals": {
"index": "function(doc){ ... }"
}
}
}
검색 인덱스 파티셔닝 유형
검색 인덱스는 다음에서 파티션 유형을 상속합니다. options.partitioned
디자인 문서의 해당 필드에 포함됩니다.
Index 함수
존재하지 않는 데이터 필드를 사용하여 인덱싱하려고 시도하는 경우 해당 시도가 실패합니다. 이 문제점을 방지하려면 적절한 보호 절을 사용하십시오.
인덱싱 함수는 문서 자체가 해당 환경에서 사용되는 메모리의 일부를 구성하는 메모리 제한 환경에서 작동합니다. 코드의 스택 및 문서가 이 메모리 내에 들어가야 합니다. 문서의 최대 크기는 64MB입니다.
검색 인덱스 내에서 동일한 필드 이름을 둘 이상의 데이터 유형으로 인덱싱하지 마십시오. 동일한 검색 index 함수에서 동일한 필드 이름이 서로 다른 데이터 유형으로 인덱싱되는 경우 오류가 발생할 수 있습니다. was indexed without position data
라는 필드를 가리키는 검색 인덱스를 쿼리할 때 이 오류가 발생합니다. 예를 들어 동일한 검색 index 함수에 이러한 두 개의 행을 모두
포함시키지 마십시오. 다음 행은 myfield
필드를 두 개의 서로 다른 데이터 유형인 문자열 "this is a string"
및 숫자 123
으로 인덱싱합니다.
index("myfield", "this is a string");
index("myfield", 123);
인덱스 필드에 포함된 함수는 데이터베이스에 있는 각각의 문서에 대해 호출되는 JavaScript 함수입니다. 이 함수는 문서를 매개변수로 사용하고 해당 문서에서 일부 데이터를 추출한 후 index
필드에 정의된 함수를 호출하여 해당 데이터를 인덱싱합니다.
index
함수에서는 세 개의 매개변수를 사용하며, 여기서 세 번째 매개변수는 선택사항입니다.
첫 번째 매개변수는 인덱스를 쿼리할 때 사용할 필드의 이름입니다. 이는 이후 쿼리의 Lucene 구문 부분에 지정되어 있습니다. 다음 조회에 예제가 표시되어 있습니다.
query=color:red
Lucene 필드 이름 color
는 index
함수의 첫 번째 매개변수입니다.
query
매개변수는 q
로 축약될 수 있기 때문에 다음 예제에서는 해당 조회를 다른 방식으로 작성하는 방법을 보여줍니다.
q=color:red
이름을 정의할 때 특수 값인 "default"
가 사용되는 경우 조회 시 필드 이름을 지정할 필요가 없습니다. 이를 통해 조회를 단순화할 수 있습니다.
query=red
두 번째 매개변수는 인덱싱할 데이터입니다. 데이터를 인덱싱하는 경우 다음과 같은 정보를 기억해 두십시오.
- 이 데이터는 문자열, 숫자 또는 부울이어야 합니다. 다른 유형의 경우 index 함수 호출 시 오류가 리턴됩니다.
- 함수를 실행할 때 오류가 리턴되는 경우 이러한 이유 또는 다른 이유로 해당 검색 인덱스에 문서가 추가되지 않습니다.
선택사항인 세 번째 매개변수는 다음과 같은 필드가 포함된 JavaScript 오브젝트입니다.
옵션 | 설명 | 값 | 기본 |
---|---|---|---|
boost |
검색 결과에서 관련성을 지정하는 숫자입니다. 1보다 큰 부스트 값으로 인덱싱된 컨텐츠는 부스트 값 없이 인덱싱된 컨텐츠보다 관련성이 더 높습니다. 부스트 값이 1보다 작은 컨텐츠는 관련성이 거의 없습니다. | 양의 부동 소수점 숫자 | 1(부스팅 없음) |
facet |
패싯이 지정된 인덱스를 작성합니다. 자세한 정보는 패싯 지정을 참조하십시오. | true |
false |
index |
데이터가 인덱싱되는지 여부 및 인덱싱되는 경우 인덱싱 방법입니다. false 로 설정된 경우 해당 데이터를 검색에 사용할 수 없지만 store 가 true 로 설정된 경우에는 여전히 인덱스에서 해당 데이터를 검색할 수 있습니다. 자세한 정보는 분석기를
참조하십시오. |
true , false |
true |
store |
true 인 경우 검색 결과에서 값이 리턴됩니다. 그렇지 않을 경우 값이 리턴되지 않습니다. |
true , false |
false |
store
매개변수를 설정하지 않을 경우 조회에 대한 응답에서 문서에 대한 인덱스 데이터 결과가 리턴되지 않습니다.
다음과 같이 검색 index 함수 예제를 참조하십시오.
function(doc) {
index("default", doc._id);
if (doc.min_length) {
index("min_length", doc.min_length, {"store": true});
}
if (doc.diet) {
index("diet", doc.diet, {"store": true});
}
if (doc.latin_name) {
index("latin_name", doc.latin_name, {"store": true});
}
if (doc.class) {
index("class", doc.class, {"store": true});
}
}
저장 vs include_docs=true
IBM Cloudant가 검색으로부터 데이터를 리턴할 때, 사용자는 store: true
또는 include_docs=true
옵션 간에 선택할 수 있습니다. 다음 설명을 참조하십시오.
- 인덱싱 시에는
{store: true}
옵션을 선택하십시오. 이 옵션은 처리하고 있는 필드를 인덱스에 저장해야 함을 나타냅니다. 필드는 인덱싱 자체에 사용되지 않더라도 "저장"될 수 있습니다. 예를 들면, 사용자는 검색 알고리즘이 전화번호 검색을 포함하지 않는 경우에도 전화번호를 "저장"하고자 할 수 있습니다. - 조회 시에는 IBM Cloud에 일치하는 각 문서의 전체 본문을 리턴하도록 요청하기 위해
?include_docs=true
를 전달할 수 있습니다.
첫 번째 옵션은 인덱스 크기가 커지지만, 이 방법은 데이터를 검색하는 가장 빠른 방법입니다. 두 번째 옵션은 인덱스 크기를 작게 유지하지만, 검색 결과 세트가 계산된 후 문서 본문을 페치해야 하므로 IBM Cloud에 대한 추가 조회 시간 작업을 추가합니다. 이 프로세스는 실행하는 데 더 오래 걸릴 수 있으며 IBM Cloud 클러스터에 부담을 가중시킵니다.
가능하다면 다음 지침을 참고하여 첫 번째 옵션을 선택하십시오
- 검색 가능하도록 할 필드만 인덱싱하십시오.
- 조회 시에 검색해야 하는 필드만 저장하십시오.
인덱스 보호 절
index
함수를 사용하려면 두 번째 매개변수로 인덱싱할 데이터 필드의 이름이 필요합니다. 문서에 해당 데이터 필드가 존재하지 않을 경우 오류가 발생합니다. 해결책은 필드가 존재하는지 확인하는 적절한 "가드 절"을 사용하는 것입니다. 이 절에는 해당 인덱스를 작성하려고 시도하기 전에 예상되는 데이터 유형이 포함되어 있습니다.
다음과 같이 인덱스 데이터 필드 유형에 대한 유효성 검증이 존재하는 않는 정의 예제를 참조하십시오.
if (doc.min_length) {
index("min_length", doc.min_length, {"store": true});
}
JavaScript typeof
연산자를 사용하여 보호 절 테스트를 구현할 수 있습니다. 해당 필드가 존재하고 예상되는 유형이 포함된 경우 올바른 유형 이름이 리턴됩니다. 보호 절 테스트가 성공하는 경우 안전하게 index 함수를 사용할 수 있음을 의미합니다. 해당 필드가 존재하지 않을 경우 예상되는 필드 유형을 수신할 수 없기 때문에 해당 필드를 인덱싱하려고 시도하지 말아야 합니다.
JavaScript에서는 다음 값 중 하나가 테스트되는 경우 결과를 false로 간주합니다.
- 'undefined'
- 널
- 숫자 +0
- 숫자 -0
- NaN(숫자가 아님)
- ""(비어 있는 문자열)
다음과 같이 인덱싱하려고 시도하기 전에 필요한 데이터 필드가 존재하는지 및 숫자를 보유하고 있는지 여부를 검사하기 위해 보호 절을 사용하는 예제를 참조하십시오.
if (typeof doc.min_length === 'number') {
index("min_length", doc.min_length, {"store": true});
}
일반 보호 절 테스트를 사용하여 후보 데이터 필드의 유형이 정의되어 있는지 확인하십시오.
다음과 같이 "일반" 보호 절 예제를 참조하십시오.
if (typeof doc.min_length) !== 'undefined') {
// The field exists, and does have a type, so we can proceed to index using it.
...
}
분석기
분석기는 텍스트 내에 있는 용어를 인식하는 방법을 정의하는 설정입니다. 자세한 내용은 검색 분석기를 참조하세요.
분석기는 복수의 언어를 인덱싱해야 하는 경우에 유용합니다.
다음 표는 IBM Cloudant 검색에서 지원되는 일반 분석기 목록입니다:
분석기 | 설명 |
---|---|
classic |
표준 Lucene 분석기 circa 버전 3.1입니다. |
email |
standard 분석기와 유사하지만 이메일 주소를 완전한 토큰으로 일치시키기 위해 더 강하게 시도합니다. |
keyword |
입력이 전혀 토큰화되지 않습니다. |
simple |
문자가 아닌 곳에서 텍스트를 나눕니다. |
simple_asciifolding |
문자가 아닌 곳에서 텍스트를 나눕니다. 문자를 가장 가까운 ASCII로 변환 |
standard |
기본 분석기입니다. 유니코드™ 텍스트 분할 알고리즘의 단어 나누기 규칙을 구현합니다. |
whitespace |
공백 경계에서 텍스트를 나눕니다. |
다음과 같이 분석기 문서 예제를 참조하십시오.
{
"_id": "_design/analyzer_example",
"indexes": {
"INDEX_NAME": {
"index": "function (doc) { ... }",
"analyzer": "$ANALYZER_NAME"
}
}
}
언어별 분석기
이러한 분석기는 특정 언어에서 흔히 사용되는 단어를 생략하고, 많은 경우 접두사와 접미사도 제거합니다. 언어의 이름은 분석기의 이름이기도 합니다.
arabic
armenian
basque
bulgarian
brazilian
catalan
cjk
(중국어, 일본어, 한국어)chinese
(smartcn
)czech
danish
dutch
english
finnish
french
german
greek
galician
hindi
hungarian
indonesian
irish
italian
japanese
(kuromoji
)latvian
norwegian
persian
polish
(stempel
)portuguese
romanian
russian
spanish
swedish
thai
turkish
언어별 분석기는 지정된 언어에 최적화되어 있습니다. 일반 분석기를 언어별 분석기와 결합할 수는 없습니다. 대신 perfield
분석기를 사용하여 문서 내에 있는 서로 다른 필드에 대해 서로 다른 분석기를 선택할 수 있습니다.
필드별 분석기
perfield
분석기는 서로 다른 필드에 대해 다양한 분석기를 구성합니다.
다음과 같이 서로 다른 필드에 대해 서로 다른 분석기를 정의하는 예제를 참조하십시오.
{
"_id": "_design/analyzer_example",
"indexes": {
"INDEX_NAME": {
"analyzer": {
"name": "perfield",
"default": "english",
"fields": {
"spanish": "spanish",
"german": "german"
}
},
"index": "function (doc) { ... }"
}
}
}
제외어
제외어는 인덱싱되지 않는 단어입니다. 제외어는 분서기 문자열을 오브젝트로 변환하여 디자인 문서 내에서 정의합니다.
keyword
, simple
및 whitespace
분석기에서는 제외어가 지원되지 않습니다.
다음 목록에는 standard
분석기의 기본 제외어가 포함되어 있습니다.
"a", "an", "and", "are", "as", "at", "be", "but", "by", "for", "if",
"in", "into", "is", "it", "no", "not", "of", "on", "or", "such",
"that", "the", "their", "then", "there", "these", "they", "this",
"to", "was", "will", "with"
색인되지 않은('중지') 단어를 정의하는 다음 예를 보십시오
{
"_id": "_design/stop_words_example",
"indexes": {
"INDEX_NAME": {
"analyzer": {
"name": "portuguese",
"stopwords": [
"foo",
"bar",
"baz"
]
},
"index": "function (doc) { ... }"
}
}
}
분석기 토큰화 테스트
_search_analyze
엔드포인트에 샘플 데이터를 게시하여 분석기 토큰화의 결과를 테스트할 수 있습니다.
다음과 같이 HTTP를 사용하여 keyword
분석기를 테스트하는 예제를 참조하십시오.
Host: $ACCOUNT.cloudant.com
POST /_search_analyze HTTP/1.1
Content-Type: application/json
{"analyzer":"keyword", "text":"ablanks@renovations.com"}
다음과 같이 명령행을 사용하여 keyword
분석기를 테스트하는 예제를 참조하십시오.
curl "https://$ACCOUNT.cloudant.com/_search_analyze" \
-H "Content-Type: application/json" \
-d '{"analyzer":"keyword", "text":"ablanks@renovations.com"}'
import com.ibm.cloud.cloudant.v1.Cloudant;
import com.ibm.cloud.cloudant.v1.model.PostSearchAnalyzeOptions;
import com.ibm.cloud.cloudant.v1.model.SearchAnalyzeResult;
Cloudant service = Cloudant.newInstance();
PostSearchAnalyzeOptions searchAnalyzerOptions =
new PostSearchAnalyzeOptions.Builder()
.analyzer("keyword")
.text("ablanks@renovations.com")
.build();
SearchAnalyzeResult response =
service.postSearchAnalyze(searchAnalyzerOptions).execute()
.getResult();
System.out.println(response);
import { CloudantV1 } from '@ibm-cloud/cloudant';
const service = CloudantV1.newInstance({});
service.postSearchAnalyze({
analyzer: 'keyword',
text: 'ablanks@renovations.com',
}).then(response => {
console.log(response.result);
});
from ibmcloudant.cloudant_v1 import CloudantV1
service = CloudantV1.new_instance()
response = service.post_search_analyze(
analyzer='keyword',
text='ablanks@renovations.com'
).get_result()
print(response)
postSearchAnalyzeOptions := service.NewPostSearchAnalyzeOptions(
"keyword",
"ablanks@renovations.com",
)
searchAnalyzeResult, _, err := service.PostSearchAnalyze(postSearchAnalyzeOptions)
if err != nil {
panic(err)
}
b, _ := json.MarshalIndent(searchAnalyzeResult, "", " ")
fmt.Println(string(b))
이전 Go 예제에서는 다음 가져오기 블록이 필요합니다.
import (
"encoding/json"
"fmt"
"github.com/IBM/cloudant-go-sdk/cloudantv1"
)
다음과 같이 keyword
분석기를 테스트한 결과를 참조하십시오.
{
"tokens": [
"ablanks@renovations.com"
]
}
다음과 같이 HTTP를 사용하여 standard
분석기를 테스트하는 예제를 참조하십시오.
Host: $ACCOUNT.cloudant.com
POST /_search_analyze HTTP/1.1
Content-Type: application/json
{"analyzer":"standard", "text":"ablanks@renovations.com"}
다음과 같이 명령행을 사용하여 standard
분석기를 테스트하는 예제를 참조하십시오.
curl "https://$ACCOUNT.cloudant.com/_search_analyze" -H "Content-Type: application/json"
-d '{"analyzer":"standard", "text":"ablanks@renovations.com"}'
다음과 같이 standard
분석기를 테스트한 결과를 참조하십시오.
{
"tokens": [
"ablanks",
"renovations.com"
]
}
쿼리
검색 인덱스를 작성한 후에는 해당 인덱스를 조회할 수 있습니다.
-
다음 요청을 사용하여 파티션 조회를 실행하십시오.
GET /$DATABASE/_partition/$PARTITION_KEY/_design/$DDOC/_search/$INDEX_NAME
-
다음 요청을 사용하여 글로벌 조회를 실행하십시오.
GET /$DATABASE/_design/$DDOC/_search/$INDEX_NAME
query
매개변수를 사용하여 검색을 지정하십시오.
다음과 같이 HTTP를 사용하여 파티션된 인덱스를 조회하는 예제를 참조하십시오.
GET /$DATABASE/_partition/$PARTITION_KEY/_design/$DDOC/_search/$INDEX_NAME?include_docs=true&query="*:*"&limit=1 HTTP/1.1
Content-Type: application/json
Host: $ACCOUNT.cloudant.com
다음과 같이 명령행을 사용하여 파티션된 인덱스를 조회하는 예제를 참조하십시오.
curl "https://$ACCOUNT.cloudant.com/$DATABASE/_partition/$PARTITION_KEY/_design/$DDOC/_search/$INDEX_NAME?include_docs=true&query=\"*:*\"&limit=1"
import com.ibm.cloud.cloudant.v1.Cloudant;
import com.ibm.cloud.cloudant.v1.model.PostPartitionSearchOptions;
import com.ibm.cloud.cloudant.v1.model.SearchResult;
Cloudant service = Cloudant.newInstance();
PostPartitionSearchOptions searchOptions =
new PostPartitionSearchOptions.Builder()
.db("<db-name>")
.partitionKey("<partition-key>")
.ddoc("<ddoc>")
.index("<index-name>")
.query("*:*")
.includeDocs(true)
.limit(1)
.build();
SearchResult response =
service.postPartitionSearch(searchOptions).execute()
.getResult();
System.out.println(response);
import { CloudantV1 } from '@ibm-cloud/cloudant';
const service = CloudantV1.newInstance({});
service.postSearch({
db: '<db-name>',
partitionKey: '<partition-key>',
ddoc: '<ddoc>',
index: '<index-name>',
query: '*:*',
includeDocs: true,
limit: 1
}).then(response => {
console.log(response.result);
});
from ibmcloudant.cloudant_v1 import CloudantV1
service = CloudantV1.new_instance()
response = service.post_search(
db='<db-name>',
partition_key='<partition-key>',
ddoc='<ddoc>',
index='<index-name>',
query='*:*',
include_docs=True,
limit=1
).get_result()
print(response)
postPartitionSearchOptions := service.NewPostPartitionSearchOptions(
"<db-name>",
"<partition-key>",
"<ddoc>",
"<index-name>",
"*:*",
)
postPartitionSearchOptions.SetIncludeDocs(true)
postPartitionSearchOptions.SetLimit(1)
searchResult, _, err := service.PostPartitionSearch(postPartitionSearchOptions)
if err != nil {
panic(err)
}
b, _ := json.MarshalIndent(searchResult, "", " ")
fmt.Println(string(b))
이전 Go 예제에서는 다음 가져오기 블록이 필요합니다.
import (
"encoding/json"
"fmt"
"github.com/IBM/cloudant-go-sdk/cloudantv1"
)
다음과 같이 HTTP를 사용하여 글로벌 인덱스를 조회하는 예제를 참조하십시오.
GET /$DATABASE/_design/$DDOC/_search/$INDEX_NAME?include_docs=true&query="*:*"&limit=1 HTTP/1.1
Content-Type: application/json
Host: $ACCOUNT.cloudant.com
다음과 같이 명령행을 사용하여 글로벌 인덱스를 조회하는 예제를 참조하십시오.
curl "https://$ACCOUNT.cloudant.com/$DATABASE/_design/$DDOC/_search/$INDEX_NAME?include_docs=true&query=\"*:*\"&limit=1"
import com.ibm.cloud.cloudant.v1.Cloudant;
import com.ibm.cloud.cloudant.v1.model.PostSearchOptions;
import com.ibm.cloud.cloudant.v1.model.SearchResult;
Cloudant service = Cloudant.newInstance();
PostSearchOptions searchOptions = new PostSearchOptions.Builder()
.db("<db-name>")
.ddoc("<ddoc>")
.index("<index-name>")
.query("*:*")
.includeDocs(true)
.limit(1)
.build();
SearchResult response =
service.postSearch(searchOptions).execute()
.getResult();
System.out.println(response);
import { CloudantV1 } from '@ibm-cloud/cloudant';
const service = CloudantV1.newInstance({});
service.postSearch({
db: '<db-name>',
ddoc: '<ddoc>',
index: '<index-name>',
query: '*:*',
includeDocs: true,
limit: 1
}).then(response => {
console.log(response.result);
});
from ibmcloudant.cloudant_v1 import CloudantV1
service = CloudantV1.new_instance()
response = service.post_search(
db='<db-name>',
ddoc='<ddoc>',
index='<index-name>',
query='*:*',
include_docs=True,
limit=1
).get_result()
print(response)
postSearchOptions := service.NewPostSearchOptions(
"<db-name>",
"<ddoc>",
"<index-name>",
"*:*",
)
postSearchOptions.SetIncludeDocs(true)
postSearchOptions.SetLimit(1)
searchResult, _, err := service.PostSearch(postSearchOptions)
if err != nil {
panic(err)
}
b, _ := json.MarshalIndent(searchResult, "", " ")
fmt.Println(string(b))
이전 Go 예제에서는 다음 가져오기 블록이 필요합니다.
import (
"encoding/json"
"fmt"
"github.com/IBM/cloudant-go-sdk/cloudantv1"
)
쿼리 매개변수
및 매개변수를 사용하려면 먼저 counts
facetingdrilldown
을 사용으로 설정해야 합니다.
인수 | 설명 | 선택사항 | 유형 | 지원되는 값 | 파티션 조회 |
---|---|---|---|---|---|
bookmark |
이전 검색에서 수신된 책갈피입니다. 이 매개변수는 결과 사이를 페이징할 수 있도록 해줍니다. 책갈피 뒤에 결과가 존재하지 않을 경우 결과 목록의 끝을 확인하는 비어 있는 배열 및 동일한 책갈피가 포함된 응답을 수신합니다. | yes |
문자열 | 예 | |
counts |
이 필드는 계수가 요청된 문자열 필드의 이름 배열을 정의합니다. 응답에는 검색 조회와 일치하는 문서 사이에서 이 필드 이름의 각 고유 값에 대한 개수가 포함되어 있습니다. 이 매개변수가 작동하려면 패싯 지정을 사용으로 설정해야 합니다. | 예 | JSON | 필드 이름의 JSON 배열입니다. | 아니오 |
drilldown |
이 필드는 여러 번 사용할 수 있습니다. 각각의 사용 시 필드 이름 및 값 쌍을 정의합니다. 이 검색은 이름 지정된 필드에서 제공된 값이 포함된 문서만 일치시킵니다. 값이 분석되지 않는다는 점에서만 "fieldname:value" 매개변수에서 q 를 사용하는 방법과 차이가 있습니다. 이 매개변수가 작동하려면 패싯 지정을
사용으로 설정해야 합니다. |
아니오 | JSON | 두 개의 요소(필드 이름 및 값)가 포함된 JSON 배열입니다. | 예 |
group_field |
검색 일치 항목을 그룹화하기 위한 필드입니다. | 예 | 문자열 | 문자열 필드의 이름이 포함된 문자열입니다. 숫자, 오브젝트 또는 배열과 같은 다른 데이터가 포함된 필드는 사용할 수 없습니다. | 아니오 |
group_limit |
최대 그룹 개수입니다. 이 필드는 group_field 가 지정된 경우에만 사용할 수 있습니다. |
예 | 숫자 | 아니오 | |
group_sort |
이 필드는 group_field 를 사용하는 검색에서 그룹의 순서를 정의합니다. 기본 정렬 순서는 관련성입니다. |
예 | JSON | 이 필드의 값은 정렬 필드와 동일할 수 있으므로 단일 필드 및 필드 배열이 지원됩니다. | 아니오 |
highlight_fields |
강조표시할 필드를 지정합니다. 지정된 경우 결과 오브젝트에 지정된 각각의 필드에 대한 항목이 존재하는 highlights 필드가 포함됩니다. |
예 | 문자열의 배열 | 예 | |
highlight_pre_tag |
강조표시 출력에서 강조표시된 단어 앞에 삽입되는 문자열입니다. | 예, 기본값은 <em> 입니다. |
문자열 | 예 | |
highlight_post_tag |
강조표시 출력에서 강조표시된 단어 뒤에 삽입되는 문자열입니다. | 예, 기본값은 </em> 입니다. |
문자열 | 예 | |
highlight_number |
강조표시 상태로 리턴되는 단편의 수입니다. 검색어가 단편 크기를 초과하는 경우 전체 검색어가 리턴됩니다. | 예, 기본값은 1입니다. | 숫자 | 예 | |
highlight_size |
필드 컨텐츠를 여러 문자(즉, 단편)로 분할하고 지정된 단편 내에 있는 일치 항목만 강조표시합니다. | 예, 기본값은 100자입니다. | 숫자 | 예 | |
include_docs |
응답에 문서의 전체 컨텐츠를 포함시킵니다. | 예 | 부울 | 예 | |
include_fields |
검색 결과에 포함시킬 필드 이름의 JSON 배열입니다. 포함된 필드는 모두 store:true 옵션을 사용하여 인덱싱해야 합니다. |
예, 기본값은 모든 필드입니다. | 문자열의 배열 | 예 | |
limit |
리턴되는 문서의 수를 지정된 숫자로 제한합니다. 그룹화된 검색의 경우 이 매개변수에서 그룹당 문서 수를 제한합니다. | 예 | 숫자 | 한계 값은 최대 200(포함)의 양의 정수가 될 수 있습니다. | 예 |
q |
query 의 약어입니다. Lucene 쿼리를 실행합니다. |
아니오 | 문자열 또는 숫자 | 예 | |
query |
Lucene 쿼리를 실행합니다. | 아니오 | 문자열 또는 숫자 | 예 | |
ranges |
이 필드는 패싯 지정된 숫자 검색 필드의 범위를 정의합니다. 값은 필드 이름이 패싯 지정된 숫자 검색 필드이고 필드의 값이 JSON 오브젝트인 JSON 오브젝트입니다. JSON 오브젝트의 필드 이름은 범위의 이름입니다. 값은 해당 범위에 대해 설명하는 문자열입니다(예: "[0 TO 10]" ). |
예 | JSON | 값은 해당 값이 오브젝트인 필드가 포함된 오브젝트여야 합니다. 이러한 오브젝트에는 해당 필드 값이 범위인 문자열이 포함되어 있어야 합니다. | 아니오 |
sort |
결과의 정렬 순서를 지정합니다. 그룹화된 검색(group_field 가 사용됨)에서는 이 매개변수가 그룹 내의 정렬 순서를 지정합니다. 기본 정렬 순서는 관련성입니다. |
예 | JSON | 내림차순의 경우 "fieldname<type>" 또는 -fieldname<type> 형식의 JSON 문자열입니다. fieldname 은 문자열 또는 숫자 필드의 이름이고 type 은 숫자, 문자열 또는 문자열의 JSON 배열입니다. type 파트는 선택사항이며, 기본값은
number 입니다. 일부 예제는 "foo" , "-foo" , "bar<string>" , "-foo<number>" 및 ["-foo<number>","bar<string>"] 입니다.
정렬에 사용되는 문자열 필드는 분석 필드가 아니어야 합니다. 정렬에 사용되는 필드는 검색 조회에 사용되는 것과 동일한 인덱서로 인덱싱해야 합니다. |
예 |
stale |
결과를 리턴하기 위해 인덱스가 빌드를 완료할 때까지 대기하지 않습니다. | 예 | 문자열 | OK | 예 |
bookmark
및 stale
옵션을 결합하지 마십시오. 이러한 옵션은 응답에 사용할 샤드 복제본에 대한 선택사항을 제한합니다. 이 옵션을 함께 사용하는 경우 속도가 느리거나 사용 불가능한 복제본에 접속하려고 시도할 때 문제점이 발생할 수 있습니다.
include_docs=true
를 사용하는 경우 성능상 영향이 발생할 수 있습니다.
관련성
둘 이상의 결과가 리턴되는 경우 해당 결과를 정렬할 수 있습니다. 기본적으로 정렬 순서는 '관련성'으로 판별됩니다.
관련성은 Lucene Scoring(Apache) 에 따라 측정됩니다 예를 들어 example
이라는 단어에 대한 단순 데이터베이스를 검색하는 경우 두 개의 문서에 이 단어가 포함되어 있을 수 있습니다. 첫 번째 문서에서는 example
이라는
단어가 10번 언급되지만 두 번째 문서에서는 이 단어가 두 번만 언급되는 경우 첫 번째 문서가 '관련성'이 더 높은 것으로 간주됩니다.
sort
매개변수를 제공하지 않을 경우 기본적으로 관련성이 사용됩니다. 점수가 가장 높은 일치 항목이 가장 먼저 리턴됩니다.
sort
매개변수를 제공하는 경우 관련성을 무시하고 해당 순서에 따라 일치 항목이 리턴됩니다.
sort
매개변수를 사용하고 검색 결과에서 관련성별 순서를 포함하려면, sort
매개변수 내에서 특수 필드 -<score>
또는 <score>
을(를) 사용하십시오.
검색 조회 게시
GET
HTTP 메소드를 사용하는 대신 POST
를 사용할 수도 있습니다.
POST
조회를 사용하는 주요 이점은 요청 본문을 포함시킬 수 있기 때문에 요청을 JSON 오브젝트로 지정할 수 있다는 점입니다. 이전 표에 있는 각각의 매개변수는 요청 본문에 있는 JSON 오브젝트의 필드에 해당됩니다.
다음과 같이 HTTP를 사용하여 검색 요청을 게시(POST
)하는 예제를 참조하십시오.
POST /db/_design/ddoc/_search/searchname HTTP/1.1
Content-Type: application/json
Host: $ACCOUNT.cloudant.com
다음과 같이 명령행을 사용하여 검색 요청을 게시(POST
)하는 예제를 참조하십시오.
curl "https://$ACCOUNT.cloudant.com/$DATABASE/_design/$DDOC/_search/$INDEX_NAME" -X POST -H "Content-Type: application/json" -d @search.json
다음과 같이 검색 요청이 포함된 JSON 문서 예제를 참조하십시오.
{
"q": "index:my query",
"sort": "foo",
"limit": 3
}
쿼리 구문
IBM Cloudant 의 검색 쿼리 구문은 루씬(Lucene)구문을 기반으로 합니다 검색 조회는 이름이 생략되지 않을 경우 name:value
양식을 사용합니다. 이 경우 다음 예제에서 설명하는 것과 같이 기본 필드를 사용합니다.
다음과 같이 검색 조회 표현식 예제를 참조하십시오.
// Birds
class:bird
// Animals that begin with the letter "l"
l*
// Carnivorous birds
class:bird AND diet:carnivore
// Herbivores that start with letter "l"
l* AND diet:herbivore
// Medium-sized herbivores
min_length:[1 TO 3] AND diet:herbivore
// Herbivores that are 2m long or less
diet:herbivore AND min_length:[-Infinity TO 2]
// Mammals that are at least 1.5m long
class:mammal AND min_length:[1.5 TO Infinity]
// Find "Meles meles"
latin_name:"Meles meles"
// Mammals who are herbivore or carnivore
diet:(herbivore OR omnivore) AND class:mammal
// Return all results
*:*
복수의 필드에 대한 조회를 논리적으로 결합할 수 있으며 그룹 및 필드를 추가로 그룹화할 수 있습니다. 사용 가능한 논리 연산자는 대소문자를 구분하며, AND
,
+
,
OR
,
NOT
, and -
. 범위 조회는 문자열 또는 숫자에 대해 실행할 수 있습니다.
퍼지 검색을 원하는 경우 ~
를 통해 조회를 실행하여 검색어와 유사한 용어를 찾을 수 있습니다. 예를 들면 다음과 같습니다.
look~
book
와 took
라는 용어를 찾습니다.
범위 조회의 상한이 둘 다 숫자만 포함된 문자열인 경우 해당 경계가 문자열이 아닌 숫자로 간주됩니다. 예를 들어 mod_date:["20170101" TO "20171231"]
라는 조회를 사용하여 검색하는 경우 결과에는 mod_date
가 문자열 "20170101" - "20171231" 사이가 아닌 숫자 값 20170101
- 20171231 사이에 있는 문서가 포함됩니다.
^
및 양수를 추가하여 검색어의 중요도를 변경할 수 있습니다. 이 변경을 수행하는 경우 부스트 값의 제곱에 비례하여 관련성이 높거나 낮은 용어가 포함된 일치 항목이 작성됩니다. 기본값은 일치 항목의 강도가 증가하거나 감소하지 않음을 의미하는 1입니다. 0 - 1의 10진수 값은 일치 항목의 강도를 낮추어 중요도를 감소시킵니다. 1보다 큰 값은 일치 항목의 강도를 올려서 중요도를 증가시킵니다.
와일드카드 검색은 단일 문자 검색 (?
) 또는 다중 문자 검색 (*
) 모두에 대해 지원됩니다. 예를 들면 다음과 같습니다.
dat?
would match date
and data
, and dat*
would match date
,
data
,
database
, and dates
. 와일드카드는 반드시 검색어 다음에 와야 합니다.
모든 결과를 리턴하려면 *:*
를 사용하십시오.
검색의 결과 세트는 200행으로 제한되며 기본적으로 25행이 리턴됩니다. 리턴되는 행 수는 limit
매개변수를 사용하여 변경할 수 있습니다.
검색 조회에서 "group_field"
인수를 지정하지 않을 경우 응답에 책갈피가 포함됩니다. 이 책갈피가 나중에 URL 매개변수로 제공되는 경우 응답에서 이미 표시된 행을 건너뛰고 빠르고 쉽게 다음 결과 세트를 가져올 수 있습니다.
검색 조회에 "group_field"
매개변수가 포함된 경우 응답에 책갈피가 포함되지 않습니다.
group_field
, group_limit
및 group_sort
옵션은 글로벌 조회를 작성하는 경우에만 사용할 수 있습니다.
다음 문자를 검색하는 경우 해당 문자를 이스케이프해야 합니다.
+ - && || ! ( ) { } [ ] ^ " ~ * ? : \ /
이러한 문자 중 하나를 이스케이프 처리하려면 앞의 백슬래시 문자(\
)를 사용하십시오.
검색 조회에 대한 응답에는 각각의 결과에 대한 order
필드가 포함되어 있습니다.
order
필드는 첫 번째 요소가 sort
매개변수에 지정된 하나 이상의 필드인 배열입니다. 쿼리에 ' sort
' 매개변수가 포함되지 않은 경우, ' order
' 필드에 Lucene 관련성 점수가 포함됩니다.
sort by distance
지리적 검색에서 설명한 것과 같이 를 사용하는 경우 첫 번째 요소는 특정 위치로부터의 거리입니다. 거리는 킬로미터 또는 마일을 사용하여 측정됩니다.
순서 배열의 두 번째 요소는 무시할 수 있습니다. 이 요소는 문제점 해결 용도로만 사용됩니다.
패싯 지정
IBM Cloudant 검색에서는 빠르고 쉽게 일치 항목에 대한 집계 정보를 발견할 수 있도록 해주는 패싯 지정 검색도 지원됩니다. 특수한 ?q=*:*
조회 구문을 사용하여 모든 문서를 일치시킨 후 리턴되는 패싯을 사용하여 조회를 세분화할 수 있습니다. 필드가 패싯 지정 조회에 대해 인덱싱됨을 나타내려면 해당 옵션에서 {"facet": true}
를 설정하십시오.
다음과 같이 패싯 지정 검색을 사용으로 설정한 검색 조회 예제를 참조하십시오.
function(doc) {
index("type", doc.type, {"facet": true});
index("price", doc.price, {"facet": true});
}
패싯을 사용하려면 인덱스에 있는 모든 문서에 패싯 지정이 사용으로 설정된 모든 필드가 포함되어 있어야 합니다. 문서에 모든 필드가 포함되어 있지 않은 경우 "bad_request
이 존재하지 않음"이라는 이유로 field_name
오류가 수신됩니다. 각각의 문서에 패싯에 대한 모든 필드가 포함되어 있지 않은 경우 각각의 필드에 대해 별도의 인덱스를 작성하십시오. 각각의
필드에 대해 별도의 인덱스를 작성하지 않을 경우 모든 필드가 포함된 문서만 포함시켜야 합니다. 하나의 if
문을 사용하여 각각의 문서에 필드가 존재하는지 확인하십시오.
다음과 같이 각각의 문서에 필요한 필드가 존재하는지 확인하기 위한 if
문 예제를 참조하십시오.
if (typeof doc.town == "string" && typeof doc.name == "string") {
index("town", doc.town, {facet: true});
index("name", doc.name, {facet: true});
}
계수
counts
옵션은 글로벌 조회를 작성하는 경우에만 사용할 수 있습니다.
counts
패싯 구문에서는 필드 목록을 사용하며 이름 지정된 각 필드의 각 고유 값에 대한 조회 결과 수를 리턴합니다.
count
오퍼레이션은 인덱싱된 값이 문자열인 경우에만 작동합니다. 인덱싱된 값은 혼합 유형이 될 수 없습니다. 예를 들어 100개의 문자열이 인덱싱된 후 하나의 숫자가 인덱싱되는 경우 해당 인덱스는 count
오퍼레이션에 대해 사용할 수 없습니다.
typeof
연산자를 사용하여 유형을 확인하고, parseInt
연산자를 사용하여 변환할 수 있습니다
parseFloat
, or .toString()
functions.
다음과 같이 counts
패싯 구문을 사용하는 조회 예제를 참조하십시오.
?q=*:*&counts=["type"]
다음과 같이 counts
패싯 구문을 사용한 이후의 응답 예제를 참조하십시오.
{
"total_rows":100000,
"bookmark":"g...",
"rows":[...],
"counts":{
"type":{
"sofa": 10,
"chair": 100,
"lamp": 97
}
}
}
drilldown
drilldown
옵션은 글로벌 조회를 작성하는 경우에만 사용할 수 있습니다.
지정된 레이블과 동일한 차원의 문서로 결과를 제한할 수 있습니다. 검색 조회에 drilldown=["dimension","label"]
을 추가하여 결과를 제한하십시오. 복수의 drilldown
매개변수를 포함시켜 복수의 차원으로 결과를 제한할 수 있습니다.
drilldown
매개변수를 사용하는 것은 key:value
매개변수에서 q
를 사용하는 것과 유사하지만 drilldown
매개변수의 경우 분석기에서 건너뛸 수 있는 값을 리턴합니다.
예를 들어 분석기에서 "a"
와 같은 제외어를 인덱싱하지 않을 경우 drilldown
를 지정하면 drilldown=["key","a"]
매개변수에서 해당 제외어를 리턴합니다.
범위
ranges
옵션은 글로벌 조회를 작성하는 경우에만 사용할 수 있습니다.
range
패싯 구문에서는 지정된 각각의 카테고리에 적합한 결과 개수를 리턴하기 위해 범위에 대해 표준 Lucene 구문을 재사용합니다. 포함 범위 조회는 대괄호([
, ]
)로 표시됩니다. 제외 범위 조회는 중괄호({
, }
)로 표시됩니다.
인덱싱된 값은 혼합 유형이 될 수 없습니다. 예를 들어 100개의 문자열이 인덱싱된 후 하나의 숫자가 인덱싱되는 경우 해당 인덱스는 range
오퍼레이션에 대해 사용할 수 없습니다.
typeof
연산자를 사용하여 유형을 확인하고, parseInt
연산자를 사용하여 변환할 수 있습니다
parseFloat
, or .toString()
functions.
다음과 같이 일치하는 ranges
에 대해 패싯 지정 검색을 사용하는 요청 예제를 참조하십시오.
?q=*:*&ranges={"price":{"cheap":"[0 TO 100]","expensive":"{100 TO Infinity}"}}
다음과 같이 패싯 지정 검색에 대한 ranges
검사 이후의 결과 예제를 참조하십시오.
{
"total_rows":100000,
"bookmark":"g...",
"rows":[...],
"ranges": {
"price": {
"expensive": 278682,
"cheap": 257023
}
}
}
지리적 검색
텍스트 필드의 컨텐츠를 검색하는 것 뿐만 아니라 지리적 좌표로부터의 거리를 기준으로 결과를 정렬할 수도 있습니다.
이러한 방식으로 결과를 정렬하려면 경도 및 위도를 나타내는 두 개의 숫자 필드를 인덱싱해야 합니다.
그리고 다섯 개의 매개변수를 사용하는 특수 <distance...>
정렬 필드를 사용하여 쿼리할 수 있습니다.
- 경도 필드 이름 - 경도 필드의 이름입니다(예:
mylon
). - 위도 필드 이름 - 위도 필드의 이름입니다(예:
mylat
). - 원점 경도 - 거리를 기준으로 정렬하기 위한 원점 위치의 경도입니다.
- 원점 위도 - 거리를 기준으로 정렬하기 위한 원점 위치의 위도입니다.
- 단위 - 킬로미터의 경우
km
또는 마일의 경우mi
등의 사용할 단위입니다. 거리는 순서 필드에서 리턴됩니다.
거리별로 정렬하는 기능을 다른 검색 쿼리와 결합할 수 있습니다. 위도 및 경도에 대한 범위 검색이나, 비지리학적 정보를 포함하는 쿼리와 같은 다른 검색 쿼리와 결합할 수 있습니다.
이러한 방식으로 경계 상자에서 검색하고 추가 기준을 사용하여 검색 범위를 좁힐 수 있습니다.
다음과 같이 지리적 데이터 예제를 참조하십시오.
{
"name":"Aberdeen, Scotland",
"lat":57.15,
"lon":-2.15,
"type":"city"
}
다음과 같이 지리적 데이터에 대한 검색 인덱스가 포함된 디자인 문서 예제를 참조하십시오.
function(doc) {
if (doc.type && doc.type == 'city') {
index('city', doc.name, {'store': true});
index('lat', doc.lat, {'store': true});
index('lon', doc.lon, {'store': true});
}
}
다음과 같이 HTTP를 사용하여 뉴욕까지의 거리를 기준으로 북반구의 도시를 정렬하는 조회 예제를 참조하십시오.
GET /examples/_design/cities-designdoc/_search/cities?q=lat:[0+TO+90]&sort="<distance,lon,lat,-74.0059,40.7127,km>" HTTP/1.1
Host: $ACCOUNT.cloudant.com
다음과 같이 명령행을 사용하여 뉴욕까지의 거리를 기준으로 북반구의 도시를 정렬하는 조회 예제를 참조하십시오.
curl "https://$ACCOUNT.cloudant.com/examples/_design/cities-designdoc/_search/cities?q=lat:\[0+TO+90\]&sort=\"<distance,lon,lat,-74.0059,40.7127,km>\""
import com.ibm.cloud.cloudant.v1.Cloudant;
import com.ibm.cloud.cloudant.v1.model.PostSearchOptions;
import com.ibm.cloud.cloudant.v1.model.SearchResult;
import java.util.Arrays;
Cloudant service = Cloudant.newInstance();
PostSearchOptions searchOptions = new PostSearchOptions.Builder()
.db("examples")
.ddoc("cities-designdoc")
.index("cities")
.query("lat:\\[0+TO+90\\]")
.sort(Arrays.asList("<distance,lon,lat,-74.0059,40.7127,km>"))
.build();
SearchResult response =
service.postSearch(searchOptions).execute()
.getResult();
System.out.println(response);
import { CloudantV1 } from '@ibm-cloud/cloudant';
const service = CloudantV1.newInstance({});
service.postSearch({
db: 'examples',
ddoc: 'cities-designdoc',
index: 'cities',
query: 'lat:\\[0+TO+90\\]',
sort: ['<distance,lon,lat,-74.0059,40.7127,km>']
}).then(response => {
console.log(response.result);
});
from ibmcloudant.cloudant_v1 import CloudantV1
service = CloudantV1.new_instance()
response = service.post_search(
db='examples',
ddoc='cities-designdoc',
index='cities',
query='lat:\\[0+TO+90\\]',
sort=['<distance,lon,lat,-74.0059,40.7127,km>']
).get_result()
print(response)
postSearchOptions := service.NewPostSearchOptions(
"examples",
"cities-designdoc",
"cities",
"lat:\\[0+TO+90\\]",
)
postSearchOptions.SetSort([]string{"<distance,lon,lat,-74.0059,40.7127,km>"})
searchResult, _, err := service.PostSearch(postSearchOptions)
if err != nil {
panic(err)
}
b, _ := json.MarshalIndent(searchResult, "", " ")
fmt.Println(string(b))
이전 Go 예제에서는 다음 가져오기 블록이 필요합니다.
import (
"encoding/json"
"fmt"
"github.com/IBM/cloudant-go-sdk/cloudantv1"
)
다음과 같이 뉴욕까지의 거리를 기준으로 정렬된 북반구 도시의 목록이 포함된 응답 예제(축약됨)를 참조하십시오.
{
"total_rows": 205,
"bookmark": "g1A...XIU",
"rows": [
{
"id": "city180",
"order": [
8.530665755719783,
18
],
"fields": {
"city": "New York, N.Y.",
"lat": 40.78333333333333,
"lon": -73.96666666666667
}
},
{
"id": "city177",
"order": [
13.756343205985946,
17
],
"fields": {
"city": "Newark, N.J.",
"lat": 40.733333333333334,
"lon": -74.16666666666667
}
},
{
"id": "city178",
"order": [
113.53603438866077,
26
],
"fields": {
"city": "New Haven, Conn.",
"lat": 41.31666666666667,
"lon": -72.91666666666667
}
}
]
}
검색어 강조 표시
사용자에게 더 강조된 결과를 표시할 수 있도록 검색어가 언급된 컨텍스트를 가져오는 것이 유용한 경우도 있습니다.
더 강조된 결과를 가져오려면 검색 조회에 highlight_fields
매개변수를 추가하십시오. 강조된 검색어가 포함된 발췌 항목이 리턴될 필드 이름을 지정하십시오.
기본적으로 검색 용어는 강조표시를 위해 <em>
태그에 배치되지만, 강조표시는 highlights_pre_tag
및 highlights_post_tag
매개변수를 사용하여 대체할 수 있습니다.
단편의 길이는 기본적으로 100자입니다.
highlights_size
매개변수를 사용하여 다른 길이를 요청할 수 있습니다.
highlights_number
매개변수는 리턴되는 단편의 수를 제어하며, 기본값은 1입니다.
응답에는 필드 이름당 하나의 서브필드가 포함된 highlights
필드가 추가됩니다.
각각의 필드에 대해 검색어가 강조표시된 단편의 배열이 수신됩니다.
강조표시가 작동하도록 하려면 store: true
옵션을 사용하여 인덱스에 필드를 저장하십시오.
다음과 같이 HTTP를 사용하여 강조표시가 사용으로 설정된 검색 예제를 참조하십시오.
GET /movies/_design/searches/_search/movies?q=movie_name:Azazel&highlight_fields=["movie_name"]&highlight_pre_tag=" "&highlight_post_tag=" "&highlights_size=30&highlights_number=2 HTTP/1.1
HOST: $ACCOUNT.cloudant.com
Authorization: ...
강조 표시를 활성화한 상태에서 검색하는 명령줄의 예는 다음과 같습니다
curl "https://$ACCOUNT.cloudant.com/movies/_design/searches/_search/movies?q=\"movie_name:Azazel\"&highlight_fields=\[\"movie_name\"\]&highlight_pre_tag=\" \"&highlight_post_tag=\" \"&highlights_size=30&highlights_number=2" \
-X GET
import com.ibm.cloud.cloudant.v1.Cloudant;
import com.ibm.cloud.cloudant.v1.model.PostSearchOptions;
import com.ibm.cloud.cloudant.v1.model.SearchResult;
import java.util.Arrays;
Cloudant service = Cloudant.newInstance();
PostSearchOptions searchOptions = new PostSearchOptions.Builder()
.db("movies")
.ddoc("searches")
.index("movies")
.query("movie_name:Azazel")
.highlightFields(Arrays.asList("[\"movie_name\"]"))
.highlightPreTag("\" \"")
.highlightPostTag("\" \"")
.highlightSize(30)
.highlightNumber(2)
.build();
SearchResult response =
service.postSearch(searchOptions).execute()
.getResult();
System.out.println(response);
import { CloudantV1 } from '@ibm-cloud/cloudant';
const service = CloudantV1.newInstance({});
service.postSearch({
db: 'movies',
ddoc: 'searches',
index: 'movies',
query: 'movie_name:Azazel',
highlightFields: ['["movie_name"]'],
highlightPreTag: '" "',
highlightPostTag: '" "',
highlightSize: 30,
highlightNumber: 2
}).then(response => {
console.log(response.result);
});
from ibmcloudant.cloudant_v1 import CloudantV1
service = CloudantV1.new_instance()
response = service.post_search(
db='movies',
ddoc='searches',
index='movies',
query='movie_name:Azazel',
highlight_fields=['["movie_name"]'],
highlight_pre_tag='" "',
highlight_post_tag='" "',
highlight_size=30,
highlight_number=2
).get_result()
print(response)
postSearchOptions := service.NewPostSearchOptions(
"movies",
"searches",
"movies",
"movie_name:Azazel",
)
postSearchOptions.SetHighlightFields([]string{"[\"movie_name\"]"})
postSearchOptions.SetHighlightPreTag("\" \"")
postSearchOptions.SetHighlightPostTag("\" \"")
postSearchOptions.SetHighlightSize(30)
postSearchOptions.SetHighlightNumber(2)
searchResult, _, err := service.PostSearch(postSearchOptions)
if err != nil {
panic(err)
}
b, _ := json.MarshalIndent(searchResult, "", " ")
fmt.Println(string(b))
이전 Go 예제에서는 다음 가져오기 블록이 필요합니다.
import (
"encoding/json"
"fmt"
"github.com/IBM/cloudant-go-sdk/cloudantv1"
)
다음과 같이 강조표시된 검색 결과 예제를 참조하십시오.
{
"highlights": {
"movie_name": [
" on the Azazel Orient Express",
" Azazel manuals, you"
]
}
}
검색 인덱스 메타데이터
검색 인덱스에 대한 정보를 검색하려면 다음 예제에 표시된 것과 같이 GET
엔드포인트로 _search_info
요청을 전송하십시오.
DDOC
는 인덱스가 포함된 디자인 문서를 참조하며 INDEX_NAME
은 인덱스의 이름입니다.
다음과 같이 HTTP를 사용하여 검색 인덱스 메타데이터를 요청하는 예제를 참조하십시오.
GET /$DATABASE/_design/$DDOC/_search_info/$INDEX_NAME HTTP/1.1
다음과 같이 명령행을 사용하여 검색 인덱스 메타데이터를 요청하는 예제를 참조하십시오.
curl "https://$ACCOUNT.cloudant.com/$DATABASE/_design/$DDOC/_search_info/$INDEX_NAME" \
-X GET
import com.ibm.cloud.cloudant.v1.Cloudant;
import com.ibm.cloud.cloudant.v1.model.GetSearchInfoOptions;
import com.ibm.cloud.cloudant.v1.model.SearchInfoResult;
Cloudant service = Cloudant.newInstance();
GetSearchInfoOptions infoOptions =
new GetSearchInfoOptions.Builder()
.db("<db-name>")
.ddoc("<ddoc>")
.index("<index-name>")
.build();
SearchInfoResult response =
service.getSearchInfo(infoOptions).execute()
.getResult();
System.out.println(response);
import { CloudantV1 } from '@ibm-cloud/cloudant';
const service = CloudantV1.newInstance({});
service.getSearchInfo({
db: '<db-name>',
ddoc: '<ddoc>',
index: '<index-name>'
}).then(response => {
console.log(response.result);
});
from ibmcloudant.cloudant_v1 import CloudantV1
service = CloudantV1.new_instance()
response = service.get_search_info(
db='<db-name>',
ddoc='<ddoc>',
index='<index-name>'
).get_result()
print(response)
getSearchInfoOptions := service.NewGetSearchInfoOptions(
"<db-name>",
"<ddoc>",
"<index-name>",
)
searchInfoResult, _, err := service.GetSearchInfo(getSearchInfoOptions)
if err != nil {
panic(err)
}
b, _ := json.MarshalIndent(searchInfoResult, "", " ")
fmt.Println(string(b))
이전 Go 예제에서는 다음 가져오기 블록이 필요합니다.
import (
"encoding/json"
"fmt"
"github.com/IBM/cloudant-go-sdk/cloudantv1"
)
응답에는 인덱스의 문서 수 및 디스크에서 인덱스의 크기와 같은 인덱스에 대한 정보가 포함되어 있습니다.
다음과 같이 검색 인덱스 메타데이터를 요청한 이후의 응답 예제를 참조하십시오.
{
"name": "_design/DDOC/INDEX",
"search_index": {
"pending_seq": 7125496,
"doc_del_count": 129180,
"doc_count": 1066173,
"disk_size": 728305827,
"committed_seq": 7125496
}
}