使用分面搜索
在 Meilisearch 中,分面是一种特殊的过滤器。本指南将向您展示如何配置分面并在搜索图书数据库时使用它们。它还会指导您如何获得
要求
- 一个 Meilisearch 项目
- 一个命令行终端
配置分面索引设置
首先,使用此图书数据集创建一个新索引。此数据集中的文档具有以下字段
{
"id": 5,
"title": "Hard Times",
"genres": ["Classics","Fiction", "Victorian", "Literature"],
"publisher": "Penguin Classics",
"language": "English",
"author": "Charles Dickens",
"description":"Hard Times is a novel of social […] ",
"format": "Hardcover",
"rating": 3
}
接下来,将 genres
、language
和 rating
添加到 filterableAttributes
列表中
curl \
-X PUT 'https://127.0.0.1:7700/indexes/books/settings/filterable-attributes' \
-H 'Content-Type: application/json' \
--data-binary '[
"genres", "rating", "language"
]'
您现在已配置索引以使用这些属性作为过滤器。
在搜索查询中使用分面
设置 facets
搜索参数进行搜索查询
curl \
-X POST 'https://127.0.0.1:7700/indexes/books/search' \
-H 'Content-Type: application/json' \
--data-binary '{
"q": "classic",
"facets": [
"genres", "rating", "language"
]
}'
响应返回所有与查询匹配的书籍。它还会返回两个可用于创建分面搜索界面的字段:facetDistribution
和 facetStats
{
"hits":[
…
],
…
"facetDistribution":{
"genres":{
"Classics":6,
…
},
"language":{
"English":6,
"French":1,
"Spanish":1
},
"rating":{
"2.5":1,
…
}
},
"facetStats":{
"rating":{
"min":2.5,
"max":4.7
}
}
}
facetDistribution
列出搜索结果中存在的所有分面,以及每个分面返回的文档数量。
facetStats
包含所有包含数值的分面的最高值和最低值。
排序分面值
默认情况下,所有分面值都按字母数字升序排序。您可以使用faceting
索引设置的 sortFacetValuesBy
属性来更改此设置
curl \
-X PATCH 'https://127.0.0.1:7700/indexes/books/settings/faceting' \
-H 'Content-Type: application/json' \
--data-binary '{
"sortFacetValuesBy": {
"genres": "count"
}
}'
上面的代码示例按降序值计数对 genres
分面进行排序。
使用新设置重复之前的查询将导致 facetsDistribution
中出现不同的顺序
{
…
"facetDistribution": {
"genres": {
"Fiction": 8,
"Literature": 7,
"Classics": 6,
"Novel": 2,
"Horror": 2,
"Fantasy": 2,
"Victorian": 2,
"Vampires": 1,
"Tragedy": 1,
"Satire": 1,
"Romance": 1,
"Historical Fiction": 1,
"Coming-of-Age": 1,
"Comedy": 1
},
…
}
}
搜索分面值
您还可以使用分面搜索端点来搜索分面值。
curl \
-X POST 'https://127.0.0.1:7700/indexes/books/facet-search' \
-H 'Content-Type: application/json' \
--data-binary '{
"facetQuery": "c",
"facetName": "genres"
}'
以下代码示例在 genres
分面中搜索以 c
开头的值
响应包含一个 facetHits
数组,其中列出了所有匹配的分面,以及包含该分面的文档总数
{
…
"facetHits": [
{
"value": "Children's Literature",
"count": 1
},
{
"value": "Classics",
"count": 6
},
{
"value": "Comedy",
"count": 2
},
{
"value": "Coming-of-Age",
"count": 1
}
],
"facetQuery": "c",
…
}
您可以使用 q
、filter
和 matchingStrategy
参数进一步优化结果。在 API 参考中了解更多关于它们的信息。