Hi, I want to search with documents having single ...
# community-help
a
Hi, I want to search with documents having single reference fields to other collection documents. I've made this python code but did not get the required response.
Copy code
import 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)
Copy code
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:
Copy code
{
  "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