다음에 대한 쿼리 본문 구성 Elasticsearch
여러 검색 기준을 결합해야 하는 복잡한 쿼리에는 쿼리 본문을 사용합니다. 쿼리 절은 문서가 검색과 일치하는지 여부를 결정하여 보다 정확한 결과를 반환하는 데 도움이 됩니다.
Elasticsearch 와의 통합은 키워드 검색을 사용하지만 상담원에게 고급 Elasticsearch 설정으로 쿼리 본문을 구성하여 다음과 같은 고급 검색 기술을 사용할 수 있습니다:
- ELSER를 사용한 시맨틱 검색.
- k-최근 이웃 ( kNN ) 밀도 벡터 검색.
- 중첩된 문서를 검색하는 중첩 쿼리.
- 하이브리드 검색.
- 시맨틱 텍스트 필드에서 검색합니다.
ELSER를 사용한 시맨틱 검색
ELSER와 함께 시맨틱 검색을 사용하면 사용자 쿼리의 맥락과 의도를 이해하여 검색 정확도와 관련성을 높일 수 있습니다. 자세한 내용은 ELSER를 사용한 시맨틱 검색 문서 에서 Elasticsearch 확인하십시오.
다음 코드 스니펫은 ELSER를 사용한 시맨틱 검색의 예를 보여줍니다. 이 예제는 다른 쿼리의 부울 조합과 일치하는 문서를 매칭하기 위해 부울 쿼리를 사용합니다.
{
"query": {
"bool": {
"should": [
{
"text_expansion": {
"ml.tokens": {
"model_id": ".elser_model_2_linux-x86_64",
"model_text": "$QUERY"
}
}
}
],
"filter": "$FILTER"
}
}
}
여기서,
ml.tokensELSER 토큰을 저장하는 필드를 말합니다. 인덱스에서 다른 필드를 사용하는 경우 업데이트해야 할 수 있습니다. ELSER 토큰을 사용할 수 없는 경우 원시 텍스트가 포함된 필드를 사용할 수도 있지만 검색 품질이 저하될 수 있습니다.
.elser_model_2_linux-x86-64ELSER v2 의 최적화된 버전에 대한 모델 ID이며, Elasticsearch 배포에서 사용할 수 있는 경우 사용합니다. 그렇지 않으면 일반 ELSER v2 모델의 경우
.elser_model_2, ELSER.elser_model_1의 경우 v1 을 사용하세요.$QUERY사용자 쿼리에 액세스하기 위한 변수입니다. 사용자 쿼리가 쿼리 본문으로 전달되는지 확인할 수 있습니다.
$FILTER이는 고급 설정에서 구성한 사용자 정의 필터에 접근하기 위한 Elasticsearch 변수입니다. 쿼리 본문에서 사용자 지정 필터가 사용되도록 할 수 있습니다.
k-최근 이웃 ( kNN ) 밀도 벡터 검색
벡터 임베딩(예: 텍스트 검색)을 기반으로 유사한 항목을 효율적으로 찾기 위해 검색을 kNN 사용하십시오. 자세한 내용은 문 서의 검색 Elasticsearch 항목을 kNN 참조하십시오.
다음 코드 스니펫은 kNN 고밀도 벡터 검색의 예를 보여줍니다:
{
"knn": {
"field": "text_embedding.predicted_value",
"query_vector_builder": {
"text_embedding": {
"model_id": "intfloat__multilingual-e5-small",
"model_text": "$QUERY"
}
},
"k": 10,
"num_candidates": 100,
"filter" : "$FILTER"
}
}
여기서,
text_embedding.predicted_value밀도가 높은 벡터를 저장하는 필드를 말합니다. 인덱스에서 다른 필드를 사용하는 경우 업데이트해야 할 수 있습니다. 자세한 내용은 밀집 벡터 검색을 위한 텍스트 임베딩 설정에서 참조하십시오 Elasticsearch.
query_vector_builder아래의text_embedding실행할 자연어 처리 작업입니다. kNN 검색의 경우
text_embedding여야 합니다.intfloat__multilingual-e5-small임베딩 모델 ID입니다. 다른 임베딩 모델을 사용하려면 업데이트해야 할 수 있습니다.
$QUERY사용자 쿼리에 액세스하기 위한 변수입니다. 사용자 쿼리가 쿼리 본문으로 전달되는지 확인할 수 있습니다.
$FILTER이는 고급 설정에서 구성한 사용자 정의 필터에 접근하기 위한 Elasticsearch 변수입니다. 쿼리 본문에서 사용자 지정 필터가 사용되도록 할 수 있습니다.
중첩 쿼리를 사용하여 ELSER로 중첩된 문서 검색하기
인덱스에 중첩된 문서가 포함된 경우, Elasticsearch 인덱스 내 중첩된 필드를 검색하기 위해 쿼리를 다시 중첩된 쿼리 감쌉니다. 일치하는 문서가 발견되면 쿼리는 일치하는 중첩 문서와 함께 루트 상위 문서를 반환합니다. 검색 결과에 필터를 적용할 때 상위 문서 또는 중첩된 문서 중 하나를 선택하여 필터링할 수 있습니다.
외부 문서 쿼리하기
다음 코드 스니펫은 Elasticsearch 인덱스 내의 외부 문서를 쿼리하는 예시를 보여 줍니다.
이 예에서 외부 문서는 passages 중첩 문서가 포함된 기본 문서입니다. nested 쿼리는 passages 중첩 문서 내에서 검색합니다.
중첩된 문서 내에서 일치하는 문서가 발견되면 쿼리는 일치하는 중첩된 문서와 함께 외부 문서를 반환합니다.
{
"query": {
"bool": {
"must": [
{
"nested": {
"path": "passages",
"query": {
"text_expansion": {
"passages.sparse.tokens": {
"model_id": ".elser_model_2_linux-x86_64",
"model_text": "$QUERY"
}
}
},
"inner_hits": {"_source": {"excludes": ["passages.sparse"]}}
}
}
],
"filter": "$FILTER"
}
},
"_source": false
}
내부 문서 쿼리하기
다음 코드 스니펫은 중첩된 문서 내의 내부 문서를 쿼리하는 예제입니다.
이 예제에서는 중첩된 문서 내에서 확장된 텍스트를 검색하고 필터를 적용한 다음 소스에서 특정 필드를 제외하고 일치하는 중첩된 문서가 있는 상위 문서를 반환합니다.
{
"query": {
"nested": {
"path": "passages",
"query": {
"bool": {
"should": [
{
"text_expansion": {
"passages.sparse.tokens": {
"model_id": ".elser_model_2_linux-x86_64",
"model_text": "$QUERY"
}
}
}
],
"filter": "$FILTER"
}
},
"inner_hits": {"_source": {"excludes": ["passages.sparse"]}}
}
},
"_source": false
}
여기서,
passages상위 문서 내에 내부 문서를 저장하는 중첩된 필드입니다. 인덱스에 다른 중첩된 필드를 사용하는 경우 업데이트해야 할 수도 있습니다.
passages.sparse.tokens내부 문서의 ELSER 토큰 또는 원시 텍스트를 저장하는 필드를 말합니다. 인덱스에 다른 중첩된 필드를 사용하는 경우 업데이트해야 할 수도 있습니다. ELSER 토큰을 사용할 수 없는 경우 원시 텍스트가 포함된 필드를 사용할 수도 있지만 검색 품질이 저하될 수 있습니다.
"inner_hits": {"_source": {"excludes": ["passages.sparse"]}}검색 결과의 내부 문서에서 ELSER 토큰을 제외합니다.
"_source": false검색 결과의 내부 문서만 사용되므로 검색 결과의 최상위 필드는 모두 제외됩니다.
$QUERY사용자 쿼리에 액세스하기 위한 변수입니다. 사용자 쿼리가 쿼리 본문으로 전달되는지 확인할 수 있습니다.
$FILTER이는 고급 설정에서 구성한 사용자 정의 필터에 접근하기 위한 Elasticsearch 변수입니다. 쿼리 본문에서 사용자 지정 필터가 사용되도록 할 수 있습니다.
외부 문서에 적용된 경우, 필터에서 사용할 수 있는 필드는 외부 필드만 해당됩니다. 내부 문서에 적용하면 내부 필드만 필터에 사용할 수 있습니다.
키워드 검색과 고밀도 벡터 검색을 결합한 하이브리드 검색
다음 코드 스니펫은 Elasticsearch 인덱스에서 기존 텍스트 검색과 k-근접 이웃( kNN ) 검색 및 순위를 결합한 복잡한 검색 쿼리의 예를 보여 줍니다:
{
"query": {
"bool": {
"should": [
{
"query_string": {
"query": "$QUERY",
"fields": ["$BODY_FIELD_NAME", "$TITLE_FIELD_NAME"],
}
}
],
"filter" : "$FILTER"
}
},
"knn": {
"field": "text_embedding.predicted_value",
"query_vector_builder": {
"text_embedding": {
"model_id": "intfloat__multilingual-e5-small",
"model_text": "$QUERY"
}
},
"k": 10,
"num_candidates": 100,
"filter" : "$FILTER"
},
"rank": {
"rrf": {}
},
"size": 10,
"_source": {"excludes": ["text_embedding.predicted_value"]}
}
여기서,
text_embedding.predicted_value밀도가 높은 벡터를 저장하는 필드를 말합니다. 인덱스에서 다른 필드를 사용하는 경우 업데이트해야 할 수 있습니다.
query_vector_builder아래의text_embedding자연어 처리 작업을 수행합니다. kNN 검색의 경우
text_embedding여야 합니다.intfloat__multilingual-e5-small임베딩 모델 ID입니다. 다른 임베딩 모델을 사용하려면 업데이트해야 할 수 있습니다.
$QUERY사용자 쿼리에 액세스하기 위한 변수입니다. 사용자 쿼리가 쿼리 본문으로 전달되는지 확인할 수 있습니다.
$BODY_FIELD_NAME및$TITLE_FIELD_NAME검색 연동에서 구성된 본문 필드와 제목 필드에 액세스하기 위한 변수입니다.
$FILTER이는 고급 설정에서 구성한 사용자 정의 필터에 접근하기 위한 Elasticsearch 변수입니다. 쿼리 본문에서 사용자 지정 필터가 사용되도록 할 수 있습니다.
rank.rrf키워드 검색과 밀도 벡터 검색의 검색 결과를 결합하는 상호 순위 융합(RRF) 방식입니다.
"_source": {"excludes": ["text_embedding.predicted_value"]}검색 결과에서 불필요한 고밀도 벡터 필드를 제외합니다.
중첩 쿼리를 사용하여 의미론적 텍스트 필드에서 검색하기
시맨틱 텍스트 필드에서 중첩된 문서를 쿼리하려면 다음 구조를 사용하세요. 이 구조는 Elasticsearch 통합에서 검색이 제대로 작동하도록 보장합니다.
{
"query": {
"nested": {
"path": "semtext.inference.chunks",
"query": {
"sparse_vector": {
"field": "semtext.inference.chunks.embeddings",
"inference_id": ".elser_model_2_linux-x86_64",
"query": "$QUERY"
}
},
"inner_hits": {"_source": {"excludes": ["semtext.inference.chunks.embeddings"]}}
}
},
"_source": false
}
여기서,
semtext시맨틱 필드의 이름입니다. 시맨틱 필드의 이름이 다른 경우 이를 업데이트해야 할 수도 있습니다. 자세한 내용은 문 서의 Elasticsearch 시맨틱 텍스트
필드 유형을 참조하십시오.
semtext.inference.chunks청크 텍스트와 임베딩을 저장하는 필드를 말합니다.
sparse_vector쿼리 유형(이 경우 sparse_vector 쿼리)을 지정합니다.
text_expansion쿼리와 비슷하지만 더 새로운 유형의 쿼리입니다.semtext.inference.chunks.embeddings청크된 텍스트의 임베딩을 저장하는 필드를 나타냅니다.