구문 검색Compatible with Milvus 2.5.17+
구문 검색을 사용하면 검색어가 포함된 문서를 정확한 구문으로 검색할 수 있습니다. 기본적으로 단어는 동일한 순서로 서로 바로 옆에 나타나야 합니다. 예를 들어, ' 로봇 공학 기계 학습' 에 대한 쿼리는 '...일반적인 로봇 공학 기계 학습 모델...'과 같은 텍스트와 일치하며, 여기서 '로봇 공학', '기계', '학습' 이라는 단어가 그 사이에 다른 단어 없이 순서대로 나타납니다.
그러나 실제 시나리오에서는 엄격한 구문 일치가 너무 엄격할 수 있습니다. 예를 들어 "...로봇 공학에서 널리 채택된 머신 러닝 모델..."과 같은 텍스트를 일치시키고 싶을 수 있습니다. 여기에는 동일한 키워드가 나란히 있거나 원래 순서가 아닌 다른 키워드가 존재합니다. 이를 처리하기 위해 구문 검색은 slop 매개변수를 지원하여 유연성을 도입합니다. slop 값은 구문 내 용어 간에 허용되는 위치 이동 횟수를 정의합니다. 예를 들어 slop 값이 1인 경우, '머신 러닝' 에 대한 쿼리는 '...머신 딥 러닝...'과 같은 텍스트를 일치시킬 수 있으며, 여기서 한 단어("deep")가 원래 용어를 구분합니다.
개요
Tantivy 검색 엔진 라이브러리를 기반으로 하는 구문 일치는 문서 내 단어의 위치 정보를 분석하여 작동합니다. 아래 다이어그램은 그 과정을 보여줍니다:
구문 검색 워크플로
문서 토큰화: Milvus에 문서를 삽입하면 분석기를 사용하여 텍스트가 토큰(개별 단어 또는 용어)으로 분할되고 각 토큰에 위치 정보가 기록됩니다. 예를 들어, doc_1은 ["기계"(pos=0), "학습"(pos=1), "부스트"(pos=2), "효율성"(pos=3) ]으로 토큰화됩니다. 분석기에 대한 자세한 내용은 분석기 개요를 참조하세요.
역 인덱스 생성: Milvus는 각 토큰을 해당 토큰이 나타나는 문서와 해당 문서에서 토큰의 위치에 매핑하여 반전된 인덱스를 생성합니다.
구문매칭: 구문 쿼리가 실행되면 Milvus는 반전된 색인에서 각 토큰을 조회하고 위치를 확인하여 올바른 순서와 근접성으로 나타나는지 확인합니다.
slop매개변수는 일치하는 토큰 간에 허용되는 최대 위치 수를 제어합니다:slop = 0은 토큰이 정확한 순서로 바로 인접하여 나타나야 함을 의미합니다(즉, 그 사이에 여분의 단어가 없어야 함).
- 이 예에서는 doc_1 ( pos=0의"machine", pos=1의 "learning" )만 정확히 일치합니다.
slop = 2를 사용하면 일치하는 토큰 간의 위치를 최대 두 개까지 유연하게 조정하거나 재배열할 수 있습니다.
이를 통해 순서가 뒤바뀌거나("학습 머신") 토큰 사이에 작은 간격을 둘 수 있습니다.
따라서 doc_1, doc_2 ("학습" 위치=0, "기계" 위치=1), doc_3 ("학습" 위치=1, "기계" 위치=2)은 모두 일치합니다.
구문 검색 사용 설정
구문 일치는 Milvus의 문자열 데이터 유형인 VARCHAR 필드 유형에서 작동합니다. 구문 일치를 사용하려면 텍스트 일치와 유사하게 enable_analyzer 및 enable_match 매개 변수를 모두 True 로 설정하여 컬렉션 스키마를 구성하세요.
enable_analyzer 및 enable_match
특정 VARCHAR 필드에 대해 구문 일치를 사용하려면 필드 스키마를 정의할 때 enable_analyzer 및 enable_match 매개 변수를 모두 True 으로 설정합니다. 이 구성은 Milvus가 텍스트를 토큰화하고 효율적인 구문 일치를 위해 필요한 위치 정보가 포함된 반전 인덱스를 생성하도록 지시합니다.
다음은 구문 일치를 활성화하는 스키마 정의 예시입니다:
from pymilvus import MilvusClient, DataType
# Create a schema for a new collection
schema = MilvusClient.create_schema(enable_dynamic_field=False)
schema.add_field(
field_name="id",
datatype=DataType.INT64,
is_primary=True,
auto_id=True
)
# Add a VARCHAR field configured for phrase matching
schema.add_field(
field_name='text', # Name of the field
datatype=DataType.VARCHAR, # Field data type set as VARCHAR (string)
max_length=1000, # Maximum length of the string
enable_analyzer=True, # Enables text analysis (tokenization)
enable_match=True # Enables inverted indexing for phrase matching
)
schema.add_field(
field_name="embeddings",
datatype=DataType.FLOAT_VECTOR,
dim=5
)
선택 사항입니다: 분석기 구성
구문 일치 정확도는 텍스트 데이터를 토큰화하는 데 사용되는 분석기에 따라 크게 달라집니다. 분석기마다 언어와 텍스트 형식에 적합하며, 토큰화 및 위치 정확도에 영향을 미칩니다. 특정 사용 사례에 적합한 분석기를 선택하면 구문 매칭 결과를 최적화할 수 있습니다.
기본적으로 Milvus는 공백과 구두점을 기반으로 텍스트를 토큰화하고, 40자 이상의 토큰을 제거하며, 텍스트를 소문자로 변환하는 표준 분석기를 사용합니다. 기본 사용에는 추가 매개변수가 필요하지 않습니다. 자세한 내용은 표준 분석기를 참조하세요.
애플리케이션에 특정 분석기가 필요한 경우 analyzer_params 매개변수를 사용하여 구성하세요. 예를 들어, 다음은 영어 텍스트의 구문 일치를 위해 english 분석기를 구성하는 방법입니다:
# Define analyzer parameters for English-language tokenization
analyzer_params = {
"type": "english"
}
# Add the VARCHAR field with the English analyzer enabled
schema.add_field(
field_name='text', # Name of the field
datatype=DataType.VARCHAR, # Field data type set as VARCHAR
max_length=1000, # Maximum length of the string
enable_analyzer=True, # Enables text analysis
analyzer_params=analyzer_params, # Specifies the analyzer configuration
enable_match=True # Enables inverted indexing for phrase matching
)
Milvus는 다양한 언어 및 사용 사례에 맞게 조정된 여러 분석기를 지원합니다. 자세한 내용은 분석기 개요를 참조하세요.
구문 검색 사용
컬렉션 스키마에서 VARCHAR 필드에 대한 일치를 활성화한 후에는 PHRASE_MATCH 표현식을 사용하여 구문 일치를 수행할 수 있습니다.
PHRASE_MATCH 표현식은 대소문자를 구분하지 않습니다. PHRASE_MATCH 또는 phrase_match 을 사용할 수 있습니다.
PHRASE_MATCH 표현식 구문
PHRASE_MATCH 표현식을 사용하여 검색할 때 필드, 구문 및 선택적 유연성(slop)을 지정합니다. 구문은 다음과 같습니다:
PHRASE_MATCH(field_name, phrase, slop)
field_name: 구문 일치를 수행할VARCHAR필드의 이름입니다.phrase: 검색할 정확한 구문입니다.slop(선택 사항): 일치하는 토큰에서 허용되는 최대 위치 수를 지정하는 정수입니다.0(기본값): 정확한 구문만 일치시킵니다. 예시: '머신 러닝 '에 대한 필터는 ' 머신 러닝' 은 정확히 일치하지만 '머신 부스트 러닝' 이나 '러닝 머신'은 일치하지 않습니다 .1: 용어 하나 추가 또는 위치의 사소한 이동과 같은 사소한 변형을 허용합니다. 예시: "machine learning" 에 대한 필터는 "machine boosts learning" ( "machine" 과 "learning" 사이에 하나의 토큰이 있음 )과 일치하지만 "learning machine" (용어가 뒤바뀜)은 일치하지 않습니다.2: 용어 순서가 반전되거나 그 사이에 토큰이 최대 2개까지 포함되는 등 더 많은 유연성을 허용합니다. 예시: "machine learning" 에 대한 필터는 "learning machine" (용어가 반전됨) 또는 "machine quickly boosts learning" ( "machine" 과 "learning" 사이에 두 개의 토큰이 있음)과 일치합니다.
데이터 집합 예시
다음 5개의 엔티티가 포함된 tech_articles라는 이름의 컬렉션이 있다고 가정해 보겠습니다:
|
|
|---|---|
1 |
"기계 학습은 대규모 데이터 분석의 효율성을 높입니다." |
2 |
"기계 기반 접근 방식을 학습하는 것은 최신 AI 발전에 필수적입니다." |
3 |
"딥 러닝 머신 아키텍처는 계산 부하를 최적화합니다" |
4 |
"머신러닝은 지속적인 학습을 위해 모델 성능을 빠르게 개선합니다" |
5 |
"고급 머신 알고리즘 학습으로 AI 기능 확장" |
구문 일치를 통한 쿼리
query() 메서드를 사용할 때 PHRASE_MATCH는 스칼라 필터 역할을 합니다. 지정된 구문이 포함된 문서만(허용된 기울기에 따라) 반환됩니다.
예: slop = 0(정확히 일치)
이 예는 중간에 추가 토큰 없이 "machine learning"이라는 정확한 문구가 포함된 문서를 반환합니다.
# Match documents containing exactly "machine learning"
filter = "PHRASE_MATCH(text, 'machine learning')"
result = client.query(
collection_name="tech_articles",
filter=filter,
output_fields=["id", "text"]
)
예상 일치 결과
|
|
|---|---|
1 |
"대규모 데이터 분석의 효율성을 높여주는 머신 러닝" |
문서 1에만 추가 토큰 없이 지정된 순서대로 "machine learning"이라는 정확한 문구가 포함되어 있습니다.
구문 검색으로 검색
검색 작업에서 벡터 유사도 순위를 적용하기 전에 문서를 필터링하는 데 PHRASE_MATCH가 사용됩니다. 이 2단계 접근 방식은 먼저 텍스트 일치를 통해 후보 집합을 좁힌 다음 벡터 임베딩을 기반으로 후보의 순위를 다시 매깁니다.
예: 슬로프 = 1
여기서는 슬로프 1을 허용합니다. 이 필터는 '학습 기계'라는 문구가 포함된 문서에 약간의 유연성을 가지고 적용됩니다.
# Example: Filter documents containing "learning machine" with slop=1
filter_slop1 = "PHRASE_MATCH(text, 'learning machine', 1)"
result_slop1 = client.search(
collection_name="tech_articles",
anns_field="embeddings",
data=[query_vector],
filter=filter_slop1,
search_params={"params": {"nprobe": 10}},
limit=10,
output_fields=["id", "text"]
)
결과를 일치시킵니다:
|
|
|---|---|
2 |
"기계 기반 접근 방식을 학습하는 것은 최신 AI 발전에 필수적입니다." |
3 |
"딥 러닝 머신 아키텍처는 계산 부하를 최적화합니다" |
5 |
"고급 머신 알고리즘을 학습하면 AI 기능이 확장됩니다" |
예: 슬로프 = 2
이 예에서는 슬로프가 2로 허용되며, 이는 "machine" 과 "learning"이라는 단어 사이에 최대 2개의 추가 토큰(또는 반전된 용어)이 허용됨을 의미합니다.
# Example: Filter documents containing "machine learning" with slop=2
filter_slop2 = "PHRASE_MATCH(text, 'machine learning', 2)"
result_slop2 = client.search(
collection_name="tech_articles",
anns_field="embeddings", # Vector field name
data=[query_vector], # Query vector
filter=filter_slop2, # Filter expression
search_params={"params": {"nprobe": 10}},
limit=10, # Maximum results to return
output_fields=["id", "text"]
)
일치 결과:
|
|
|---|---|
1 |
"대규모 데이터 분석의 효율성을 높여주는 머신 러닝" |
3 |
"딥 러닝 머신 아키텍처는 계산 부하를 최적화합니다" |
예: 슬로프 = 3
이 예에서 슬로프 3은 훨씬 더 많은 유연성을 제공합니다. 이 필터는 단어 사이에 최대 3개의 토큰 위치가 허용되는 "머신 러닝" 을 검색합니다.
# Example: Filter documents containing "machine learning" with slop=3
filter_slop3 = "PHRASE_MATCH(text, 'machine learning', 3)"
result_slop2 = client.search(
collection_name="tech_articles",
anns_field="embeddings", # Vector field name
data=[query_vector], # Query vector
filter=filter_slop3, # Filter expression
search_params={"params": {"nprobe": 10}},
limit=10, # Maximum results to return
output_fields=["id", "text"]
)
일치하는 결과:
|
|
|---|---|
1 |
"대규모 데이터 분석의 효율성을 높여주는 머신 러닝" |
2 |
"기계 기반 접근 방식을 학습하는 것은 최신 AI 발전에 필수적입니다" |
3 |
"딥 러닝 머신 아키텍처는 계산 부하를 최적화합니다" |
5 |
"고급 머신 알고리즘 학습으로 AI 기능 확장" |
고려 사항
필드에 구문 일치를 활성화하면 스토리지 리소스를 소모하는 반전 인덱스가 생성됩니다. 이 기능을 사용하도록 설정할 때는 텍스트 크기, 고유 토큰, 사용되는 분석기에 따라 달라지므로 스토리지 영향을 고려하세요.
스키마에서 분석기를 정의하면 해당 컬렉션에 대해 해당 설정이 영구적으로 적용됩니다. 다른 분석기가 필요에 더 적합하다고 판단되면 기존 컬렉션을 삭제하고 원하는 분석기 구성으로 새 컬렉션을 만드는 것을 고려할 수 있습니다.
구문 검색 성능은 텍스트가 토큰화되는 방식에 따라 달라집니다. 전체 컬렉션에 분석기를 적용하기 전에
run_analyzer방법을 사용하여 토큰화 출력을 검토하세요. 자세한 내용은 분석기 개요를 참조하세요.filter표현식의 이스케이프 규칙:표현식 내에서 큰따옴표 또는 작은따옴표로 묶인 문자는 문자열 상수로 해석됩니다. 문자열 상수에 이스케이프 문자가 포함된 경우 이스케이프 문자는 이스케이프 시퀀스를 사용하여 표현해야 합니다. 예를 들어
\\은\,\\t은 탭\t,\\n은 개행으로 표현합니다.문자열 상수를 작은따옴표로 묶은 경우 상수 내의 작은따옴표는
\\'로 표시해야 하며 큰따옴표는"또는\\"로 표시할 수 있습니다. 예:'It\\'s milvus'.문자열 상수가 큰따옴표로 묶여 있는 경우 상수 내의 큰따옴표는
\\"로 표시하고 작은따옴표는'또는\\'로 표시할 수 있습니다. 예:"He said \\"Hi\\"".