Back to Manticoresearch

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

manual/russian/Searching/Expressions.md

25.9.012.3 KB
Original Source

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

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

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

sql
+, -, *, /, %, 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() будет просто игнорироваться.

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

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

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

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

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

sql
AND, OR, NOT

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

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

sql
&, |

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

Функции:

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

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

script_fields

<!-- example script_fields -->
json
{
	"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 -->
script_fields:
<!-- request script_fields -->
json
{
	"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"
					}
				}
			]
		}
	}
}
<!-- end -->

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

expressions

<!-- example expressions -->

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

<!-- request expressions -->
json
{
  "table": "test",
  "query": { "match_all": {} },
  "expressions":
  {
	  "add_all": "( gid * 10 ) | crc32(title)",
      "title_len": "crc32(title)"
  }
}
<!-- end --> <!-- proofread -->