ExTypesense.Search (ExTypesense v1.2.0)
View SourceModule for searching documents.
More here: https://typesense.org/docs/latest/api/search.html
Summary
Functions
Perform multiple/federated searches at once. Search params can be found here.
Same as multi_search/2 but passes another connection.
Same as multi_search/1 but returns a list of Ecto queries.
Same as multi_search_ecto/2 but passes another connection.
Search from a document or Ecto Schema. Search params can be found here.
Same as search/2 but passes another connection.
Same as search/2 but matches Ecto record(s) and returns struct(s).
Same as search_ecto/2 but passes another connection.
Functions
@spec multi_search([map()]) :: {:ok, OpenApiTypesense.MultiSearchResult.t()} | {:error, OpenApiTypesense.ApiResponse.t()}
Perform multiple/federated searches at once. Search params can be found here.
Federated search
This is especially useful to avoid round-trip network latencies incurred otherwise if each of these requests are sent in separate HTTP requests.
You can also use this feature to do a federated search across multiple collections in a single HTTP request. For eg: in an ecommerce products dataset, you can show results from both a "products" collection, and a "brands" collection to the user, by searching them in parallel with a multi_search request.
ordered results
The results array in a multi_search response is guaranteed to be in the same order as the queries you send in the searches array in your request.
Options
limit_multi_searches
: Max number of search requests that can be sent in a multi-search request. Default 50x-typesense-api-key
: You can embed a separate search API key for each search within a multi_search request. This is useful when you want to apply different embedded filters for each collection in individual scoped API keys.union
: When true, merges the search results from each search query into a single ordered set of hits. Defaultfalse
Examples
iex> searches = [
...> %{collection: "companies", q: "Loca Cola"},
...> %{collection: Company, q: "Burgler King"},
...> %{collection: Catalog, q: "umbrella"}
...> ]
iex> ExTypesense.multi_search(searches)
{
:ok,
%OpenApiTypesense.MultiSearchResult{
results: [
%{
facet_counts: [],
found: 0,
hits: [],
out_of: 0,
page: 1,
request_params: %{
collection_name: "companies",
per_page: 10,
q: "Loca Cola",
first_q: "Loca Cola"
},
search_cutoff: false,
search_time_ms: 5
},
%{
facet_counts: [],
found: 0,
hits: [],
out_of: 0,
page: 1,
request_params: %{
collection_name: "companies",
per_page: 10,
q: "Burgler King",
first_q: "Burgler King"
},
search_cutoff: false,
search_time_ms: 5
},
%{
facet_counts: [],
found: 0,
hits: [],
out_of: 0,
page: 1,
request_params: %{
collection_name: "catalogs",
per_page: 10,
q: "umbrella",
first_q: "umbrella"
},
search_cutoff: false,
search_time_ms: 5
}
],
conversation: nil
}
}
@spec multi_search( map() | OpenApiTypesense.Connection.t() | [map()], [map()] | keyword() ) :: {:ok, OpenApiTypesense.MultiSearchResult.t()} | {:error, OpenApiTypesense.ApiResponse.t()}
Same as multi_search/1
ExTypesense.multi_search(searches, opts)
ExTypesense.multi_search(%{api_key: xyz, host: ...}, searches)
ExTypesense.multi_search(OpenApiTypesense.Connection.new(), searches)
@spec multi_search(map() | OpenApiTypesense.Connection.t(), [map()], keyword()) :: {:ok, OpenApiTypesense.MultiSearchResult.t()} | {:error, OpenApiTypesense.ApiResponse.t()}
Same as multi_search/2 but passes another connection.
ExTypesense.multi_search(%{api_key: xyz, host: ...}, searches, opts)
ExTypesense.multi_search(OpenApiTypesense.Connection.new(), searches, opts)
@spec multi_search_ecto([map()]) :: [Ecto.Query.t()] | [{:error, OpenApiTypesense.MultiSearchResult.t()}]
Same as multi_search/1 but returns a list of Ecto queries.
Options (same as multi_search/1)
limit_multi_searches
: Max number of search requests that can be sent in a multi-search request. Default 50x-typesense-api-key
: You can embed a separate search API key for each search within a multi_search request. This is useful when you want to apply different embedded filters for each collection in individual scoped API keys.
Examples
iex> # Do note the collection name isn't string!!!
iex> searches = [
...> %{collection: Company, q: "Burgler King"},
...> %{collection: Catalog, q: "spoon"}
...> ]
iex> ExTypesense.multi_search_ecto(searches)
@spec multi_search_ecto( map() | OpenApiTypesense.Connection.t() | [map()], [map()] | keyword() ) :: [Ecto.Query.t()] | [{:error, OpenApiTypesense.MultiSearchResult.t()}]
Same as multi_search_ecto/1
ExTypesense.multi_search_ecto(searches, opts)
ExTypesense.multi_search_ecto(%{api_key: xyz, host: ...}, searches)
ExTypesense.multi_search_ecto(OpenApiTypesense.Connection.new(), searches)
@spec multi_search_ecto(map() | OpenApiTypesense.Connection.t(), [map()], keyword()) :: [Ecto.Query.t()] | [{:error, OpenApiTypesense.ApiResponse.t()}]
Same as multi_search_ecto/2 but passes another connection.
ExTypesense.multi_search_ecto(%{api_key: xyz, host: ...}, searches, opts)
ExTypesense.multi_search_ecto(OpenApiTypesense.Connection.new(), searches, opts)
@spec search( String.t() | module(), keyword() ) :: {:ok, OpenApiTypesense.SearchResult.t()} | {:error, OpenApiTypesense.ApiResponse.t()}
Search from a document or Ecto Schema. Search params can be found here.
Examples
iex> params = %{q: "umbrella", query_by: "title,description"}
iex> ExTypesense.search(Catalog, params)
{:ok,
%OpenApiTypesense.SearchResult{
found: 0,
hits: [],
conversation: nil,
facet_counts: [],
found_docs: nil,
grouped_hits: nil,
out_of: 0,
page: 1,
request_params: %{
q: "umbrella",
collection_name: "catalogs",
first_q: "umbrella",
per_page: 10
},
search_cutoff: false,
search_time_ms: 1
}
}
iex> params = %{q: "umbrella", query_by: "title,description"}
iex> ExTypesense.search("catalogs", params)
{:ok,
%OpenApiTypesense.SearchResult{
found: 0,
hits: [],
conversation: nil,
facet_counts: [],
found_docs: nil,
grouped_hits: nil,
out_of: 0,
page: 1,
request_params: %{
q: "umbrella",
collection_name: "catalogs",
first_q: "umbrella",
per_page: 10
},
search_cutoff: false,
search_time_ms: 1
}
}
@spec search( map() | OpenApiTypesense.Connection.t(), String.t() | module(), keyword() ) :: {:ok, OpenApiTypesense.SearchResult.t()} | {:error, OpenApiTypesense.ApiResponse.t()}
Same as search/2 but passes another connection.
ExTypesense.search(%{api_key: xyz, host: ...}, "companies", opts)
ExTypesense.search(OpenApiTypesense.Connection.new(), "companies", opts)
@spec search_ecto( String.t() | module(), keyword() ) :: Ecto.Query.t() | {:error, OpenApiTypesense.ApiResponse.t()}
Same as search/2 but matches Ecto record(s) and returns struct(s).
ExTypesense.search_ecto("companies", opts)
@spec search_ecto( map() | OpenApiTypesense.Connection.t(), String.t() | module(), keyword() ) :: Ecto.Query.t() | {:error, OpenApiTypesense.ApiResponse.t()}
Same as search_ecto/2 but passes another connection.
ExTypesense.search_ecto(%{api_key: xyz, host: ...}, "companies", opts)
ExTypesense.search_ecto(OpenApiTypesense.Connection.new(), "companies", opts)