【Algolia】Algoliaでフィルターを使う

Algoliaはキーワードに対して近いレコードが検索対象となりますが、RDSのWhereのようにキーワードに一致したレコードのみ抽出したい場合があると思います。

例えば、Amazonとか楽天で「家電」のジャンルの商品を検索したり、「本」のジャンルの商品を検索したりといった感じです。

itemsインデックスに下記レコードが存在すると仮定して、「genre」でフィルターする例です。

{ objectID:1, id: 1, name: “進撃の巨人”, genre: “book” },
{ objectID:2, id: 2, name: “MacBook Air”, genre: “pc” },
{ objectID:3, id: 3, name: “ヴェイパーフライ”, genre: “sports” }

attributesForFaceting

Algoliaでフィルターしてレコードを抽出するにはattributesForFacetingを使用します。

attributesForFacetingを使うにはAlgoliaのダッシュボードから設定が必要です。

ダッシュボードからSearch をクリック > 「Index」のプルダウンからsearchableAttributesを設定したいインデックスを選択 > Configurationと進みます。

左サイドメニューで「Facets」を選択し、その状態で「Add an Attribute」をクリックしてフィルターしたい属性を入力もしくは選択(今回は「genre」)し、右下の「Review and Save Settings」をクリックして「Save Settings」をクリックします。

ソースコード

下記、React(Next.js)でAlgoliaでフィルターしたレコードを抽出する例です。

テキストボックスに文字列「book」「pc」「sports」のいずれかを入力して検索すると、genreでフィルターされて1件だけレコードが抽出されます。

Algoliaは通常だと近いキーワードのレコードが抽出されますが、「sport」と入力してもレコードが抽出されません。

import { useForm } from 'react-hook-form';

const User = () => {
  const {
    register,
    getValues,
    formState: { errors },
  } = useForm();

  const algoliasearch = require('algoliasearch');

  const client = algoliasearch('Application ID', 'YourWriteAPIKey');

  const index = client.initIndex('items');

  return (
    <>
      <form>
        <input
          type="text"
          {...register('genre', {})}
        />
        <input
          type="button"
          value="検索"
          onClick={async () => {
            index.search('', {
              facetFilters: [`genre:${getValues('genre')}`]
            }).then((results) => {
              console.log(results);
            });
          }}
        />
      </form>
    </>
  );

}

export default User;

フィルターについて詳しく知りたい方はAlgoliaのドキュメントをご覧ください。

attributesForFaceting

facetFilters

IT技術ブログ
↓↓「にほんブログ村」のランキングに参加しています。少しでも面白い、参考になったとか思われたらポチッとしていただけると嬉しいです!

にほんブログ村 IT技術ブログへ

にほんブログ村