Ce projet comble le fossé entre la flexibilité des requêtes OData et les puissantes capacités de recherche d'Elasticsearch, vous permettant d'exploiter la syntaxe de requête OData pour interroger vos index Elasticsearch. Que vous ayez affaire à des objets imbriqués complexes, à des tableaux ou que vous ayez simplement besoin d'effectuer des recherches simples, cette extension est là pour vous.
Pour commencer à utiliser cette extension, incluez-la dans votre projet et configurez-la pour qu'elle pointe vers votre instance Elasticsearch. Voici un exemple rapide :
PM> Install-Package Nest.OData
TargetFramework: net8.0
Dependencies:
Microsoft.AspNetCore.OData (>= 8.2.5)
NEST (>= 7.17.5)
[ HttpGet ]
public async Task < IActionResult > Get ( ODataQueryOptions < Document > queryOptions )
{
var searchDescriptor = queryOptions . ToElasticQuery < Document > ( ) ;
var response = await _elasticClient . SearchAsync < Document > ( searchDescriptor ) ;
if ( response . IsValid )
{
return Ok ( response . Documents ) ;
}
else
{
return BadRequest ( ) ;
}
}
Remplacez Document
par votre classe de document qui correspond à votre index Elasticsearch.
Cette extension prend en charge un large éventail de fonctionnalités de requête OData, spécialement conçues pour le DSL de requête d'Elasticsearch. Voici ce que vous pouvez faire :
$filter
) : traduisez les filtres OData en requête DSL Elasticsearch, prenant en charge les opérateurs logiques, les opérations de comparaison et certaines fonctions de base.$orderby
) : prise en charge du tri selon plusieurs champs, y compris la prise en charge des objets imbriqués.$skip
et $top
) : implémentez la pagination via les paramètres from
et size
d'Elasticsearch.$apply
) : prise en charge de la traduction des transformations d'agrégation, y compris les fonctions groupby
et d'agrégation telles que sum
, max
, min
, average
et countdistinct
.$select
) : possibilité de spécifier les champs à inclure dans la réponse, réduisant ainsi la taille de la charge utile et se concentrant sur les données pertinentes.$expand
) : prise en charge de l'application de conditions $filter
et $select
supplémentaires sur des objets imbriqués complexes. Equals
(eq)Not Equals
(ne)Greater Than
(gt)Greater Than or Equal
(ge)Less Than
(lt)Less Than or Equal
(le)And
Or
In
startswith
endswith
contains
substringof
any
all
Les énumérations sont traitées comme des chaînes, permettant des comparaisons simples sans étapes de conversion supplémentaires. Les collections, y compris les tableaux simples et les objets imbriqués, peuvent être interrogées à l'aide de toutes les fonctions, offrant ainsi une expérience transparente pour travailler avec des structures de données complexes.
L'extension prend en charge les requêtes imbriquées, vous permettant d'explorer des objets et des tableaux imbriqués dans vos documents pour effectuer des recherches plus précises. Que vous filtriez sur les propriétés d'objets imbriqués ou que vous interrogeiez des tableaux pour des éléments spécifiques, cette extension traduit vos requêtes OData en requêtes Elasticsearch DSL efficaces.
$filter=Tags/any(t: t/Name eq 'bug')
{
"query" : {
"nested" : {
"path" : " Tags " ,
"query" : {
"term" : {
"Name" : {
"value" : " bug "
}
}
}
}
}
}
$filter=Category in ('Electronics', 'Books')
{
"query" : {
"terms" : {
"Category" : [ " Electronics " , " Books " ]
}
}
}
$filter=Id eq 42 and ((Color eq 'Red') or (Color eq 'Green') or (Color eq 'Blue'))
{
"query" : {
"bool" : {
"must" : [
{
"term" : {
"Id" : {
"value" : 42
}
}
},
{
"bool" : {
"minimum_should_match" : 1 ,
"should" : [
{
"term" : {
"Color" : {
"value" : " Red "
}
}
},
{
"term" : {
"Color" : {
"value" : " Green "
}
}
},
{
"term" : {
"Color" : {
"value" : " Blue "
}
}
}
]
}
}
]
}
}
}
Les contributions sont les bienvenues ! Que vous corrigiez un bug, ajoutiez une nouvelle fonctionnalité ou amélioriez la documentation, n'hésitez pas à faire une pull request.
Ce projet est sous licence MIT.
Si vous rencontrez des problèmes ou avez des questions, veuillez signaler un problème sur ce référentiel.