DQL 개요
Discovery 쿼리 언어에는 데이터를 필터링, 검색 및 분석하는 데 사용할 수 있는 구문이 정의되어 있습니다.
Discovery 쿼리 언어 쿼리 작성 방법
Discovery 쿼리 언어는 색인된 문서의 구조를 활용합니다. 다음 JSON 스니펫은 Entities 보강이 적용된 컬렉션의 색인된 문서를 보여 줍니다. 강화의 결과로 JSON 구조는 도시 이름, 회사 또는 유명인 등 알려진 실체에 대한 언급을 모두 캡처합니다.
이 예에서 인식되는 엔티티는 회사 이름 IBM 입니다.
{
"document": {
"document_id": "f7f27ea30eb3e4c0ce21830618d9ee99",
"enriched_text": [
{
"entities": [
{
"model_name": "natural_language_understanding",
"mentions": [],
"text":"IBM",
"type":"Organization"
}
]
}
]
}
}
IBM 엔티티가 언급된 모든 문서를 반환하는 쿼리를 만들려면 다음 구문을 사용합니다:
이 기본 쿼리에는 : 연산자 앞에 중첩된 경로 표현식이 포함되어 있습니다. 각 경로 요소는 마침표로 구분된 문서 내 필드 이름입니다(.). : 연산자는 연산자 뒤에 오는 텍스트가 결과에 포함되어야 함을 나타냅니다.
:: 연산자는 결과에서 텍스트가 정확히 일치해야 함을 나타냅니다. 자세한 내용은 쿼리 연산자 를 참조하세요. 다음 예제에서 두 연산자가 어떻게 사용되는지 확인할 수 있습니다.
-
관련성 순으로 일치하는 문서를 반환하려면
POST요청에 다음 데이터 개체를 전달합니다:{ "query":"enriched_text.entities.text:IBM" } -
어떤 순서로든 일치하는 문서를 반환하려면
POST요청에 다음 데이터 개체를 쿼리 본문으로 전달하세요:{ "filter":"enriched_text.entities.text::IBM" }
필터 및 쿼리 매개변수 함께 사용하기
filter 매개 변수는 query 매개 변수보다 빠르게 반환되며 그 결과는 캐시됩니다. 작은 데이터 집합에서 filter 및 query 매개 변수를 개별적으로 사용하는 쿼리를 제출하는 경우 각 요청은 유사한(동일하지는 않더라도) 결과를 반환합니다.
대규모 데이터 집합에서 관련성 순으로 결과를 반환해야 하는 경우 filter 및 query 매개 변수를 결합합니다. 매개변수를 함께 사용하면 filter 매개변수가 먼저 적용되므로 성능이 향상됩니다. 문서를 필터링하고 결과를 캐시합니다. query 매개변수는 캐시된 결과의 순위를 매깁니다.
필터 예시: 문서 ID로 문서 가져오기
쿼리 본문:
{
"filter": "document_id::b6d8c6e3-1097-421b-9e39-75717d2554aa"
}
문서가 존재하는 경우 쿼리는 일치하는 결과 1개를 반환합니다. 그렇지 않은 경우 쿼리는 일치하는 결과를 반환하지 않습니다.
필터 예시: 파일 이름으로 문서 ID 찾기
문서의 document_id 은 모르지만 문서의 원본 filename 은 알고 있는 경우 filter 및 return 매개 변수를 함께 사용하여 document_id 를 검색할 수 있습니다.
쿼리 본문:
{
"filter": "extracted_metadata.filename::100674.txt",
"return": [ "document_id", "extracted_metadata" ]
}
응답:
{
"matching_results": 1,
"results": [
{
"document_id": "b6d8c6e3-1097-421b-9e39-75717d2554aa",
"extracted_metadata": {
"sha1": "AD447F7592A17CDCBF0A589C4E6EC2087AF7H35F",
"filename": "100674.txt",
"file_type": "text"
}
}
]
}
필터 예시: 엔티티 값을 언급하는 문서 찾기
이 쿼리는 엔티티 Gilroy 을 언급하는 문서를 찾고 일치하는 문서 4개를 찾습니다.
쿼리 본문:
{
"filter": "enriched_text.entities.text::Gilroy"
}
응답:
{
"matching_results": 4
}
중첩된 값 필터링
하나의 필터를 다른 필터 안에 중첩하여 반환되는 문서가 두 개 이상의 조건과 일치하도록 할 수 있습니다.
이 예제에 사용된 문서에서 엔터티 "Gilroy" 은 "Location"(캘리포니아의 도시)와 "Person"(성) 엔터티 유형으로 모두 나타납니다. "Gilroy" 가 위치로 표시되는 문서를 찾으려면 중첩된 두 필드를 동시에 필터링하는 쿼리를 작성합니다. 엔티티 텍스트는
"Gilroy" 이고 엔티티 유형은 "Location" 이어야 합니다.
쿼리를 작성하는 한 가지 방법은 다음과 같습니다
{
"filter": "enriched_text.entities.text::Gilroy,enriched_text.entities.type::Location"
}
이 쿼리는 일부 경로가 enriched_text.entities.text 이고 일부 경로가 Gilroy 인 문서와 enriched_text.entities.type::Location 이고 일부 경로가 Location 인 문서를 일치시킵니다. 그러나 이 두 경로가 동일한 entities 객체 아래에 있다는 보장은 없습니다.
예를 들어 쿼리는 Gilroy 을 엔티티 유형으로 Person 인 문서와 동시에 다른 Location 엔티티 유형 개체를 가진 문서를 일치시킵니다.
이 쿼리의 중첩된 의미를 정확하게 포착하려면 다음 구문을 사용하여 필터 값을 중첩하세요:
쿼리 본문:
{
"filter": "enriched_text.entities:(text::Gilroy,type::Location)"
}
이 더 엄격한 쿼리는 entities 객체가 text 와 같은 Gilroy 및 type 와 같은 Location 문서만 일치시킵니다.
다른 예로, entities 개체가 포함된 문서와 text 는 Gilroy 과 같지만 type not 가 Location 과 같은 문서를 일치시키려는 경우, 쿼리에서 다음과 같이
not equal 연산자를 쿼리에 사용할 수 있습니다:
{
"filter": "enriched_text.entities:(text::Gilroy,type::!Location)"
}
집계를 사용하여 결과를 보다 정교하게 필터링할 수도 있습니다. 사용 가능한 집계 유형에 대한 자세한 내용은 집계 쿼리 를 참조하세요.
Discovery 의 쿼리 언어에 대한 자세한 정보는 다음 주제를 참조하십시오