ExTypesense.Search (ExTypesense v2.0.1)
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/1 but returns a list of Ecto queries.
Search from a document or Ecto Schema.
Same as search/2 but matches Ecto record(s) and returns struct(s).
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
conn
: The custom connection map or struct you passedlimit_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()], keyword() ) :: {:ok, OpenApiTypesense.MultiSearchResult.t()} | {:error, OpenApiTypesense.ApiResponse.t()}
Same as multi_search/1
Options
conn
: The custom connection map or struct you passed
Examples
iex> opts = [conn: %{api_key: xyz, host: ...}, ...]
iex> ExTypesense.multi_search(searches, opts)
iex> opts = [conn: OpenApiTypesense.Connection.new(), ...]
iex> ExTypesense.multi_search(searches, opts)
@spec multi_search_ecto([map()]) :: [Ecto.Query.t()] | [OpenApiTypesense.ApiResponse.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()], keyword() ) :: [Ecto.Query.t()] | [OpenApiTypesense.ApiResponse.t()]
Same as multi_search_ecto/1
Options
conn
: The custom connection map or struct you passed
Examples
iex> opts = [conn: %{api_key: xyz, host: ...}, ...]
iex> ExTypesense.multi_search_ecto(searches, opts)
iex> opts = [conn: OpenApiTypesense.Connection.new(), ...]
iex> ExTypesense.multi_search_ecto(searches, opts)
@spec search( String.t() | module(), keyword() ) :: {:ok, OpenApiTypesense.SearchResult.t()} | {:error, OpenApiTypesense.ApiResponse.t()}
Search from a document or Ecto Schema.
Options
conn
: The custom connection map or struct you passed- 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
}
}
iex> conn = %{api_key: xyz, host: ...}
iex> ExTypesense.search("companies", conn: conn)
iex> conn = OpenApiTypesense.Connection.new()
iex> ExTypesense.search("companies", conn: conn)
iex> opts = [conn: conn, q: "hat", ...]
iex> ExTypesense.search("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).
Options
conn
: The custom connection map or struct you passed
Examples
iex> conn = %{api_key: xyz, host: ...}
iex> ExTypesense.search_ecto("companies", conn: conn)
iex> conn = OpenApiTypesense.Connection.new()
iex> ExTypesense.search_ecto("companies", conn: conn)
iex> opts = [conn: conn, ...]
iex> ExTypesense.search_ecto("companies", opts)