使用 instantsearch.js 时设置初始 facet/refinement 值

setting initial facet/refinement values when using instantsearch.js

我正在使用 instantsearch.js 和小部件组合来显示我的搜索结果(几乎完全按照 demos 建模)。

我需要为构面设置一些初始值,以便默认过滤某些项目。我该怎么做呢?我知道 AlgoliaSearchHelper(助手)对象有一个方法 toggleRefinement 应该允许我这样做但是我似乎无法在调用执行初始查询的 search.start() 之前访问这个助手。

任何关于如何设置一些默认优化的建议或见解将不胜感激。谢谢

更新: 这不是重复项 - 我的问题似乎与 instantsearch.widget.toggle 有关。看起来这个小部件在初始搜索之前在幕后设置了默认值。我已经调整我的代码以不使用此小部件,而是只设置 searchParameters.tagFilters 属性。这是切换小部件对我造成的影响,因为我不知道如何覆盖它的默认过滤。

我的问题似乎与 instantsearch.widget.toggle 有关。看起来这个小部件在初始搜索之前在幕后设置了默认值。我已经调整我的代码以不使用此小部件,而是只设置 searchParameters.tagFilters 属性。这是切换小部件对我造成的影响,因为我不知道如何覆盖它的默认过滤。

你确实是对的,在切换小部件的幕后uses the off value if provided:

if (userValues.off === undefined) {
  return;
}
// Add filtering on the 'off' value if set
let isRefined = state.isFacetRefined(attributeName, userValues.on);
if (!isRefined) {
  helper.addFacetRefinement(attributeName, userValues.off);
}

为了避免其他用户的这种不理解,instantsearch.js 上现在有一个 PR 更新如下:

Note that if you provide an "off" option, it will be refined at initialization.

向 instantsearch.js 实例添加初始过滤器的最简单方法是使用额外的自定义小部件:

  var search = instantsearch({
    appId: 'YourApplicationID',
    apiKey: 'YourSearchOnlyAPIKey',
    indexName: 'YourIndexName'
  });

  search.addWidget(
    instantsearch.widgets.searchBox({
      container: '#search-box',
      placeholder: 'Search for FIXME...'
    })
  );

  search.addWidget(
    instantsearch.widgets.hits({
      container: '#hits-container',
      templates: {
        item: 'Hit {{objectID}}: FIXME'
      }
    })
  );

  // setup initial filters
  search.addWidget({
    init: function(options) {
       // use options.helper (https://github.com/algolia/algoliasearch-helper-js) to initialize the search with custom filters & parameters
       options.helper.addFacetRefinement('MyFacet', 'my value');
    }
  });

  search.start();