ファセット検索
GPT-4.icon
🔍 ファセット検索とは?
大量のデータ(商品や記事など)をカテゴリや属性ごとに絞り込んで検索できる方式です。
たとえば服を探すときに「ブランド」「サイズ」「色」「価格帯」などの項目で絞り込みできるやつ
💡 具体例
Amazonや楽天などのECサイトで…
カテゴリ:Tシャツ
ブランド:ユニクロ、GU
色:白、黒
価格:1000〜3000円
…のように複数の軸でフィルターをかけられるのが ファセット(facet)検索です。
Faceting(ファセット)は、
「ユーザーが検索結果をさらに絞り込めるようにするためのカテゴリ分け機能」
のことです。
たとえば:
本の検索なら「著者」や「ジャンル」で絞る
ファッションサイトなら「ブランド」や「サイズ」で絞る
こうやって「検索の絞り込み用UI」を作るための基盤になるのがFacetingです!
フィルター(Filters)との違い
table:table
項目 説明
:---- :----
Filter 裏側で静かに検索結果を絞り込む(ユーザーが見えない場合もある)
Facet ユーザーに「選べるカテゴリ」として見せる。絞り込み用UIを作る
つまり
Filter → 検索の裏側
Facet → 検索の表側(UIで見える)
というイメージ!
---
Facetingを使うと、
どんなカテゴリがあるかリストアップできる
各カテゴリに該当する件数(facet count)を表示できる
これにより、たとえば
「著者:村上春樹(5件)」「著者:東野圭吾(12件)」
みたいなUIが作れる!
さらに、特定のファセット値を検索することもできる(後述)。
---
Facetingの設定方法
Facetingを使うには、以下が必要です。
1. 対象の属性を attributesForFaceting に登録する
(例:authorやgenre)
2. クエリで facets パラメータを指定する
(例:facets: ['author', 'genre'])
これで、検索レスポンスの中に
それぞれのファセットごとの値
その値に該当するヒット件数
が一緒に返ってきます!
code:php
$response = $client->searchSingleIndex(
'ALGOLIA_INDEX_NAME',
);
もし全部のfacetsを一気に取得したい場合はワイルドカード('*')も使えます。
Facetingの詳細機能
1. AND/ORで組み合わせられる(Conjunctive/Disjunctive)
AND(Conjunctive):すべてに一致 → 例:ブランドが「Nike」でサイズが「M」
OR(Disjunctive):いずれかに一致 → 例:色が「赤」または「青」
これはInstantSearch(UIライブラリ)でいい感じに処理される。
---
2. 階層型ファセット(Hierarchical Faceting)
カテゴリに階層(ツリー構造)を持たせることもできる!
例:
Books
Science Fiction
Time Travel
データとしてはこう持ちます:
code:json
{
"categories": {
"lvl0": "Books",
"lvl1": "Books > Science Fiction",
"lvl2": "Books > Science Fiction > Time Travel"
}
}
こうすると「カテゴリツリーをたどって絞り込む」ようなUIが作れる。
---
3. Contextual Facet Counts(コンテキストに応じた件数表示)
絞り込みをかけた状態でも、ファセットの件数がちゃんと更新される。
(例:「ジャンル:SF」を選んだ後、「著者別の件数」もSFジャンル内で再計算される)
---
4. 大規模インデックス時の近似値
インデックスが巨大な場合、パフォーマンスのためにfacet countは近似値になることがある。
→ 結果のJSONの exhaustiveFacetsCount を見れば、正確か近似かがわかる。
---
5. 1ファセットで取得できる件数制限
デフォルトでは1ファセットあたり最大100個の値まで取得できる。
必要なら maxValuesPerFacet を使って最大1000個まで広げられる。
code:php
$response = $client->setSettings(
'ALGOLIA_INDEX_NAME',
);
---
6. objectIDではFacetingできない
objectID(レコード固有ID)はfacetできない。
objectIDはフィルター専用
ファセット件数を数える対象にはならない
---
7. Facetの属性名は大文字小文字を区別する
attributesForFaceting に指定するときは、レコードの属性名と完全一致させないといけない。
ただし、値に対するfacetフィルターでは大文字小文字無視できる(例:color:blueとcolor:Blueは同じ扱い)。
---
ファセット値内検索(Search for Facet Values)
ファセット対象の値がたくさんある場合(例:ブランド数1000件とか)、
最初は一部だけを表示して
「検索窓から絞り込み」できるようにする機能もあります!
このとき使うAPIがsearchForFacetValuesです。
code:php
$response = $client->searchForFacetValues(
'ALGOLIA_INDEX_NAME',
'author',
);
ユーザーが"stephen"と打ったら、"Stephen King"とかがヒットする。