Выражения в поиске

Manticore позволяет использовать произвольные арифметические выражения как через SQL, так и через HTTP, включая значения атрибутов, внутренние атрибуты (ID документа и вес релевантности), арифметические операции, несколько встроенных функций и пользовательские функции. Ниже приведён полный справочный список для быстрого доступа.

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

+, -, *, /, %, DIV, MOD

Доступны стандартные арифметические операторы. Арифметические вычисления с использованием этих операторов могут выполняться в трёх различных режимах:

  1. с использованием чисел с плавающей запятой одинарной точности, 32-битных по стандарту IEEE 754 (по умолчанию),
  2. с использованием знаковых 32-битных целых чисел,
  3. с использованием знаковых 64-битных целых чисел.

Парсер выражений автоматически переключается в целочисленный режим, если ни одна операция не приводит к значению с плавающей точкой. В противном случае используется режим с плавающей точкой по умолчанию. Например, a+b будет вычислено с использованием 32-битных целых чисел, если оба аргумента 32-битные целые; или с использованием 64-битных целых, если оба аргумента целые, но один из них 64-битный; или в формате с плавающей точкой в остальных случаях. Однако a/b или sqrt(a) всегда будут вычисляться в формате с плавающей точкой, так как эти операции возвращают нецелочисленный результат. Чтобы избежать этого, можно использовать IDIV(a,b) или форму DIV b. Кроме того, a*b не будет автоматически повышать разрядность до 64-бит при аргументах 32-бит. Чтобы обеспечить 64-битный результат, используйте BIGINT(), но учтите, что если присутствуют операции с нецелочисленными значениями, BIGINT() будет просто проигнорирован.

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

<, > <=, >=, =, <>

Операторы сравнения возвращают 1.0, когда условие истинно, и 0.0 в противном случае. Например, (a=b)+3 вычисляется как 4, когда атрибут a равен атрибуту b, и как 3, когда a не равен. В отличие от MySQL, сравнения на равенство (т.е. операторы = и <>) включают небольшой порог равенства (по умолчанию 1e-6). Если разница между сравниваемыми значениями находится в пределах порога, они считаются равными.

Операторы BETWEEN и IN в случае многозначных атрибутов возвращают true, если хотя бы одно значение соответствует условию (аналогично ANY()). Оператор IN не поддерживает JSON-атрибуты. Оператор IS (NOT) NULL поддерживается только для JSON-атрибутов.

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

AND, OR, NOT

Логические операторы (AND, OR, NOT) ведут себя ожидаемо. Они являются левосторонне ассоциативными и имеют самый низкий приоритет по сравнению с другими операторами. NOT имеет более высокий приоритет, чем AND и OR, но всё же ниже, чем любой другой оператор. AND и OR имеют одинаковый приоритет, поэтому рекомендуется использовать скобки, чтобы избежать путаницы в сложных выражениях.

Побитовые операторы

&, |

Эти операторы выполняют побитовое И и ИЛИ соответственно. Операнды должны быть целочисленных типов.

Функции:

Выражения в HTTP JSON

В интерфейсе HTTP JSON поддерживаются выражения через script_fields и expressions.

script_fields

{
    "table": "test",
    "query": {
        "match_all": {}
    }, "script_fields": {
        "add_all": {
            "script": {
                "inline": "( gid * 10 ) | crc32(title)"
            }
        },
        "title_len": {
            "script": {
                "inline": "crc32(title)"
            }
        }
    }
}

В этом примере создаются два выражения: add_all и title_len. Первое выражение вычисляет ( gid * 10 ) | crc32(title) и сохраняет результат в атрибут add_all. Второе выражение вычисляет crc32(title) и сохраняет результат в атрибут title_len.

В настоящее время поддерживаются только inline выражения. Значение свойства inline (выражение для вычисления) имеет такой же синтаксис, как и SQL-выражения.

Имя выражения может использоваться при фильтрации или сортировке.

‹›
  • script_fields
script_fields
📋
{
    "table":"movies_rt",
    "script_fields":{
        "cond1":{
            "script":{
                "inline":"actor_2_facebook_likes =296 OR movie_facebook_likes =37000"
            }
        },
        "cond2":{
            "script":{
                "inline":"IF (IN (content_rating,'TV-PG','PG'),2, IF(IN(content_rating,'TV-14','PG-13'),1,0))"
            }
        }
    },
    "limit":10,
    "sort":[
        {
            "cond2":"desc"
        },
        {
            "actor_1_name":"asc"
        },
        {
            "actor_2_name":"desc"
        }
    ],
    "profile":true,
    "query":{
        "bool":{
            "must":[
                {
                    "match":{
                        "*":"star"
                    }
                },
                {
                    "equals":{
                        "cond1":1
                    }
                }
            ],
            "must_not":[
                {
                    "equals":{
                        "content_rating":"R"
                    }
                }
            ]
        }
    }
}

По умолчанию значения выражений включаются в массив _source набора результатов. Если источник выборочный (см. Выбор источника), имя выражения можно добавить в параметр _source в запросе. Обратите внимание, что имена выражений должны быть в нижнем регистре.

expressions

expressions является альтернативой script_fields с более простым синтаксисом. В примере запроса добавляются два выражения, и результаты сохраняются в атрибуты add_all и title_len. Обратите внимание, что имена выражений должны быть в нижнем регистре.

‹›
  • expressions
expressions
📋
{
  "table": "test",
  "query": { "match_all": {} },
  "expressions":
  {
      "add_all": "( gid * 10 ) | crc32(title)",
      "title_len": "crc32(title)"
  }
}
Last modified: August 28, 2025