0
votes

Comment exécuter une combinaison de requête et filtrer dans Elasticsearch?

J'essaie d'utiliser Elasticsearch dans un projet factice à Django. Je tente de faire une page de recherche en utilisant Django-ElasticseSearch-DSL . L'utilisateur peut fournir un titre , Résumé et un score pour rechercher. La recherche doit correspondre à toutes les informations fournies par l'utilisateur, mais si l'utilisateur ne fournit aucune information sur quelque chose, cela devrait être ignoré.

J'exécute le code suivant pour rechercher toutes les valeurs. xxx

Lorsque j'ai une valeur pour tous les champs, la recherche fonctionne correctement, mais si par exemple Je ne fournis pas de valeur pour le sommaire_value , bien que je m'attends à ce que la recherche continue à rechercher le reste des valeurs, le résultat est qu'il ne se présente rien à rien.

Y a-t-il une certaine valeur que les champs doivent avoir par défaut au cas où l'utilisateur ne fournit pas de valeur? Ou comment dois-je m'approcher?


Mise à jour 1 J'ai essayé d'utiliser ce qui suit, mais cela revient à chaque fois, peu importe l'entrée, je donne les mêmes résultats. xxx


mise à jour 2 Je peux imprimer en utilisant le to_dict () .
Si c'est comme si suit, alors s est vide xxx

s'il s'agit de ce xxx p> Puis cela fonctionne correctement mais toujours si j'ajoute s.query ("correspondance", résumé = résumé) Cela ne fait rien.


0 commentaires

3 Réponses :


0
votes

Je vous recommanderais d'utiliser le Python ES Client . Il vous permet de gérer plusieurs choses liées à votre cluster: définissez les mappages, les chèques de santé, les requêtes, etc.

dans sa méthode .Search () code>, le paramètre Body est l'endroit où vous envoyez votre requête Vous l'exécuteriez normalement ({"Query" ...}). Vérifiez le Exemple d'utilisation . P>

maintenant , pour votre cas particulier, vous pouvez avoir un modèle de votre requête stockée dans une variable. Vous commencez par commencer, disons, une "requête vide" seulement avec filtre , tout comme: p> xxx pré>

d'ici, vous pouvez maintenant créer votre requête à partir des paramètres que vous avoir. p>

Ceci est: P>

#This would look a little messy, but it's useful ;)
#if parameter1 is not None or emtpy
#(change the if statement for your particular case)
if parameter1:
    query["query"]["bool"]["filter"].append({"term": {"field1": parameter1}})



1
votes

Je peux voir dans le Exemple de recherche Que Django-ElasticseSearch-DSL vous permet d'appliquer des agrégations après une recherche ...

Que diriez-vous de "mettre en place" votre recherche? Je peux penser si ce qui suit: xxx

Faites de même pour tous vos paramètres (avec le procédé nécessaire pour chacun), seuls seuls ceux qui existaient apparaîtront dans votre requête. À la fin, exécutez simplement

réponse = S.Execute ()

et tout devrait fonctionner comme vous le souhaitez: D


5 commentaires

Merci pour cela, j'ai mis à jour ma question ci-dessus pour inclure la partie du code que j'ai essayé en fonction de votre réponse. Le problème est que maintenant, il semble que cela renvoie les dernières entrées et non ce que je recherche. J'ai essayé de chercher en utilisant uniquement le titre ou le seul résumé ou les deux, mais chaque fois que les mêmes résultats proviennent.


Je suis curieux ... Avant S.Execute (), comment sonne-t-on? L'impression probablement n'est pas la meilleure idée ... déboguer votre code et voyez que toute la requête est envoyée.


Si vous déboguez maintenant, assurez-vous que les déclarations si elles fonctionnent également correctement. Recevez-vous vos paramètres (titre et résumé) comme aucun ou 0 ou "" lorsque l'utilisateur ne leur envoie pas? A quoi est-ce qu'ils ressemblent?


En outre, dans l'objet de recherche, essayez de spécifier le nom d'index (il doit également accepter des caractères génériques).


J'imprime en utilisant to_dict () et a vu que s est vide avant exécuté () . J'ai vérifié que cela entre bien les déclarations si elles sont également.



2
votes

Vous devez vous assigner dans s : xxx


0 commentaires