It is the monorepo repository:
The idea is to create an InstantSearch adapter for pagefind and build the same demo site as I did for facets. This way we can compare "apples to apples".
To do so I wanted to use the same Schema as in facets:
I started implementation with hardcoded conversion. I managed to create a working demo. However, I realized that pagefind can't be used as a general faceted search engine.
pagefind supports only string values, so all values need to be converted to strings before indexing and back to the initial type on the client side.
Indexing:
brand: [item.brand],
categories: item.categories,
price: [`${item.price}`],
rating: [`${item.rating}`],
free_shipping: [`${item.free_shipping}`],
Client-side:
{
objectID: item.id,
...data.meta,
categories: data.filters.categories,
price: parseFloat(data.filters.price[0]),
rating: parseFloat(data.filters.rating[0]),
}
See:
Because there is no support for numbers to get stats we need to convert strings to numbers on the client side and calculate stats:
if (schema[field]?.type === "number") {
const values: number[] = [];
entries.forEach((a) => values.push(parseFloat(a[0])));
facetsStats[field] = {
min: Math.min(...values),
max: Math.max(...values),
};
}
I didn't implement a filter for numeric fields, like price >= 40 AND price <= 100
. The price slider doesn't work in the deme
After I realized that it was not practical to use a general faceted search engine I gave up and didn't finish code for schema transformation.
This code is not recomended for prodcution use.
pnpm i
pnpm run dev
- CLI to covert JSON to pagefind index
- maybe cosmiconfig to pass configuration
- it can use the same schema as
facets
- input
- output
- it can use the same schema as
- maybe cosmiconfig to pass configuration
- adapter for instantsearch
- filtering for numeric facets