3 votes

ElasticSearch et le filtrage Nest ne fonctionnent pas

Je lance une requête qui renvoie 10 résultats. Il y a une propriété dans mon document appelée Type. La valeur de cette propriété pour certains enregistrements est une chaîne vide et pour d'autres enregistrements est soit "AudioAlbum" soit "AudioRington".

Je veux faire deux choses : 1- Exclure du résultat de la recherche les documents dont la propriété Type n'a pas de valeur. 2- Obtenir uniquement les AudioAlbums (comme une recherche différente).

Mon code de recherche pour obtenir les AudioAlbums est le suivant :

    var docs = client.Search<content>(
               b => b.Type("content")
               .Query(q => q.Fuzzy(fz => fz
               .OnField("title").Value(keyWord)
               .OnField("artists.name")))
               .Filter(x => x.Term("type", "AudioRingtone")))
               .Documents.ToList();

Sans la méthode d'extension Filter, j'obtiens 10 enregistrements (dont deux AudioAlbums). Lorsque j'ajoute la méthode .Filter, j'obtiens zéro enregistrement.

Je veux également exclure les enregistrements dont la propriété Type n'a pas de valeur. Encore une fois, mon code (donné ci-dessous) n'enregistre aucun résultat :

BaseFilter notFilter = Filter.Not(x => Filter.Term("Type", string.Empty));
var docs = client.Search<content>(
                b =>
                b.Type("content")
                .Query(q => q.Fuzzy(fz =>fz.OnField("title")
                .Value(keyWord)
                .OnField("artists.name")))
                .Filter(notFilter)).Documents.ToList();

Quel est le problème avec mon code ?

5voto

Martijn Laarman Points 8097

Copier-coller la réponse de la liste des utilisateurs d'elasticsearch

Dans votre premier exemple, vous filtrez sur le champ "type" et dans le second sur le "Type". Je suppose que vous devez changer le premier en "Type".

En fonction de votre analyse du champ "Type", vous devrez peut-être aussi mettre en minuscules "AudioRingtone".

Dans le deuxième exemple, vous utilisez la mauvaise requête :

http://www.elasticsearch.org/guide/reference/query-dsl/missing-filter/

Ce que vous pouvez faire dans NEST :

https://github.com/elasticsearch/elasticsearch-net/blob/master/src/Tests/Nest.Tests.Unit/Search/Filter/Singles/MissingFilterJson.cs

Si vous émettez un filtre/une requête à terme vide, vous heurtez la logique de requête sans condition de NEST, et NEST n'enverra même pas le filtre du tout.

Voir http://nest.azurewebsites.net/nest/writing-queries.html pour obtenir de l'aide en utilisant la requête dsl.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X