🚀 Попробуйте Zilliz Cloud, полностью управляемый Milvus, бесплатно — ощутите 10-кратное увеличение производительности! Попробовать сейчас>

milvus-logo
LFAI
  • Home
  • Blog
  • Как использовать строковые данные для расширения возможностей приложений поиска по сходству

Как использовать строковые данные для расширения возможностей приложений поиска по сходству

  • Engineering
August 08, 2022
Xi Ge

Cover Обложка

Milvus 2.1 поставляется с некоторыми значительными обновлениями, которые значительно упрощают работу с Milvus. Одно из них - поддержка строкового типа данных. В настоящее время Milvus поддерживает такие типы данных, как строки, векторы, булевы числа, целые числа, числа с плавающей точкой и многое другое.

В этой статье представлено введение в поддержку строкового типа данных. Прочитайте и узнайте, что вы можете с ним делать и как его использовать.

Перейти к:

Поддержка строкового типа данных была одной из наиболее ожидаемых пользователями функций. Она как упрощает процесс создания приложения с векторной базой данных Milvus, так и ускоряет скорость поиска по сходству и векторных запросов, в значительной степени повышая эффективность и снижая затраты на обслуживание любого приложения, над которым вы работаете.

В частности, Milvus 2.1 поддерживает тип данных VARCHAR, в котором хранятся символьные строки различной длины. Благодаря поддержке типа данных VARCHAR вы можете:

  1. Непосредственно управлять строковыми данными, не прибегая к помощи внешней реляционной базы данных.

Поддержка типа данных VARCHAR позволяет пропустить этап преобразования строк в другие типы данных при вставке данных в Milvus. Допустим, вы работаете над системой поиска книг для собственного книжного интернет-магазина. Вы создаете набор данных книг и хотите идентифицировать книги по их названиям. Если в предыдущих версиях Milvus не поддерживал строковый тип данных, то перед вставкой данных в MIilvus вам может понадобиться сначала преобразовать строки (названия книг) в идентификаторы книг с помощью реляционной базы данных, например MySQL. Сейчас, поскольку поддерживается строковый тип данных, вы можете просто создать строковое поле и напрямую вводить названия книг вместо их идентификационных номеров.

Удобство также распространяется на процесс поиска и запроса. Представьте, что есть клиент, чьей любимой книгой является Hello Milvus. Вы хотите найти в системе похожие книги и порекомендовать их клиенту. В предыдущих версиях Milvus система вернет вам только идентификаторы книг, и вам придется сделать дополнительный шаг, чтобы проверить соответствующую информацию о книге в реляционной базе данных. Но в Milvus 2.1 вы можете напрямую получить названия книг, поскольку вы уже создали строковое поле с названиями книг.

Одним словом, поддержка строкового типа данных избавляет вас от необходимости обращаться к другим инструментам для работы со строковыми данными, что значительно упрощает процесс разработки.

  1. Ускорение скорости гибридного поиска и векторных запросов за счет фильтрации атрибутов.

Как и другие скалярные типы данных, VARCHAR можно использовать для фильтрации атрибутов в гибридном поиске и векторных запросах с помощью булевых выражений. Особенно стоит отметить, что в Milvus 2.1 добавлен оператор like, который позволяет выполнять префиксное соответствие. Также с помощью оператора == можно выполнять точное сопоставление.

Кроме того, для ускорения гибридного поиска и запросов поддерживается инвертированный индекс на основе MARISA-trie. Продолжайте читать и узнайте обо всех строковых выражениях, которые вам понадобятся для выполнения фильтрации атрибутов в строковых данных.

Теперь мы знаем, что строковый тип данных чрезвычайно полезен, но когда именно нам нужно использовать этот тип данных при создании собственных приложений? Ниже вы увидите несколько примеров кода сценариев, в которых могут использоваться строковые данные, что позволит вам лучше понять, как управлять данными VARCHAR в Milvus 2.1.

Создание коллекции

Давайте продолжим предыдущий пример. Вы все еще работаете над системой рекомендаций книг и хотите создать коллекцию книг с полем первичного ключа book_name, в которое вы будете вставлять строковые данные. В этом случае при задании схемы поля можно установить тип данных DataType.VARCHAR, как показано в примере ниже.

Обратите внимание, что при создании поля VARCHAR необходимо указать максимальную длину символов с помощью параметра max_length, значение которого может варьироваться от 1 до 65 535. В данном примере мы задали максимальную длину 200.

from pymilvus import CollectionSchema, FieldSchema, DataType
book_id = FieldSchema(
  name="book_id", 
  dtype=DataType.INT64, 
)
book_name = FieldSchema( 
  name="book_name", 
  dtype=DataType.VARCHAR, 
  max_length=200, 
  is_primary=True, 
)
word_count = FieldSchema(
  name="word_count", 
  dtype=DataType.INT64,  
)
book_intro = FieldSchema(
  name="book_intro", 
  dtype=DataType.FLOAT_VECTOR, 
  dim=2
)
schema = CollectionSchema(
  fields=[book_id, word_count, book_intro], 
  description="Test book search"
)
collection_name = "book"

Вставка данных

Теперь, когда коллекция создана, мы можем вставить в нее данные. В следующем примере мы вставляем 2 000 строк случайно сгенерированных строковых данных.

import random
data = [
  [i for i in range(2000)],
  ["book_" + str(i) for i in range(2000)],
  [i for i in range(10000, 12000)],
  [[random.random() for _ in range(2)] for _ in range(2000)],
]

Удалить данные

Предположим, что две книги с названиями book_0 и book_1 больше не продаются в вашем магазине, и вы хотите удалить соответствующую информацию из базы данных. В этом случае вы можете использовать термин-выражение in для фильтрации сущностей для удаления, как показано в примере ниже.

Помните, что Milvus поддерживает удаление сущностей только с четко указанными первичными ключами, поэтому перед выполнением следующего кода убедитесь, что вы установили поле book_name в качестве поля первичного ключа.

expr = "book_name in [\"book_0\", \"book_1\"]" 
from pymilvus import Collection
collection = Collection("book")     
collection.delete(expr)

Построение индекса

Milvus 2.1 поддерживает построение скалярных индексов, что значительно ускоряет фильтрацию строковых полей. В отличие от построения векторного индекса, перед построением скалярного индекса не нужно подготавливать параметры. Временно Milvus поддерживает только индекс дерева словарей (MARISA-trie), поэтому тип индекса поля типа VARCHAR по умолчанию будет MARISA-trie.

Вы можете указать имя индекса при его построении. Если оно не указано, то по умолчанию используется значение index_name - "_default_idx_". В приведенном ниже примере мы назвали индекс scalar_index.

from pymilvus import Collection
collection = Collection("book")   
collection.create_index(
  field_name="book_name", 
  index_name="scalar_index",
)

Задавая булевы выражения, можно фильтровать строковые поля во время поиска векторного сходства.

Например, если вы ищете книги, вступление которых наиболее похоже на Hello Milvus, но хотите получить только те книги, названия которых начинаются с 'book_2', вы можете использовать оператор like, чтобы выполнить префиксное совпадение и получить целевые книги, как показано в примере ниже.

search_param = {
  "data": [[0.1, 0.2]],
  "anns_field": "book_intro",
  "param": {"metric_type": "L2", "params": {"nprobe": 10}},
  "limit": 2,
  "expr": "book_name like \"Hello%\"",
}
res = collection.search(**search_param)

Строковые выражения

Помимо недавно добавленного оператора like, для фильтрации строковых полей можно использовать и другие операторы, которые уже поддерживались в предыдущих версиях Milvus. Ниже приведены примеры часто используемых строковых выражений, где A представляет поле типа VARCHAR. Помните, что все приведенные ниже строковые выражения могут быть логически объединены с помощью логических операторов, таких как AND, OR и NOT.

Операции над множествами

Вы можете использовать in и not in для реализации операций над множествами, например A in ["str1", "str2"].

Сравнение двух строковых полей

Вы можете использовать реляционные операторы для сравнения значений двух строковых полей. К таким реляционным операторам относятся ==, !=, >, >=, <, <=. Дополнительные сведения см. в разделе Реляционные операторы.

Обратите внимание, что строковые поля можно сравнивать только с другими строковыми полями, а не с полями других типов данных. Например, поле типа VARCHAR нельзя сравнивать с полем типа Boolean или типа integer.

Сравнение поля с постоянным значением

Вы можете использовать == или !=, чтобы проверить, равно ли значение поля постоянному значению.

Фильтр полей с одним диапазоном

Вы можете использовать >, >=, <, <= для фильтрации строковых полей с одним диапазоном, например A > "str1".

Сопоставление префиксов

Как упоминалось ранее, в Milvus 2.1 добавлен оператор like для сопоставления префиксов, например A like "prefix%".

Что дальше

После официального выхода Milvus 2.1 мы подготовили серию блогов, в которых рассказываем о новых возможностях. Читайте подробнее в этой серии блогов:

Like the article? Spread the word

Продолжить чтение