Основные операторы

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

Операторы сравнения

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

Поддерживаемые операторы сравнения

  • == (Равно)

  • != (Не равно)

  • > (Больше)

  • < (Меньше)

  • >= (Больше или равно)

  • <= (Меньше или равно)

Пример 1: Фильтрация по равенству (==)

Предположим, у вас есть поле с именем « status », и вы хотите найти все сущности, у которых значение « status » равно «active». Для этого можно использовать оператор равенства « == »:

filter = 'status == "active"'

Пример 2: Фильтрация по неравенству (!=)

Чтобы найти сущности, у которых status не равно «inactive»:

filter = 'status != "inactive"'

Пример 3: Фильтрация по условию «больше» (>)

Если вы хотите найти все сущности, у которых age больше 30:

filter = 'age > 30'

Пример 4: Фильтрация по значению «меньше»

Чтобы найти сущности, у которых price меньше 100:

filter = 'price < 100'

Пример 5: Фильтрация по значению «больше или равно» (>=)

Если вы хотите найти все сущности, у которых rating больше или равно 4:

filter = 'rating >= 4'

Пример 6: Фильтрация по условию «меньше или равно»

Чтобы найти сущности с показателем « discount », не превышающим 10%:

filter = 'discount <= 10'

Операторы диапазона

Операторы диапазона помогают фильтровать данные на основе определенного набора значений. Milvus поддерживает IN для проверки принадлежности к множеству.

Если вы хотите найти все сущности, у которых значение « color » равно «red», «green» или «blue»:

filter = 'color in ["red", "green", "blue"]'

Это полезно, когда требуется проверить принадлежность к списку значений.

Операторы сопоставления шаблонов

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

  • LIKE: Используется для сопоставления простых шаблонов с подстановочными знаками со строковыми значениями. Например, name LIKE "Prod%" сопоставляет значения, начинающиеся с Prod.

  • =~: Используется для сопоставления строкового значения с регулярным выражением RE2. Например, code =~ "E[0-9]{4}" сопоставляет значения, содержащие код ошибки, такой как E1001.

  • !~: Используется для исключения строковых значений, соответствующих регулярному выражению RE2. Это эквивалентно выражению NOT (field =~ "pattern").

Чтобы найти сущности, у которых name начинается с Prod:

filter = 'name LIKE "Prod%"'

Чтобы найти сущности, у которых code содержит код ошибки, например E1001:

filter = 'code =~ "E[0-9]{4}"'

Чтобы исключить сущности, у которых message начинается с DEBUG:

filter = 'message !~ "^DEBUG"'

Более подробную информацию о выборе между LIKE и регулярными выражениями, поддерживаемых типах полей, синтаксисе регулярных выражений, правилах экранирования и производительности см. в разделе «Сопоставление шаблонов». Milvus также позволяет создавать индекс NGRAM для полей VARCHAR или строк-путей JSON, чтобы ускорить работу соответствующих фильтров сопоставления шаблонов. Подробности см. в разделе «NGRAM».

Арифметические операторы

Арифметические операторы позволяют создавать условия на основе вычислений с числовыми полями.

Поддерживаемые арифметические операторы

  • + (Сложение)

  • - (Вычитание)

  • * (Умножение)

  • / (Деление)

  • % (Модуль)

  • ** (Возведение в степень)

Пример 1: Использование модуля (%)

Чтобы найти числа, у которых id является чётным числом (т. е. делится на 2):

filter = 'id % 2 == 0'

Пример 2: Использование возведения в степень (**)

Чтобы найти элементы, у которых price, возведенное в степень 2, больше 1000:

filter = 'price ** 2 > 1000'

Побитовые операторыCompatible with Milvus 3.0.0+

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

Для скалярных полей битовые операторы применяются к целочисленным типам полей, таким как INT8, INT16, INT32 и INT64.

Поддерживаемые битовые операторы

ОператорНазваниеТипичное использование
&Побитовое ANDПроверка, установлены ли определенные биты.
|Побитовое «ИЛИ»Объединение битов перед сравнением.
^Побитовое ИЛИ-ИЛИСравнить различия в битах между двумя значениями.

Пример: фильтрация по битам прав доступа

Предположим, у вас есть целочисленное поле с именем « permissions », и каждый бит в этом целом числе представляет флаг прав доступа:

Флаг прав доступаЗначение бита
READ1
WRITE2
SHARE4
ADMIN8

Например, значение « permissions = 5 » означает, что установлены биты « READ » и « SHARE », поскольку 5 = 1 + 4.

Чтобы найти объекты, у которых установлен бит SHARE, используйте побитовое AND (&):

filter = "(permissions & 4) == 4"

Чтобы найти объекты, у которых установка бита WRITE приводит к набору прав доступа READ + WRITE + SHARE, используйте битовое ИЛИ (|):

filter = "(permissions | 2) == 7"

Чтобы найти объекты, у которых биты прав доступа отличаются от READ + WRITE + SHARE только битом WRITE, используйте битовое ИЛИ-ИСКЛЮЧЕНИЕ (^):

filter = "(permissions ^ 7) == 2"

Всегда заключайте битовую операцию в скобки перед сравнением результата, например (permissions & 4) == 4. Milvus 3.0.0 поддерживает &, | и ^ в выражениях фильтра. Битовое «NOT» (~) и операторы сдвига (<< и >>) не поддерживаются.

Логические операторы

Логические операторы используются для объединения нескольких условий в более сложное выражение фильтра. К ним относятся AND, OR и NOT.

Поддерживаемые логические операторы

  • AND: Объединяет несколько условий, которые все должны быть истинными.

  • OR: Объединяет условия, при этом хотя бы одно из них должно быть истинным.

  • NOT: Отрицает условие.

Пример 1: Использование AND для объединения условий

Чтобы найти все товары, для которых значение параметра « price » превышает 100, а значение параметра « stock » превышает 50:

filter = 'price > 100 AND stock > 50'

Пример 2: Использование параметра « OR » для объединения условий

Чтобы найти все товары, у которых показатель « color » равен либо «red», либо «blue»:

filter = 'color == "red" OR color == "blue"'

Пример 3: Использование параметра « NOT » для исключения условия

Чтобы найти все товары, у которых значение параметра « color » не равно «green»:

filter = 'NOT color == "green"'

Операторы IS NULL и IS NOT NULL

Операторы IS NULL и IS NOT NULL используются для фильтрации полей в зависимости от того, содержат ли они нулевое значение (отсутствие данных).

  • IS NULL: Определяет сущности, в которых конкретное поле содержит значение null, т. е. значение отсутствует или не определено.

  • IS NOT NULL: Выделяет сущности, в которых конкретное поле содержит любое значение, кроме null, то есть поле имеет действительное, определённое значение.

Операторы нечувствительны к регистру, поэтому можно использовать как « IS NULL », так и « is null », а также как « IS NOT NULL », так и « is not null ».

Обычные скалярные поля с нулевыми значениями

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

Пустая строка "" не рассматривается как нулевое значение для поля VARCHAR.

Чтобы извлечь сущности, у которых поле description имеет значение null:

filter = 'description IS NULL'

Чтобы извлечь сущности, у которых поле ` description ` не равно `null`:

filter = 'description IS NOT NULL'

Чтобы получить сущности, у которых поле description не равно null, а значение поля price превышает 10:

filter = 'description IS NOT NULL AND price > 10'

Поля JSON с нулевыми значениями

Milvus позволяет фильтровать по полям JSON, содержащим нулевые значения. Поле JSON считается нулевым в следующих случаях:

  • Весь объект JSON явно установлен в None (null), например, {"metadata": None}.

  • Само поле JSON полностью отсутствует в сущности.

Если некоторые элементы внутри объекта JSON имеют значение null (например, отдельные ключи), поле по-прежнему считается не null. Например, \{"metadata": \{"category": None, "price": 99.99}} не рассматривается как null, даже если ключ category имеет значение null.

Чтобы более наглядно продемонстрировать, как Milvus обрабатывает поля JSON с нулевыми значениями, рассмотрим следующие примерные данные с полем JSON metadata:

data = [
  {
      "metadata": {"category": "electronics", "price": 99.99, "brand": "BrandA"},
      "pk": 1,
      "embedding": [0.12, 0.34, 0.56]
  },
  {
      "metadata": None, # Entire JSON object is null
      "pk": 2,
      "embedding": [0.56, 0.78, 0.90]
  },
  {  # JSON field `metadata` is completely missing
      "pk": 3,
      "embedding": [0.91, 0.18, 0.23]
  },
  {
      "metadata": {"category": None, "price": 99.99, "brand": "BrandA"}, # Individual key value is null
      "pk": 4,
      "embedding": [0.56, 0.38, 0.21]
  }
]

Пример 1: Поиск сущностей, у которых метаданные имеют значение null

Чтобы найти сущности, у которых поле metadata либо отсутствует, либо явно установлено в None:

filter = 'metadata IS NULL'

# Example output:
# data: [
#     "{'metadata': None, 'pk': 2}",
#     "{'metadata': None, 'pk': 3}"
# ]

Пример 2: Поиск сущностей, у которых метаданные не равны null

Чтобы найти сущности, у которых поле ` metadata ` не равно `null`:

filter = 'metadata IS NOT NULL'

# Example output:
# data: [
#     "{'metadata': {'category': 'electronics', 'price': 99.99, 'brand': 'BrandA'}, 'pk': 1}",
#     "{'metadata': {'category': None, 'price': 99.99, 'brand': 'BrandA'}, 'pk': 4}"
# ]

Поля ARRAY с нулевыми значениями

Milvus позволяет фильтровать по полям типа ARRAY, содержащим нулевые значения. Поле типа ARRAY рассматривается как имеющее значение null в следующих случаях:

  • Весь ARRAY-поле явно установлено в None (null), например, "tags": None.

  • Поле ARRAY полностью отсутствует в сущности.

Поле ARRAY не может содержать частичные нулевые значения, так как все элементы в поле ARRAY должны иметь одинаковый тип данных. Подробности см. в разделе «Поле массива».

Чтобы более наглядно продемонстрировать, как Milvus обрабатывает поля ARRAY с нулевыми значениями, рассмотрим следующие примерные данные с полем ARRAY tags:

data = [
  {
      "tags": ["pop", "rock", "classic"],
      "ratings": [5, 4, 3],
      "pk": 1,
      "embedding": [0.12, 0.34, 0.56]
  },
  {
      "tags": None,  # Entire ARRAY is null
      "ratings": [4, 5],
      "pk": 2,
      "embedding": [0.78, 0.91, 0.23]
  },
  {  # The tags field is completely missing
      "ratings": [9, 5],
      "pk": 3,
      "embedding": [0.18, 0.11, 0.23]
  }
]

Пример 1: Поиск сущностей, в которых поле tags имеет значение null

Чтобы извлечь сущности, в которых поле ` tags ` либо отсутствует, либо явно установлено в значение ` None`:

filter = 'tags IS NULL'

# Example output:
# data: [
#     "{'tags': None, 'ratings': [4, 5], 'embedding': [0.78, 0.91, 0.23], 'pk': 2}",
#     "{'tags': None, 'ratings': [9, 5], 'embedding': [0.18, 0.11, 0.23], 'pk': 3}"
# ]

Пример 2: Поиск сущностей, у которых поле «tags» не равно null

Чтобы получить сущности, у которых поле ` tags ` не равно `null`:

filter = 'tags IS NOT NULL'

# Example output:
# data: [
#     "{'metadata': {'category': 'electronics', 'price': 99.99, 'brand': 'BrandA'}, 'pk': 1}",
#     "{'metadata': {'category': None, 'price': 99.99, 'brand': 'BrandA'}, 'pk': 4}"
# ]

Советы по использованию базовых операторов с полями JSON и ARRAY

Хотя базовые операторы в Milvus универсальны и могут применяться к скалярным полям, их также можно эффективно использовать с ключами и индексами в полях JSON и ARRAY.

Например, если у вас есть поле « product », содержащее несколько ключей, таких как price, model и tags, всегда указывайте ключ напрямую:

filter = 'product["price"] > 1000'

Чтобы найти записи, в которых первая температура в массиве зарегистрированных значений температуры превышает определённое значение, используйте:

filter = 'history_temperatures[0] > 30'

Заключение

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

Часто задаваемые вопросы

Существует ли ограничение на длину списка значений соответствия в условиях фильтрации (например, filter=’color in ["red", "green", “blue”]')? Что делать, если список слишком длинный?

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

ПереведеноDeepL

Содержание

Попробуйте Managed Milvus бесплатно

Zilliz Cloud работает без проблем, поддерживается Milvus и в 10 раз быстрее.

Начать
Обратная связь

Была ли эта страница полезной?