过滤器
有多种方法可以将过滤器应用于搜索结果。过滤器可以应用于
在客户端应用过滤器
可以通过在 Instantsearch 的 configure
组件上使用 filters
属性在客户端应用过滤器。
设置
要在客户端应用过滤器,您必须首先在应用程序设置中的 facet_attributes
和 filter_attributes
配置中设置过滤器。
以下是一个具有 facet_attributes
和 filter_attributes
设置的配置示例。
{
facet_attributes: [
{ attribute: 'author', field: 'author.keyword', type: 'string' },
{ attribute: 'price', field: 'price', type: 'numeric' },
],
filter_attributes: [
{ attribute: 'publisher', field: 'publisher.keyword', type: 'string' },
{ attribute: 'genre', field: 'genre.keyword', type: 'string' },
{ attribute: 'date', field: 'date.field', type: 'date' },
{ attribute: 'nestedField', field: 'price', type: 'string', nestedPath: 'nested' }
],
result_attributes: [],
search_attributes: []
}
import { Configure } from 'react-instantsearch';
<Configure
filters="price:[90 TO *]"
/>
可以通过在 Instantsearch 的 configure
组件上使用 filters
属性在客户端应用过滤器。
使用 attribute
属性指定要过滤的字段。
嵌套字段在 filters
属性中不受支持。要过滤嵌套字段,请使用 facetFilters
或 numericFilters
属性。
过滤器语法
数字和分面过滤器
数字和分面过滤器通常由小部件使用。
您还可以通过在 Instantsearch 的 configure
组件上使用 numericFilters
或 facetFilters
属性将数字过滤器或分面过滤器添加到搜索中。
import { Configure } from 'react-instantsearch';
<Configure
facetFilters={["author:John"]}
numericFilters={["price>10", "price<20"]}
/>
在服务器上应用过滤器
可以通过在 handleRequest
函数中使用 getBaseFilters
函数在服务器上应用过滤器。
示例可能包括
- 过滤掉未发布的文档
- 过滤掉用户无权访问的文档
以下是如何过滤掉未发布的文档的示例。
属性不能在 getBaseFilters
函数中使用。您必须改为使用 field
属性。这是因为 field
属性是 Elasticsearch 中的实际字段名称。
该函数必须返回一个过滤器数组。每个过滤器都是一个对象,遵循Elasticsearch 查询 DSL(在新标签页中打开)。
以下是用status
字段过滤未发布文档的示例。
const results = await apiClient.handleRequest(req.body, {
getBaseFilters: () => {
return [
{
bool: {
must: {
term: {
status: "published",
},
},
},
},
];
},
});