Поиск в Azure Сложные типы с использованием фильтрованных вложенных свойств основаны на найденных объектах. - PullRequest
0 голосов
/ 20 марта 2019

Я использую API предварительного просмотра сложных типов Azure Search (2017-11-11-Preview) для фильтрации / огранки сложных типов. Все мои фильтры и фасеты создаются на свойствах вложенного типа (не корневого типа) и выглядят так, как будто они не объединяются на правильном уровне вложенности, а только через корень документа. Например, у меня есть следующий документ в поисковом индексе

{ 
  apartmentComplexId: "1",
  apartmentTypes: [
    { 
      bedroomCount: 1,
      bathroomCount: 2
    },
    { 
      bedroomCount: 2,
      bathroomCount: 3
    }
  ]
}

apartmentTypes.bedroomCount и apartmentTypes.bathroomCount огранены и отфильтрованы. Фасетный результат для набора данных вернет

{
  "apartmentTypes/bedroomCount": [
    {
      "count": 1,
      "value": 1
    },
    {
      "count": 1,
      "value": 2
    }
  ],
  "apartmentTypes/bathroomCount": [
    {
      "count": 1,
      "value": 2
    },
    {
      "count": 1,
      "value": 3
    }
  ]
}

Когда я выполняю следующий запрос:

$filter=apartmentTypes/any(x: x/bedroomCount eq 1)&facet=apartmentTypes/bathroomCount

моя коллекция фасетов в ответ содержит все два возможных значения фасетов для bathroomCount - 2 и 3 со значением 1 для каждого из них.

{
  "apartmentTypes/bathroomCount": [
    {
      "count": 1,
      "value": 2
    },
    {
      "count": 1,
      "value": 3
    }
  ]
}

Следующим шагом я пытаюсь использовать данные фасетов в моем более конкретном фильтре

$filter=apartmentTypes/any(x: x/bedroomCount eq 1 and x/bathroomCount eq 3)

Упс, у меня есть пустой набор результатов.

Я понимаю, что более правильная строка фильтра должна выглядеть примерно так:

$filter=apartmentTypes/any(x: x/bedroomCount) and values/any(x: x/bathroomcount eq 3)

но мне нужна именно такая функциональность - найденный объект должен содержать элемент в своей коллекции со всеми побочными результатами.

1 Ответ

0 голосов
/ 04 апреля 2019

Фасетирование и фильтрация работают в области документа, а не в области элементов в сложной коллекции (хотя вы можете написать коррелированные фильтры для сложной коллекции, как в первом примере).Это сделано специально.

В вашем сценарии это приводит к несоответствию ожиданий пользователя и поведения системы.Как пользователь, если я нажимаю на фасеты, описывающие квартиры, я, естественно, буду предполагать, что фильтрация происходит и в квартирах, но на самом деле это происходит в квартирах в комплексах .Вот почему пустой набор результатов в вашем примере настолько не интуитивен.

Я бы порекомендовал моделировать ваши индексы в соответствии с тем, как пользователи будут перемещаться.Предполагая, что пользователи обычно ищут квартиры, а не жилые комплексы, попробуйте сделать apartmentType тип документа и денормализовать информацию о жилом комплексе, если необходимо.

В то же время, пожалуйста, рассмотрите возможность создания элемента на User Voice , чтобы помочь нам установить приоритеты при добавлении поддержки коррелированных фасетов над сложными коллекциями.

...