Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BUG] Lazy filter performance issue when more than 10 terms in a filter_by field #1720

Open
aaroncueckermann opened this issue May 8, 2024 · 1 comment

Comments

@aaroncueckermann
Copy link

Description

Lazy filtering has non-linear performance with respect to number of elements in a filter.

Steps to reproduce

Perform a search with the following filter

Filter 1 with 11 elements in the cas filter

"ships_to: [CH,DE,US,GB] && cas: [`NOTSET`,39978-14-8,20232-39-7,5117-12-4,2645-08-1,1185-53-1,25767-47-9,15253-89-1,127337-60-4,1354963-38-4,1160245-45-3]"

Takes 561 ms

Filter 2 with 10 elements in the cas filter

filter_6 = "ships_to: [CH,DE,US,GB] && cas: [`NOTSET`,39978-14-8,20232-39-7,5117-12-4,2645-08-1,1185-53-1,25767-47-9,15253-89-1,127337-60-4,1354963-38-4]"

Takes 23ms

Schema

{
"created_at": 1711772413,
"default_sorting_field": "",
"enable_nested_fields": true,
"fields": [
{
"facet": false,
"index": true,
"infix": false,
"locale": "",
"name": "name",
"optional": false,
"sort": false,
"stem": false,
"type": "string"
},
{
"facet": false,
"index": true,
"infix": false,
"locale": "",
"name": "description",
"optional": true,
"sort": false,
"stem": false,
"type": "string"
},
{
"facet": true,
"index": true,
"infix": false,
"locale": "",
"name": "sku",
"optional": false,
"sort": false,
"stem": false,
"type": "string"
},
{
"facet": true,
"index": true,
"infix": false,
"locale": "",
"name": "unspsc",
"optional": false,
"sort": false,
"stem": false,
"type": "string[]"
},
{
"facet": true,
"index": true,
"infix": false,
"locale": "",
"name": "mpn",
"optional": false,
"sort": false,
"stem": false,
"type": "string[]"
},
{
"facet": true,
"index": true,
"infix": false,
"locale": "",
"name": "inchi",
"optional": false,
"sort": false,
"stem": false,
"type": "string[]"
},
{
"facet": true,
"index": true,
"infix": false,
"locale": "",
"name": "inchikey",
"optional": false,
"sort": false,
"stem": false,
"type": "string[]"
},
{
"facet": true,
"index": true,
"infix": false,
"locale": "",
"name": "cas",
"optional": false,
"sort": false,
"stem": false,
"type": "string[]"
},
{
"facet": true,
"index": true,
"infix": false,
"locale": "",
"name": "category_breadcrumbs",
"optional": false,
"sort": false,
"stem": false,
"type": "string[]"
},
{
"facet": true,
"index": true,
"infix": false,
"locale": "",
"name": "ships_to",
"optional": false,
"sort": false,
"stem": false,
"type": "string[]"
},
{
"facet": true,
"index": true,
"infix": false,
"locale": "",
"name": "supplier",
"optional": false,
"sort": false,
"stem": false,
"type": "string"
},
{
"facet": true,
"index": true,
"infix": false,
"locale": "",
"name": "price",
"optional": false,
"sort": false,
"stem": false,
"type": "object"
},
{
"facet": false,
"index": false,
"infix": false,
"locale": "",
"name": "properties",
"optional": true,
"sort": false,
"stem": false,
"type": "object"
},
{
"facet": true,
"index": true,
"infix": false,
"locale": "",
"name": "tags",
"optional": false,
"sort": false,
"stem": false,
"type": "string[]"
},
{
"facet": true,
"index": true,
"infix": false,
"locale": "",
"name": "brand",
"optional": false,
"sort": false,
"stem": false,
"type": "string"
},
{
"facet": true,
"index": true,
"infix": false,
"locale": "",
"name": "manufacturer",
"optional": false,
"sort": false,
"stem": false,
"type": "string"
},
{
"facet": true,
"index": true,
"infix": false,
"locale": "",
"name": "merged_id",
"optional": true,
"sort": true,
"stem": false,
"type": "int64"
},
{
"facet": false,
"index": false,
"infix": false,
"locale": "",
"name": "thumbnail",
"optional": true,
"sort": false,
"stem": false,
"type": "string"
},
{
"facet": false,
"index": false,
"infix": false,
"locale": "",
"name": "identifier",
"optional": true,
"sort": false,
"stem": false,
"type": "string"
},
{
"facet": true,
"index": true,
"infix": false,
"locale": "",
"name": "price.DE",
"optional": true,
"sort": true,
"stem": false,
"type": "float"
},
{
"facet": true,
"index": true,
"infix": false,
"locale": "",
"name": "price.CH",
"optional": true,
"sort": true,
"stem": false,
"type": "float"
},
{
"facet": true,
"index": true,
"infix": false,
"locale": "",
"name": "price.US",
"optional": true,
"sort": true,
"stem": false,
"type": "float"
},
{
"facet": true,
"index": true,
"infix": false,
"locale": "",
"name": "price.GB",
"optional": true,
"sort": true,
"stem": false,
"type": "float"
},
{
"facet": true,
"index": true,
"infix": false,
"locale": "",
"name": "price.CHF",
"optional": true,
"sort": true,
"stem": false,
"type": "float"
},
{
"facet": true,
"index": true,
"infix": false,
"locale": "",
"name": "price.EUR",
"optional": true,
"sort": true,
"stem": false,
"type": "int64"
},
{
"facet": true,
"index": true,
"infix": false,
"locale": "",
"name": "price.USD",
"optional": true,
"sort": true,
"stem": false,
"type": "float"
}
],
"name": "shop_collection_2.en",
"num_documents": 21933041,
"symbols_to_index": [],
"token_separators": []
}

Expected Behavior

~20-30ms response time

Actual Behavior

500ms response time

Metadata

Typesense Version: 0.26.0

OS: Typesense Cloud

@aaroncueckermann
Copy link
Author

I found a workaround of splitting the arrays of filters into arrays of maximum length of 10 elements separated by a ||

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant