Использование search.in со всеми - PullRequest
1 голос
/ 21 марта 2019

Заявление Follwing находит все профили, в которых есть Facebook или Twitter, и это работает:

$filter=SocialAccounts/any(x: search.in(x, 'Facebook,Twitter'))

Но я не могу найти никаких примеров для поиска всего, что имеет как Facebook, так и Twitter.Я пытался:

$filter=SocialAccounts/all(x: search.in(x, 'Facebook,Twitter'))

Но это неверный запрос.

1 Ответ

1 голос
/ 21 марта 2019

Поиск 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 }
      ]
    }
  ]
}

Обратите внимание, что эта функция находится в предварительном просмотре на момент написания этой статьи, но скоро будет общедоступной (и публично задокументированной).

...