Поиск Azure не поддерживает тип фильтра «все», который вы ищете.Использование search.in с 'all' будет эквивалентно использованию OR, но поиск Azure может обрабатывать только AND в теле лямбды 'all' (что эквивалентно OR в теле лямбды 'any').
Вы можете попробовать обходной путь, подобный следующему:
$filter=tags/any(t: t eq 'Facebook') and tags/any(t: t eq 'Twitter')
Однако на самом деле это не эквивалентно использованию all
с search.in
.Запрос, выраженный с помощью all
, соответствует документам, где каждая социальная учетная запись строго Facebook или Twitter.Если присутствует какой-либо другой социальный аккаунт, документ не будет соответствовать.Обходной путь не имеет этого свойства.Документ должен иметь не менее Facebook и Twitter, чтобы соответствовать, но не исключительно.Это, безусловно, действительный сценарий;это просто не то же самое, что использование all
с search.in
, что было первоначальным вопросом.
Независимо от того, как вы пытаетесь переписать запрос, вы не сможете выразить эквивалентall
запрос.Это ограничение связано с тем, что служба поиска Azure хранит коллекции строк и других примитивных типов в инвертированном индексе.
Пожалуйста, проголосуйте за голос пользователя, чтобы помочь расставить приоритеты: https://feedback.azure.com/forums/263029-azure-search/suggestions/37166749-efficient-way-to-express-a-true-all
Возможный обходной путьиспользовать новую функцию сложных типов, которая позволяет использовать более выразительные фильтры внутри лямбда-выражений.Например, если вы моделируете теги как объекты с одним свойством value
, а не как набор строк, вы сможете выполнить фильтр следующим образом:
$filter=tags/all(t: search.in(t/value, 'Facebook,Twitter'))
В API REST выtags
определим следующим образом:
{
"name": "myindex",
"fields": [
...
{
"name": "tags",
"type": "Collection(Edm.ComplexType)",
"fields": [
{ "name": "value", "type": "Edm.String", "filterable": true }
]
}
]
}
Обратите внимание, что эта функция находится в предварительном просмотре на момент написания этой статьи, но скоро будет общедоступной (и публично задокументированной).