milvus-logo
LFAI
홈페이지
  • 사용자 가이드

텍스트 일치

Milvus의 텍스트 일치는 특정 용어를 기반으로 정확한 문서 검색을 가능하게 합니다. 이 기능은 주로 특정 조건을 충족하는 필터링 검색에 사용되며, 스칼라 필터링을 통합하여 쿼리 결과를 구체화함으로써 스칼라 기준을 충족하는 벡터 내에서 유사성 검색을 할 수 있습니다.

텍스트 일치는 일치하는 문서의 관련성에 점수를 매기지 않고 쿼리 용어의 정확한 표현을 찾는 데 중점을 둡니다. 쿼리 용어의 의미론적 의미와 중요도에 따라 가장 관련성이 높은 문서를 검색하려면 전체 텍스트 검색을 사용하는 것이 좋습니다.

개요

Milvus는 기본 반전 색인 및 용어 기반 텍스트 검색을 강화하기 위해 Tantivy를 통합합니다. 각 텍스트 항목에 대해 Milvus는 절차에 따라 색인을 생성합니다.

  1. 분석기: 분석기는 입력 텍스트를 개별 단어 또는 토큰으로 토큰화한 다음 필요에 따라 필터를 적용하여 처리합니다. 이를 통해 Milvus는 이러한 토큰을 기반으로 색인을 구축할 수 있습니다.

  2. 인덱싱: 텍스트 분석 후, Milvus는 각 고유 토큰을 해당 토큰이 포함된 문서에 매핑하는 역 인덱스를 생성합니다.

사용자가 텍스트 일치를 수행하면 반전된 색인을 사용하여 해당 용어가 포함된 모든 문서를 빠르게 검색합니다. 이는 각 문서를 개별적으로 스캔하는 것보다 훨씬 빠릅니다.

Text Match 텍스트 일치

텍스트 일치 사용

텍스트 일치는 기본적으로 Milvus의 문자열 데이터 유형인 VARCHAR 필드 유형에서 작동합니다. 텍스트 일치를 사용하려면 enable_analyzerenable_match 을 모두 True 로 설정한 다음 컬렉션 스키마를 정의할 때 텍스트 분석을 위한 분석기를 선택적으로 구성하세요.

enable_analyzerenable_match설정

특정 VARCHAR 필드에 대해 텍스트 일치를 사용하려면 필드 스키마를 정의할 때 enable_analyzerenable_match 매개 변수를 모두 True 으로 설정합니다. 이렇게 하면 Milvus가 텍스트를 토큰화하고 지정된 필드에 대해 반전된 인덱스를 생성하도록 지시하여 빠르고 효율적인 텍스트 일치를 가능하게 합니다.

from pymilvus import MilvusClient, DataType

schema = MilvusClient.create_schema(auto_id=True, enable_dynamic_field=False)

schema.add_field(
    field_name='text', 
    datatype=DataType.VARCHAR, 
    max_length=1000, 
    enable_analyzer=True, # Whether to enable text analysis for this field
    enable_match=True # Whether to enable text match
)

import io.milvus.v2.common.DataType;
import io.milvus.v2.service.collection.request.AddFieldReq;
import io.milvus.v2.service.collection.request.CreateCollectionReq;

CreateCollectionReq.CollectionSchema schema = CreateCollectionReq.CollectionSchema.builder()
        .enableDynamicField(false)
        .build();

schema.addField(AddFieldReq.builder()
        .fieldName("text")
        .dataType(DataType.VarChar)
        .maxLength(1000)
        .enableAnalyzer(true)
        .enableMatch(true)
        .build());

const schema = [
  {
    name: "id",
    data_type: DataType.Int64,
    is_primary_key: true,
  },
  {
    name: "text",
    data_type: "VarChar",
    enable_analyzer: true,
    enable_match: true,
    max_length: 1000,
  },
  {
    name: "sparse",
    data_type: DataType.SparseFloatVector,
  },
];

export schema='{
        "autoId": true,
        "enabledDynamicField": false,
        "fields": [
            {
                "fieldName": "id",
                "dataType": "Int64",
                "isPrimary": true
            },
            {
                "fieldName": "text",
                "dataType": "VarChar",
                "elementTypeParams": {
                    "max_length": 1000,
                    "enable_analyzer": true,
                    "enable_match": true
                }
            },
            {
                "fieldName": "sparse",
                "dataType": "SparseFloatVector"
            }
        ]
    }'

선택 사항입니다: 분석기 구성

텍스트 매칭의 성능과 정확도는 선택한 분석기에 따라 달라집니다. 다양한 분석기는 다양한 언어와 텍스트 구조에 맞춰져 있으므로 올바른 분석기를 선택하면 특정 사용 사례에 대한 검색 결과에 큰 영향을 미칠 수 있습니다.

기본적으로 Milvus는 공백과 구두점을 기준으로 텍스트를 토큰화하고, 40자 이상의 토큰을 제거하며, 텍스트를 소문자로 변환하는 standard 분석기를 사용합니다. 이 기본 설정을 적용하는 데는 추가 매개변수가 필요하지 않습니다. 자세한 내용은 표준을 참조하세요.

다른 분석기가 필요한 경우에는 analyzer_params 매개변수를 사용하여 분석기를 구성할 수 있습니다. 예를 들어 영어 텍스트 처리를 위해 english 분석기를 적용합니다.

analyzer_params={
    "type": "english"
}

schema.add_field(
    field_name='text', 
    datatype=DataType.VARCHAR, 
    max_length=200, 
    enable_analyzer=True,
    analyzer_params=analyzer_params,
    enable_match=True, 
)

Map<String, Object> analyzerParams = new HashMap<>();
analyzerParams.put("type", "english");
schema.addField(AddFieldReq.builder()
        .fieldName("text")
        .dataType(DataType.VarChar)
        .maxLength(200)
        .enableAnalyzer(true)
        .analyzerParams(analyzerParams)
        .enableMatch(true)
        .build());

const schema = [
  {
    name: "id",
    data_type: DataType.Int64,
    is_primary_key: true,
  },
  {
    name: "text",
    data_type: "VarChar",
    enable_analyzer: true,
    enable_match: true,
    max_length: 1000,
    analyzer_params: { type: 'english' },
  },
  {
    name: "sparse",
    data_type: DataType.SparseFloatVector,
  },
];

export schema='{
        "autoId": true,
        "enabledDynamicField": false,
        "fields": [
            {
                "fieldName": "id",
                "dataType": "Int64",
                "isPrimary": true
            },
            {
                "fieldName": "text",
                "dataType": "VarChar",
                "elementTypeParams": {
                    "max_length": 200,
                    "enable_analyzer": true,
                    "enable_match": true,
                    "analyzer_params": {"type": "english"}
                }
            },
            {
                "fieldName": "my_vector",
                "dataType": "FloatVector",
                "elementTypeParams": {
                    "dim": "5"
                }
            }
        ]
    }'

Milvus는 그 외에도 다양한 언어와 시나리오에 적합한 다양한 분석기를 제공합니다. 자세한 내용은 개요를 참조하세요.

텍스트 일치 사용

컬렉션 스키마에서 VARCHAR 필드에 대해 텍스트 일치를 사용하도록 설정한 후에는 TEXT_MATCH 표현식을 사용하여 텍스트 일치를 수행할 수 있습니다.

TEXT_MATCH 표현식 구문

TEXT_MATCH 표현식은 검색할 필드와 용어를 지정하는 데 사용됩니다. 구문은 다음과 같습니다.

TEXT_MATCH(field_name, text)

  • field_name: 검색할 VARCHAR 필드의 이름입니다.

  • text: 검색할 용어입니다. 언어 및 구성된 분석기에 따라 여러 용어를 공백이나 기타 적절한 구분 기호로 구분할 수 있습니다.

기본적으로 TEXT_MATCHOR 일치 논리를 사용하므로 지정된 용어가 포함된 문서를 반환합니다. 예를 들어 text 필드에 machine 또는 deep 이라는 용어가 포함된 문서를 검색하려면 다음 표현식을 사용합니다.

filter = "TEXT_MATCH(text, 'machine deep')"
String filter = "TEXT_MATCH(text, 'machine deep')";
const filter = "TEXT_MATCH(text, 'machine deep')";
export filter="\"TEXT_MATCH(text, 'machine deep')\""

논리 연산자를 사용하여 여러 개의 TEXT_MATCH 표현식을 결합하여 AND 일치를 수행할 수도 있습니다. 예를 들어 text 필드에 machinedeep 이 모두 포함된 문서를 검색하려면 다음 표현식을 사용합니다.

filter = "TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'deep')"
String filter = "TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'deep')";
const filter = "TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'deep')"
export filter="\"TEXT_MATCH(text, 'machine') and TEXT_MATCH(text, 'deep')\""

텍스트 일치로 검색

텍스트 일치를 벡터 유사도 검색과 함께 사용하면 검색 범위를 좁히고 검색 성능을 향상시킬 수 있습니다. 벡터 유사도 검색 전에 텍스트 일치를 사용하여 컬렉션을 필터링하면 검색해야 하는 문서 수를 줄여 쿼리 시간을 단축할 수 있습니다.

이 예에서 filter 표현식은 지정된 용어 keyword1 또는 keyword2 와 일치하는 문서만 포함하도록 검색 결과를 필터링합니다. 그런 다음 이 필터링된 문서의 하위 집합에서 벡터 유사성 검색이 수행됩니다.

# Match entities with `keyword1` or `keyword2`
filter = "TEXT_MATCH(text, 'keyword1 keyword2')"

# Assuming 'embeddings' is the vector field and 'text' is the VARCHAR field
result = MilvusClient.search(
    collection_name="YOUR_COLLECTION_NAME", # Your collection name
    anns_field="embeddings", # Vector field name
    data=[query_vector], # Query vector
    filter=filter,
    search_params={"params": {"nprobe": 10}},
    limit=10, # Max. number of results to return
    output_fields=["id", "text"] # Fields to return
)

String filter = "TEXT_MATCH(text, 'keyword1 keyword2')";

SearchResp searchResp = client.search(SearchReq.builder()
        .collectionName("YOUR_COLLECTION_NAME")
        .annsField("embeddings")
        .data(Collections.singletonList(queryVector)))
        .filter(filter)
        .topK(10)
        .outputFields(Arrays.asList("id", "text"))
        .build());
// Match entities with `keyword1` or `keyword2`
const filter = "TEXT_MATCH(text, 'keyword1 keyword2')";

// Assuming 'embeddings' is the vector field and 'text' is the VARCHAR field
const result = await client.search(
    collection_name: "YOUR_COLLECTION_NAME", // Your collection name
    anns_field: "embeddings", // Vector field name
    data: [query_vector], // Query vector
    filter: filter,
    params: {"nprobe": 10},
    limit: 10, // Max. number of results to return
    output_fields: ["id", "text"] //Fields to return
);
export filter="\"TEXT_MATCH(text, 'keyword1 keyword2')\""

export CLUSTER_ENDPOINT="http://localhost:19530"
export TOKEN="root:Milvus"

curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
-d '{
    "collectionName": "demo2",
    "annsField": "my_vector",
    "data": [[0.19886812562848388, 0.06023560599112088, 0.6976963061752597, 0.2614474506242501, 0.838729485096104]],
    "filter": '"$filter"',
    "searchParams": {
        "params": {
            "nprobe": 10
        }
    },
    "limit": 3,
    "outputFields": ["text","id"]
}'

텍스트 일치를 사용한 쿼리

텍스트 일치는 쿼리 작업에서 스칼라 필터링에도 사용할 수 있습니다. query() 메서드의 expr 매개변수에 TEXT_MATCH 표현식을 지정하면 주어진 용어와 일치하는 문서를 검색할 수 있습니다.

아래 예는 text 필드에 keyword1keyword2 라는 용어가 모두 포함된 문서를 검색합니다.

# Match entities with both `keyword1` and `keyword2`
filter = "TEXT_MATCH(text, 'keyword1') and TEXT_MATCH(text, 'keyword2')"

result = MilvusClient.query(
    collection_name="YOUR_COLLECTION_NAME",
    filter=filter, 
    output_fields=["id", "text"]
)

String filter = "TEXT_MATCH(text, 'keyword1') and TEXT_MATCH(text, 'keyword2')";

QueryResp queryResp = client.query(QueryReq.builder()
        .collectionName("YOUR_COLLECTION_NAME")
        .filter(filter)
        .outputFields(Arrays.asList("id", "text"))
        .build()
);
// Match entities with both `keyword1` and `keyword2`
const filter = "TEXT_MATCH(text, 'keyword1') and TEXT_MATCH(text, 'keyword2')";

const result = await client.query(
    collection_name: "YOUR_COLLECTION_NAME",
    filter: filter, 
    output_fields: ["id", "text"]
)
export filter="\"TEXT_MATCH(text, 'keyword1') and TEXT_MATCH(text, 'keyword2')\""

export CLUSTER_ENDPOINT="http://localhost:19530"
export TOKEN="root:Milvus"

curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/query" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
-d '{
    "collectionName": "demo2",
    "filter": '"$filter"',
    "outputFields": ["id", "text"]
}'

고려 사항

  • 필드에 대해 텍스트 일치를 활성화하면 반전 인덱스가 생성되어 스토리지 리소스를 소모합니다. 이 기능을 사용하도록 설정할 때는 텍스트 크기, 고유 토큰 및 사용되는 분석기에 따라 달라지므로 스토리지 영향을 고려하세요.

  • 스키마에서 분석기를 정의하면 해당 컬렉션에 대해 해당 설정이 영구적으로 적용됩니다. 다른 분석기가 필요에 더 적합하다고 판단되면 기존 컬렉션을 삭제하고 원하는 분석기 구성으로 새 컬렉션을 만들 수 있습니다.

번역DeepL

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started
피드백

이 페이지가 도움이 되었나요?