in supporting-blog-content/esre-with-blazor/elastic-blazor/Services/ElasticsearchService.cs [177:268]
public async Task<ElasticResponse> SearchBooksAsync(
string searchTerm,
Dictionary<string, List<string>> selectedFacets
)
{
try
{
_logger.LogInformation($"Performing search for: {searchTerm}");
var retrieverQuery = BuildHybridQuery(searchTerm, selectedFacets);
var multiMatchQuery = BuildMultiMatchQuery(searchTerm, selectedFacets);
var semanticQuery = BuildSemanticQuery(searchTerm, selectedFacets);
/**
* * Hybrid Search
*/
var response = await _client.SearchAsync<BookDoc>(s =>
s.Index("elastic-blazor-books")
.Retriever(retrieverQuery)
.Aggregations(aggs =>
aggs.Add("Authors", agg => agg.Terms(t => t.Field(p => p.Authors)))
.Add(
"Categories",
agg => agg.Terms(t => t.Field(p => p.Categories))
)
.Add("Status", agg => agg.Terms(t => t.Field(p => p.Status)))
)
);
/**
* * MultiMatch Search
*/
// var response = await _client.SearchAsync<BookDoc>(s =>
// s.Index("elastic-blazor-books")
// .Query(multiMatchQuery)
// .Aggregations(aggs =>
// aggs.Add("Authors", agg => agg.Terms(t => t.Field(p => p.Authors)))
// .Add(
// "Categories",
// agg => agg.Terms(t => t.Field(p => p.Categories))
// )
// .Add("Status", agg => agg.Terms(t => t.Field(p => p.Status)))
// )
// );
/**
* * Semantic Search
*/
// var response = await _client.SearchAsync<BookDoc>(s =>
// s.Index("elastic-blazor-books")
// .Query(semanticQuery)
// .Aggregations(aggs =>
// aggs.Add("Authors", agg => agg.Terms(t => t.Field(p => p.Authors)))
// .Add(
// "Categories",
// agg => agg.Terms(t => t.Field(p => p.Categories))
// )
// .Add("Status", agg => agg.Terms(t => t.Field(p => p.Status)))
// )
// );
if (response.IsValidResponse)
{
_logger.LogInformation($"Found {response.Documents.Count} documents");
var hits = response.Total;
var facets =
response.Aggregations != null
? FormatFacets(response.Aggregations)
: new Dictionary<string, Dictionary<string, long>>();
var elasticResponse = new ElasticResponse
{
TotalHits = hits,
Documents = response.Documents.ToList(),
Facets = facets,
};
return elasticResponse;
}
else
{
_logger.LogWarning($"Invalid response: {response.DebugInformation}");
return new ElasticResponse();
}
}
catch (Exception ex)
{
_logger.LogError(ex, "Error performing search");
return new ElasticResponse();
}
}