如何使用搜索字符串和要检查的项目数组查询 Algolia?

How to query Algolia utilizing search string AND array of items to check against?

我的 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"] // <-- 这些将检查 Algolia 中的 genres["Guitar", "Drums", "Piano"] // <-- 这些将检查 Algolia 中的 instruments

^ 这两个数组将是额外的过滤器,可以限制返回的结果,就像您在数千种不同的搜索组件中看到的那样。虽然我不太明白这一点。有什么想法吗?

提前谢谢你!

据我所知,有两种方法可以做到这一点。

高级搜索

您可以进入您的 Algolia 管理面板并打开 Advanced Syntax 并在 [=15] 的 Query Expansion 面板下将 Remove words if no results 设置为 allOptional =] 设置页面,它允许您进行如下搜索查询。

"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",
  ],
};