Todd Tarsi
05/20/2025, 5:04 PMskill_*
. This is meant to track various skills that we add dynamically. However, we just launched a new skill id 123, which just started showing up in documents during a demo, and we basically saw search go down mid-demo because it looks like the schema is updating with the new field immediately.
Is this a correct interpretation of how auto-faceting works? If so, that’s a big problem for our schema design.Todd Tarsi
05/20/2025, 5:24 PMTodd Tarsi
05/20/2025, 5:36 PMJason Bosco
05/20/2025, 5:42 PMTodd Tarsi
05/20/2025, 5:44 PMskill_*, skill_coach_123(ALL:[1,])
for the facet_by field, and because it doesn’t exist yet (no one has coached on this skill), facet_by
was coming back as {}
Jason Bosco
05/20/2025, 10:10 PMTodd Tarsi
05/21/2025, 6:08 PM{
{
name: 'field.*',
type: 'int32',
facet: true,
}
}
And this is my only document:
{
field1: 123
}
And I make this kinda request:
{
query: '*',
query_by: 'field1',
facet_by: 'field1,field2'
}
I get this back for my facets:
{
facets: {}
}
I really think instead of refusing all facets on the response if one isn’t valid currently, it should make a best effort to return all good facets. It can lead to things being very brittle for someone who struggles with basic things like myself 😅Jason Bosco
05/21/2025, 9:59 PMvalidate_field_names
parameter in v28.0 by any chance? Wonder if there's a bugJason Bosco
05/21/2025, 9:59 PMTodd Tarsi
05/22/2025, 2:20 AMTodd Tarsi
05/27/2025, 7:10 PMJason Bosco
05/27/2025, 10:07 PMTodd Tarsi
05/28/2025, 12:36 AMAlan Martini
05/29/2025, 9:55 PMAlan Martini
05/30/2025, 3:36 PM#!/bin/bash
### Run Typesense via Docker ########################################
export TYPESENSE_API_KEY=xyz
export TYPESENSE_HOST=<http://localhost:8108>
docker stop typesense-repro 2>/dev/null
docker rm typesense-repro 2>/dev/null
rm -rf "$(pwd)"/typesense-data-dir-repro
mkdir "$(pwd)"/typesense-data-dir-repro
# Wait for Typesense to be ready
docker run -d -p 8108:8108 --name typesense-repro \
-v"$(pwd)"/typesense-data-dir-repro:/data \
typesense/typesense:28.0 \
--data-dir /data \
--api-key=$TYPESENSE_API_KEY \
--enable-cors
# Wait till typesense is ready
until curl -s -o /dev/null -w "%{http_code}" "$TYPESENSE_HOST/health" -H "X-TYPESENSE-API-KEY: ${TYPESENSE_API_KEY}" | grep -q "200"; do
sleep 2
done
# Create collection with wildcard fields
curl "<http://localhost:8108/collections>" \
-X POST \
-H "Content-Type: application/json" \
-H "X-TYPESENSE-API-KEY: ${TYPESENSE_API_KEY}" \
-d '{
"name": "wildcard_fields_test",
"fields": [
{"name": "field.*", "type": "string", "facet": true }
]
}'
# Import a single document with only field1
curl "<http://localhost:8108/collections/wildcard_fields_test/documents/import?action=create>" \
-H "X-TYPESENSE-API-KEY: ${TYPESENSE_API_KEY}" \
-H "Content-Type: text/plain" \
-X POST \
-d '{"field1": 123}'
# Import a single document with only field1
curl "<http://localhost:8108/collections/wildcard_fields_test/documents/import?action=create>" \
-H "X-TYPESENSE-API-KEY: ${TYPESENSE_API_KEY}" \
-H "Content-Type: text/plain" \
-X POST \
-d '{"field2": 123}'
# Test faceting with both existing and non-existing fields
echo "\n"
echo "Testing faceting with wildcard fields:"
curl "<http://localhost:8108/multi_search>" \
-X POST \
-H "Content-Type: application/json" \
-H "X-TYPESENSE-API-KEY: ${TYPESENSE_API_KEY}" \
-d '{
"searches": [
{
"collection": "wildcard_fields_test",
"q": "*",
"query_by": "field1",
"facet_by": "field1,field2"
}
]
}' | jq .
docker stop typesense-repro
docker rm typesense-repro
Todd Tarsi
05/30/2025, 3:41 PMAlan Martini
05/30/2025, 4:25 PMTodd Tarsi
06/12/2025, 7:34 PM// skill fields - wildcarded
const fields = [{
name: 'skill_class_.*',
type: 'string',
facet: true,
optional: true,
}]
I just added a skill for id 19 and id 30 to my secondary database, and now my search is returning a completely empty result set.
const search = '((skill_class_1:=[`APPLE`,`BANANA`,`NA`]) || (skill_class_2:=[`CRITIQUE`,`COMPLIMENT`,`NA`]) || (skill_class_3:=[`CRITIQUE`,`COMPLIMENT`,`NA`]) || (skill_class_6:=[`CRITIQUE`,`COMPLIMENT`,`NA`]) || (skill_class_7:=[`CRITIQUE`,`COMPLIMENT`,`NA`]) || (skill_class_8:=[`CRITIQUE`,`COMPLIMENT`,`NA`]) || (skill_class_9:=[`CRITIQUE`,`COMPLIMENT`,`NA`]) || (skill_class_10:=[`CRITIQUE`,`COMPLIMENT`,`NA`]) || (skill_class_15:=[`COMPLIMENT`,`CRITIQUE`,`COACHING_OPPORTUNITY`,`NA`]) || (skill_class_17:=[`NO_RED_FLAG`,`POTENTIAL_RED_FLAG`,`CRITIQUE`,`NA`]) || (skill_class_18:=[`CRITIQUE`,`COMPLIMENT`,`NA`]) || (skill_class_19:=[`COACHING_OPPORTUNITY`,`APPLE`,`BANANA`,`NA`]) || (skill_class_30:=[`COACHING_OPPORTUNITY`,`APPLE`,`BANANA`,`NA`]))';
This returns results as expected:
const search = '((skill_class_1:=[`APPLE`,`BANANA`,`NA`]) || (skill_class_2:=[`CRITIQUE`,`COMPLIMENT`,`NA`]) || (skill_class_3:=[`CRITIQUE`,`COMPLIMENT`,`NA`]) || (skill_class_6:=[`CRITIQUE`,`COMPLIMENT`,`NA`]) || (skill_class_7:=[`CRITIQUE`,`COMPLIMENT`,`NA`]) || (skill_class_8:=[`CRITIQUE`,`COMPLIMENT`,`NA`]) || (skill_class_9:=[`CRITIQUE`,`COMPLIMENT`,`NA`]) || (skill_class_10:=[`CRITIQUE`,`COMPLIMENT`,`NA`]) || (skill_class_15:=[`COMPLIMENT`,`CRITIQUE`,`COACHING_OPPORTUNITY`,`NA`]) || (skill_class_17:=[`NO_RED_FLAG`,`POTENTIAL_RED_FLAG`,`CRITIQUE`,`NA`]) || (skill_class_18:=[`CRITIQUE`,`COMPLIMENT`,`NA`]))';
Todd Tarsi
06/12/2025, 7:39 PM{
q: '*',
filter_by: '((skill_class_1:=[`APPLE`,`BANANA`,`NA`]) || (skill_class_2:=[`CRITIQUE`,`COMPLIMENT`,`NA`]) || (skill_class_3:=[`CRITIQUE`,`COMPLIMENT`,`NA`]) || (skill_class_6:=[`CRITIQUE`,`COMPLIMENT`,`NA`]) || (skill_class_7:=[`CRITIQUE`,`COMPLIMENT`,`NA`]) || (skill_class_8:=[`CRITIQUE`,`COMPLIMENT`,`NA`]) || (skill_class_9:=[`CRITIQUE`,`COMPLIMENT`,`NA`]) || (skill_class_10:=[`CRITIQUE`,`COMPLIMENT`,`NA`]) || (skill_class_15:=[`COMPLIMENT`,`CRITIQUE`,`COACHING_OPPORTUNITY`,`NA`]) || (skill_class_17:=[`NO_RED_FLAG`,`POTENTIAL_RED_FLAG`,`CRITIQUE`,`NA`]) || (skill_class_18:=[`CRITIQUE`,`COMPLIMENT`,`NA`]))',
include_fields: 'id',
per_page: 20,
page: '1',
sort_by: 'call_date:desc,call_length_seconds:desc',
group_by: undefined,
query_by: undefined,
group_limit: undefined
}
Todd Tarsi
06/12/2025, 7:40 PMTodd Tarsi
06/12/2025, 7:41 PMTodd Tarsi
06/16/2025, 2:03 PM#!/bin/bash
### Run Typesense via Docker ########################################
export TYPESENSE_API_KEY=xyz
export TYPESENSE_HOST=<http://localhost:8108>
docker stop typesense-repro 2>/dev/null
docker rm typesense-repro 2>/dev/null
rm -rf "$(pwd)"/typesense-data-dir-repro
mkdir "$(pwd)"/typesense-data-dir-repro
# Wait for Typesense to be ready
docker run -d -p 8108:8108 --name typesense-repro \
-v"$(pwd)"/typesense-data-dir-repro:/data \
typesense/typesense:28.0 \
--data-dir /data \
--api-key=$TYPESENSE_API_KEY \
--enable-cors
# Wait till typesense is ready
until curl -s -o /dev/null -w "%{http_code}" "$TYPESENSE_HOST/health" -H "X-TYPESENSE-API-KEY: ${TYPESENSE_API_KEY}" | grep -q "200"; do
sleep 2
done
# Create collection with wildcard fields
curl "<http://localhost:8108/collections>" \
-X POST \
-H "Content-Type: application/json" \
-H "X-TYPESENSE-API-KEY: ${TYPESENSE_API_KEY}" \
-d '{
"name": "wildcard_fields_test",
"fields": [
{"name": "field.*", "type": "string", "facet": true }
]
}'
# Import a single document with only field1
curl "<http://localhost:8108/collections/wildcard_fields_test/documents/import?action=create>" \
-H "X-TYPESENSE-API-KEY: ${TYPESENSE_API_KEY}" \
-H "Content-Type: text/plain" \
-X POST \
-d '{"field1": 123}'
# Test faceting with both existing and non-existing fields
echo "\n"
echo "Testing faceting with wildcard fields:"
curl "<http://localhost:8108/multi_search>" \
-X POST \
-H "Content-Type: application/json" \
-H "X-TYPESENSE-API-KEY: ${TYPESENSE_API_KEY}" \
-d '{
"searches": [
{
"collection": "wildcard_fields_test",
"q": "*",
"query_by": "field1",
"facet_by": "field1,field2"
}
]
}' | jq .
docker stop typesense-repro
docker rm typesense-repro
Alan Martini
06/16/2025, 4:16 PMTodd Tarsi
06/16/2025, 4:16 PMTodd Tarsi
06/16/2025, 4:17 PMAlan Martini
06/16/2025, 5:45 PMcurl "<http://localhost:8108/multi_search>" \
-X POST \
-H "Content-Type: application/json" \
-H "X-TYPESENSE-API-KEY: ${TYPESENSE_API_KEY}" \
-d '{
"searches": [
{
"collection": "wildcard_fields_test",
"q": "*",
"query_by": "field1",
"facet_by": "field1,field2",
"validate_field_names": false
}
]
}' | jq .
You can read more about this parameter (and others) on the last row of this table:
https://typesense.org/docs/28.0/api/search.html#query-parametersTodd Tarsi
06/16/2025, 5:46 PMAlan Martini
06/16/2025, 10:12 PM