manual/russian/Searching/Expressions.md
Manticore позволяет использовать произвольные арифметические выражения как через SQL, так и через HTTP, включая значения атрибутов, внутренние атрибуты (ID документа и вес релевантности), арифметические операции, несколько встроенных функций и пользовательских функций. Ниже приведен полный справочник для быстрого доступа.
+, -, *, /, %, DIV, MOD
Доступны стандартные арифметические операторы. Арифметические вычисления с использованием этих операторов могут выполняться в трех различных режимах:
Парсер выражений автоматически переключается в режим целых чисел, если ни одна операция не приводит к значению с плавающей запятой. В противном случае используется режим с плавающей запятой по умолчанию. Например, 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, в случае многозначных атрибутов, возвращают истинну, если хотя бы одно из значений удовлетворяет условию (аналогично ANY()). Оператор IN не поддерживает JSON-атрибуты. Оператор IS (NOT) NULL поддерживается только для JSON-атрибутов.
AND, OR, NOT
Логические операторы (AND, OR, NOT) ведут себя ожидаемо. Они ассоциативны слева и имеют самый низкий приоритет по сравнению с другими операторами. NOT имеет более высокий приоритет, чем AND и OR, но все же ниже, чем любой другой оператор. AND и OR имеют одинаковый приоритет, поэтому рекомендуется использовать скобки, чтобы избежать путаницы в сложных выражениях.
&, |
Эти операторы выполняют побитовое AND и OR соответственно. Операнды должны быть целочисленных типов.
В HTTP JSON интерфейсе выражения поддерживаются через script_fields и expressions.
{
"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 выражения.
Имя выражения может быть использовано для фильтрации или сортировки.
<!-- intro -->{
"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 — это альтернатива script_fields с более простым синтаксисом. Пример запроса добавляет два выражения и сохраняет результаты в атрибуты add_all и title_len. Обратите внимание, имена выражений должны быть в нижнем регистре.
{
"table": "test",
"query": { "match_all": {} },
"expressions":
{
"add_all": "( gid * 10 ) | crc32(title)",
"title_len": "crc32(title)"
}
}