Фасетирование сложных типов поиска Azure по отфильтрованным вложенным свойствам основано на найденных объектах

#azure #azure-cognitive-search

#azure #azure-когнитивный поиск

Вопрос:

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

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

apartmentTypes.bedroomCount и apartmentTypes.bathroomCount огранены и отфильтрованы. Результат фасета для dataset вернет

 {
  "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)amp;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. Фасетирование и фильтрация работают в области документа, а не в области элементов сложной коллекции (хотя вы можете написать коррелированные фильтры для сложной коллекции, как в вашем первом примере). Это сделано специально. Можете ли вы объяснить немного подробнее, почему второй фильтр не будет работать для вашего сценария?

2. Я добавил результаты фасета для каждого шага для более подробного объяснения

3. На самом деле это не объясняет, почему вам «нужна именно такая функциональность». Может помочь, если вы опишете это в терминах интерфейса конечного пользователя, который вы пытаетесь создать. На данный момент я не понимаю, почему вы просто не создали правильный некоррелированный фильтр.

4. У меня есть список жилых комплексов с типами квартир. И я хочу отфильтровать этот список по свойствам типа квартиры — количеству спален, ванных комнат и так далее. Поэтому, когда пользователь ищет комплексы с апартаментами с 2 спальнями и 1 ванной комнатой — я не могу показать ему комплексы, которые содержат апартаменты с 2 спальнями или 1 ванной комнатой.

5. Спасибо. Я переименовал поля в ваших примерах, чтобы привязать их к актуальной проблемной области. Это упрощает рассуждения. Теперь я понимаю, почему вы хотите выполнить фильтр, который помещает условие «и» внутри «любого» — это имеет смысл. Но, согласно вашему вопросу, если вы выполняете фильтрацию по жилым комплексам, которые содержат 1 спальню и 3 ванные комнаты, вы должны не получить результатов, поскольку такого типа апартаментов не существует. Проблема в том, как представлены фасеты?

Ответ №1:

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

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

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

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