Как запросить Algolia, используя строку поиска И массив элементов для проверки?

У меня есть некоторые функции поиска внутри моего приложения Ionic 2, для которых требуется возможность добавлять фильтры к поиску в дополнение к строке поиска. У меня работает часть строки поиска, но я не уверен, как передать массив значений для проверки на соответствие определенному массиву в моем индексе Algolia.

Вот моя функция:

searchForUsers(filters?) {
    let options = {
      attributesToHighlight: ['display_name', 'instruments'],
      highlightPreTag: '<span class="highlighted">',
      highlightPostTag: '</span>',
      attributesToRetrieve: [
        "_geoloc",
        "display_name",
        "genres",
        "instruments",
        "objectID",
        "playing_level",
        "profile_photo",
      ],
    };

    // If there are any filters enabled?
    if(filters) {
      options['aroundLatLng'] = `${this.geoloc.lat},${this.geoloc.lng}`;
      options['aroundRadius'] = this._utilities.milesToMeters(this.distance);
    }

    this.usersIndex.search(this.searchTerm, options)
      .then((data) => {
        this.results = data.hits;
      })
      .catch((error) => {
        console.log(error);
      });
  }

Если бы я хотел добавить следующие фильтры к моему поиску, как бы я это сделал?

["Blues", "Rock", "Alternative"] // ‹-- Они будут проверять против genres в Алголии. ["Guitar", "Drums", "Piano"] // ‹-- Они будут проверять против instruments в Алголии.

^ Эти два массива будут дополнительными фильтрами, которые будут ограничивать возвращаемые результаты, как вы видите в тысячах различных компонентов поиска. Хотя я не совсем могу в этом разобраться. Есть идеи?

Заранее спасибо!


person Stevie Star    schedule 01.03.2017    source источник


Ответы (1)


Насколько я знаю, есть два способа сделать это.

Расширенный поиск

Вы также можете зайти в панель администратора Algolia и включить Advanced Syntax, а также установить Remove words if no results на allOptional под панелью Query Expansion на странице настроек ranking, что позволит вам выполнить поисковый запрос, как показано ниже.

"Blues" "Rock" "Alternative" "Guitar" "Drums" "Piano"

Этот подход хорош для широкого сопоставления всего, что соответствует параметрам поиска в кавычках, но может не соответствовать вашим потребностям. Лично я почти всегда нуждаюсь в более тонком зернистом контроле.

Грани

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

genres: "Blues" OR genres: "Rock" OR genres: "Alternative"

instruments: "Guitar" OR instruments: "Drums" OR instruments: "Piano"

Такой подход позволяет правильно детализировать результаты и комбинировать свойства поиска.

В вашем случае вот пример.

let options = {
  filters: 'genres: "Blues" OR genres: "Rock" OR genres: "Alternative" AND Guitar" OR instruments: "Drums" OR instruments: "Piano"',
  attributesToHighlight: ['display_name', 'instruments'],
  highlightPreTag: '<span class="highlighted">',
  highlightPostTag: '</span>',
  attributesToRetrieve: [
    "_geoloc",
    "display_name",
    "genres",
    "instruments",
    "objectID",
    "playing_level",
    "profile_photo",
  ],
};
person Simon Mo    schedule 10.03.2017
comment
Это было идеально и именно то, что мне было нужно. Спасибо - person Stevie Star; 15.03.2017
comment
Без проблем. Рад, что это то, что вам нужно. Удачного кодирования! :) - person Simon Mo; 15.03.2017