文档
指南
筛选
字符串筛选

Searchkit API 支持多种不同的 Instantsearch 筛选组件。以下示例显示了支持哪些组件以及如何将它们添加到您的搜索应用程序中。

下面我们将展示如何在 Elasticsearch 中设置一个字段作为筛选属性。然后,您就可以使用筛选属性和 Instantsearch 组件。

定义筛选属性

默认情况下,Elasticsearch 中的任何字符串类型字段都将定义为文本字段和关键字子字段。文本字段用于全文搜索,关键字字段用于聚合。

Elasticsearch 文档 (在新标签页中打开) 中阅读有关 Elasticsearch 动态字段映射的更多信息。

以下在 Elasticsearch 中索引的文档

{
  "brand": "Apple"
}

将生成以下映射

{
  "properties": {
    "brand": {
      "type": "text",
      "fields": {
        "keyword": {
          "type": "keyword"
        }
      }
    }
  }
}

关键字字段是应该用于筛选属性的字段。在这种情况下,筛选字段应该是 brand.keyword

然后,您就可以在 Searchkit 中定义筛选属性

简单筛选属性

{
  facet_attributes: [
    { 
      attribute: 'brand', 
      field: 'brand.keyword', 
      type: 'string' 
    },
  ]
}
 

前端使用

然后,您可以使用 Instantsearch 组件使用 brand 筛选属性。

pages/search.tsx
import { RefinementList } from "react-instantsearch";
 
<RefinementList attribute="brand" />;

有关如何使用,请参阅 筛选组件

基于数组的值

Elasticsearch 支持基于数组的值。这意味着您可以拥有一个值为数组的字段。

Elasticsearch 文档 (在新标签页中打开) 中阅读有关基于数组的值的更多信息。

为数组字段定义筛选属性

数组字段的一个示例是 tags 字段。以下在 Elasticsearch 中索引的文档

{
  "tags": ["apple", "fruit"]
}

将生成以下映射

{
  "properties": {
    "tags": {
      "type": "text",
      "fields": {
        "keyword": {
          "type": "keyword"
        }
      }
    }
  }
}

关键字字段是应该用于筛选属性的字段。在这种情况下,筛选字段应该是 tags.keyword

然后,您就可以在 Searchkit 中定义筛选属性

{
  facet_attributes: [
    { 
      attribute: 'tags', 
      field: 'tags.keyword', 
      type: 'string' 
    },
  ]
}
 

然后,您可以使用 Instantsearch 组件使用 tags 筛选属性。

嵌套字段支持

Elasticsearch 支持嵌套字段。这意味着您可以拥有一个具有嵌套字段的对象字段。

Elasticsearch 文档 (在新标签页中打开) 中阅读有关嵌套字段的更多信息。

市场示例

产品文档可能有一个或多个供应商。每个供应商可能对产品有不同的价格。以下文档显示了一个有两个供应商的产品

{
  "name": "AirPods",
  "marketplace": [
    {
      "supplier": "Apple",
      "price": 100,
      "market": "Worldwide"
    },
    {
      "supplier": "Dixons",
      "price": 95,
      "market": "GB"
    }
  ]
}

marketplace 字段的映射将是

{
  "properties": {
    "marketplace": {
      "type": "nested",
      "properties": {
        "supplier": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword"
            }
          }
        },
        "price": {
          "type": "integer"
        },
        "market": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword"
            }
          }
        }
      }
    }
  }
}

为嵌套字段定义筛选属性

要为嵌套字段定义筛选属性,您需要指定嵌套字段的路径。

{
  facet_attributes: [
    { 
      attribute: 'marketplace.supplier', 
      field: 'supplier.keyword', 
      type: 'string',
      nestedPath: 'marketplace'
    },
  ]
}
 

然后,您可以使用 Instantsearch 组件使用 marketplace.supplier 筛选属性。


Apache 2.0 2024 © Joseph McElroy.
需要帮助?加入 Discord