Aadarsh
10/19/2023, 6:30 AMimport typesense
client = typesense.Client(
{
"nodes": [
{
"host": host, # For Typesense Cloud use xxx.a1.typesense.net
"port": port, # For Typesense Cloud use 443
"protocol": protocol, # For Typesense Cloud use https
}
],
"api_key": api_key,
"connection_timeout_seconds": connection_timeout_seconds,
}
)
collection1 = {
"name": "collection1", ## tags
"fields": [
{
"name": "name",
"type": "string",
"facet": True,
},
{
"name": "priority",
"type": "int32",
"facet": True,
},
{
"name": "code",
"type": "string",
"facet": True,
},
],
}
document1 = [
{"name": "tags Pizza", "priority": 53, "code": "3"},
{"name": "tags Pizzeria", "priority": 20, "code": "1"},
{"name": "Cake", "priority": 23, "code": "2"},
{"name": "Kiosk", "priority": 72, "code": "3"},
{"name": "Icecream", "priority": 49, "code": "4"},
]
collection2 = {
"name": "collection2", # items
"fields": [
{
"name": "name",
"type": "string",
"facet": True,
},
{
"name": "priority",
"type": "int32",
"facet": True,
},
{
"name": "code",
"type": "string",
"facet": True,
},
{
"name": "reference_collection_id",
"type": "string",
"facet": True,
"reference": "collection1.code",
},
],
}
document2 = [
{"name": "Pizza", "priority": 53, "code": "0", "reference_collection_id": "0"},
{"name": "Burger", "priority": 20, "code": "1", "reference_collection_id": "1"},
{"name": "Cake", "priority": 23, "code": "2", "reference_collection_id": "2"},
{"name": "Kiosk", "priority": 72, "code": "3", "reference_collection_id": "3"},
{"name": "Icecream", "priority": 49, "code": "4", "reference_collection_id": "4"},
]
code_links = {
"name": "code_links",
"fields": [
{
"name": "coll1",
"type": "string",
"reference": "collection1.code",
},
{
"name": "coll2",
"type": "string",
"reference": "collection2.id",
}
],
}
documents = [
{"coll1": "0", "coll2": "0"},
{"coll1": "1", "coll2": "1"},
{"coll1": "2", "coll2": "2"},
{"coll1": "3", "coll2": "3"},
{"coll1": "4", "coll2": "4"}
]
def retreive_collection(collection_name, verbose=False):
client.collections[collection_name].retrieve()
if verbose:
print(f'"{collection_name}" retreived successfully')
return
def delete_collection(collection_name, verbose=False):
client.collections[collection_name].delete()
if verbose:
print(f'"{collection_name}" deleted successfully')
return
delete_collection(collection_name="collection1")
client.collections.create(collection1)
client.collections["collection1"].documents.import_(document1)
delete_collection(collection_name="collection2")
client.collections.create(collection2)
client.collections["collection2"].documents.import_(document2)
delete_collection(collection_name="code_links")
client.collections.create(code_links)
client.collections["code_links"].documents.import_(documents)
query = "kiosk"
collection_names = ["collection1", "collection2"]
filtered_search_requests = list()
for collection in collection_names:
search_request = dict()
search_request["collection"] = collection
search_request["q"] = query
search_request["sort_by"] = "priority:desc,_text_match:desc"
search_request["prioritize_token_position"] = "true"
if collection=="collection2":
search_request["filter_by"] = "$code_links(id:*)"
search_request["include_fields"] = "$collection1(*) as collection1"
search_request["exclude_fields"] = "$code_links(*)"
filtered_search_requests.append(search_request)
search_requests = {"searches": filtered_search_requests}
common_search_params = {
"query_by": "name,code",
}
for collection in collection_names:
retreive_collection(collection_name=collection)
response = client.multi_search.perform(search_requests, common_search_params)
print(response)
search_request = {'collection': 'collection2', 'q': 'kiosk', 'sort_by': 'priority:desc,_text_match:desc', 'prioritize_token_position': 'true', 'filter_by': '$code_links(id:*)', 'include_fields': '$collection1(*) as collection1', 'exclude_fields': '$code_links(*)'}
Response:
{
"results": [
{
"facet_counts": [],
"found": 1,
"hits": [
{
"document": {
"code": "3",
"id": "3",
"name": "Kiosk",
"priority": 72
},
"highlight": {
"name": {
"matched_tokens": [
"Kiosk"
],
"snippet": "<mark>Kiosk</mark>"
}
},
"highlights": [
{
"field": "name",
"matched_tokens": [
"Kiosk"
],
"snippet": "<mark>Kiosk</mark>"
}
],
"text_match": 578730123366232200,
"text_match_info": {
"best_field_score": "1108091339262",
"best_field_weight": 15,
"fields_matched": 1,
"score": "578730123366232185",
"tokens_matched": 1
}
}
],
"out_of": 5,
"page": 1,
"request_params": {
"collection_name": "collection1",
"per_page": 10,
"q": "kiosk"
},
"search_cutoff": false,
"search_time_ms": 0
},
{
"facet_counts": [],
"found": 0,
"hits": [],
"out_of": 3,
"page": 1,
"request_params": {
"collection_name": "collection2",
"per_page": 10,
"q": "kiosk"
},
"search_cutoff": false,
"search_time_ms": 0
}
]
}
Here, as I searched for kiosk
it should have searched within the collection2 as well with references to collection1. Please let me know the correct way to do this.
I'm using typesense/typesense:0.26.0.rc24