React InstantSearch:RefinementList 过滤器覆盖配置过滤器

React InstantSearch: RefinementList filters overrides Configure filters

问题

如何以与 RefinementList 应用的过滤器兼容的方式应用自定义搜索过滤器?

背景

我正在尝试设计用户可以通过两种方式进行搜索的搜索功能:

  1. 搜索给定字符串以出现在任何搜索文档中的“正常”方式
  2. 给定集合 if ID 的特定查找。用户希望搜索结果是包含任何给定 ID 的所有搜索文档。不多也不少。

当我检测到搜索输入仅包含有效格式的 ID 时,我从搜索选项一切换到选项二

当前实施

我发现让我的搜索引擎 (typesense) 获得搜索选项二的 return 结果的最简单方法是仅使用带星号搜索的 filter_by 选项,如下所示:

{
    "query_by":"product_number,ean_number",
    "collection":"products",
    "q":"*",
    "filter_by": "product_number:=[123, 456]"
}

return 任何带有 product_number 123 或 456 的搜索文档。

因此,在我的自定义 SearchBox 组件中,当我检测到搜索应遵循选项二时,我调用 refine('*') 并在 Configure 组件中设置过滤器。

<InstantSearch>
  <Configure facetFilters={ buildFilterBy(...) } />
  <CustomRefinementList {...} />
</InstantSearch>

这很好用,但只要用户在 CustomRefinementList 中选择其他优化,Configure 过滤器就会被覆盖,搜索现在 returns all 个匹配优化的文档(由于星号搜索)。

四处阅读,似乎我不应该使用 Configure 组件来应用超出初始 search/render 的过滤器。我认为应该有一种方法可以通过 refine 函数应用过滤器,尽管关于 refine 函数可以接受的搜索字符串之外的哪些参数的文档似乎有点缺乏。

Configure 小部件中,如果您使用 filters(而不是 facetFiltersnumericFilters),这些过滤器将与 facetFilters RefinementList 小部件添加。这将有效地使您能够使用 Configure.

设置冻结/永久过滤器

您想确保您使用的是 typesense-instantsearch-adapter 的 v2.4.1。

此处有更多上下文:https://github.com/typesense/typesense-instantsearch-adapter/issues/110#issuecomment-1112633962