Сопоставление фразCompatible with Milvus 2.5.17+
Фразовое соответствие позволяет искать документы, содержащие термины запроса в виде точной фразы. По умолчанию слова должны располагаться в том же порядке и непосредственно рядом друг с другом. Например, запрос "robotics machine learning" соответствует тексту типа "...typical robotics machine learning models...", где слова "robotics", "machine" и "learning" встречаются в той же последовательности и без других слов между ними.
Однако в реальных условиях строгое сопоставление фраз может оказаться слишком жестким. Вы можете захотеть подобрать текст типа "...модели машинного обучения, широко применяемые в робототехнике...". Здесь присутствуют одни и те же ключевые слова, но не рядом и не в оригинальном порядке. Чтобы справиться с этим, фразовое соответствие поддерживает параметр slop, который обеспечивает гибкость. Значение slop определяет, сколько позиционных сдвигов допускается между терминами во фразе. Например, при значении slop, равном 1, запрос "машинное обучение" может соответствовать тексту типа "...машинное глубокое обучение...", где одно слово ("глубокое") разделяет исходные термины.
Обзор
Работает на основе библиотеки поисковой системы Tantivy, а совпадение фраз происходит путем анализа позиционной информации слов в документах. Диаграмма ниже иллюстрирует процесс:
Рабочий процесс поиска по фразе
Токенизация документов: Когда вы вставляете документы в Milvus, текст разбивается на токены (отдельные слова или термины) с помощью анализатора, при этом для каждого токена записывается позиционная информация. Например, doc_1 разбивается на лексемы ["machine" (pos=0), "learning" (pos=1), "boosts" (pos=2), "efficiency" (pos=3)]. Дополнительную информацию об анализаторах см. в разделе Обзор анализаторов.
Создание инвертированного индекса: Milvus создает инвертированный индекс, сопоставляя каждую лексему с документом(ами), в которых она встречается, и позициями лексем в этих документах.
Сопоставление фраз: при выполнении фразового запроса Milvus ищет каждую лексему в инвертированном индексе и проверяет их позиции, чтобы определить, появляются ли они в правильном порядке и по соседству. Параметр
slopуправляет максимальным количеством позиций, допустимых между совпадающими лексемами:slop = 0 означает, что лексемы должны появляться в точном порядке и непосредственно рядом (т. е. без лишних слов между ними).
- В примере точно совпадает только doc_1 ("машина" в позиции=0, "обучение" в позиции=1).
slop = 2 допускает до двух позиций гибкости или перестановок между совпадающими лексемами.
Это позволяет использовать обратный порядок ("обучающая машина") или небольшой промежуток между лексемами.
Следовательно, doc_1, doc_2 ("обучение" при pos=0, "машина" при pos=1) и doc_3 ("обучение" при pos=1, "машина" при pos=2) совпадают.
Включение фразового соответствия
Фразовое соответствие работает с типом поля VARCHAR, строковым типом данных в Milvus. Чтобы включить согласование фраз, настройте схему коллекции, установив для параметров enable_analyzer и enable_match значение True, аналогичное параметру text match.
Установите 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(по умолчанию): Искать только точные фразы. Пример: Фильтр для "machine learning" будет точно соответствовать "machine learning", но не "machine boosts learning" или "learning machine".1: Позволяет незначительные вариации, например один дополнительный термин или небольшое смещение позиции. Пример: Фильтр для "machine learning" будет соответствовать "machine boosts learning" (одна лексема между "machine" и "learning"), но не "learning machine" (термины поменяны местами).2: Обеспечивает большую гибкость, включая обратный порядок терминов или до двух лексем между ними. Пример: Фильтр для "машинного обучения" будет соответствовать "обучающей машине" (термины перевернуты) или "машина быстро ускоряет обучение" (две лексемы между "машиной" и "обучением").
Пример набора данных
Предположим, у вас есть коллекция tech_articles, содержащая следующие пять сущностей:
|
|
|---|---|
1 |
"Машинное обучение повышает эффективность анализа крупномасштабных данных". |
2 |
"Обучение машинному подходу жизненно важно для современного прогресса ИИ" |
3 |
"Архитектуры машин глубокого обучения оптимизируют вычислительную нагрузку" |
4 |
"Машина быстро улучшает производительность модели для непрерывного обучения" |
5 |
"Изучение передовых машинных алгоритмов расширяет возможности ИИ". |
Запрос с фразовым соответствием
При использовании метода query() PHRASE_MATCH действует как скалярный фильтр. Возвращаются только документы, содержащие указанную фразу (с учетом допустимого slop).
Пример: slop = 0 (точное совпадение)
Этот пример возвращает документы, содержащие точную фразу "машинное обучение" без лишних лексем между ними.
# 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 содержит точную фразу "машинное обучение" в указанном порядке без дополнительных лексем.
Поиск с использованием фразового соответствия
В операциях поиска PHRASE_MATCH используется для фильтрации документов перед применением ранжирования по векторному сходству. Этот двухэтапный подход сначала сужает набор кандидатов путем текстового соответствия, а затем переранжирует их на основе векторных вкраплений.
Пример: slop = 1
Здесь мы допускаем значение slop = 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 |
"Обучение машинному подходу жизненно важно для современного прогресса ИИ" |
3 |
"Архитектуры машин глубокого обучения оптимизируют вычислительную нагрузку" |
5 |
"Изучение передовых машинных алгоритмов расширяет возможности ИИ" |
Пример: slop = 2
В этом примере допускается slop = 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 |
"Архитектуры машин глубокого обучения оптимизируют вычислительные нагрузки" |
Пример: slop = 3
В этом примере значение slop = 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 |
"Обучение машинному подходу жизненно важно для современного прогресса ИИ" |
3 |
"Архитектуры машин глубокого обучения оптимизируют вычислительные нагрузки" |
5 |
"Изучение передовых машинных алгоритмов расширяет возможности ИИ" |
Соображения
Включение функции сопоставления фраз для поля приводит к созданию инвертированного индекса, который потребляет ресурсы хранения. При решении включить эту функцию учитывайте влияние на хранилище, поскольку оно зависит от размера текста, количества уникальных лексем и используемого анализатора.
После определения анализатора в схеме его настройки становятся постоянными для данной коллекции. Если вы решите, что другой анализатор будет лучше соответствовать вашим потребностям, вы можете удалить существующую коллекцию и создать новую с нужной конфигурацией анализатора.
Производительность поиска фраз зависит от способа токенизации текста. Прежде чем применять анализатор ко всей коллекции, используйте метод
run_analyzerдля просмотра результатов токенизации. Дополнительные сведения см. в разделе Обзор анализатора.Правила экранирования в выражениях
filter:Символы, заключенные в двойные или одинарные кавычки в выражениях, интерпретируются как строковые константы. Если строковая константа включает в себя управляющие символы, они должны быть представлены с помощью управляющей последовательности. Например, используйте
\\для обозначения\,\\tдля обозначения табуляции\t, и\\nдля обозначения новой строки.Если строковая константа заключена в одинарные кавычки, то одинарная кавычка внутри константы должна быть представлена как
\\', а двойная кавычка может быть представлена как"или\\". Пример:'It\\'s milvus'.Если строковая константа заключена в двойные кавычки, то двойная кавычка внутри константы должна быть представлена как
\\", а одинарная кавычка может быть представлена как'или\\'. Пример:"He said \\"Hi\\"".