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 J'exécute le code suivant pour rechercher toutes les valeurs. p> 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 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? P> 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. P> mise à jour 2
Je peux imprimer en utilisant le s'il s'agit de ce p> titre code>,
Résumé code> et un score
code> 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é.
sommaire_value code>, 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. P>
to_dict () code>.
Si c'est comme si suit, alors s code> est vide p>
s.query ("correspondance", résumé = résumé) code> Cela ne fait rien. P> P>
3 Réponses :
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 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> d'ici, vous pouvez maintenant créer votre requête à partir des paramètres que vous avoir. p> Ceci est: P> .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>
#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}})
J'ai mentionné à utiliser django mais j'ai sauté pour mentionner que j'utilise le Django-Elasticssearch-DSL a>. Le code indiqué ci-dessus exploite cette bibliothèque.
Ok, je n'avais pas utilisé cette bibliothèque. Après avoir lu les documents, je peux voir que cela a été construit sur la bibliothèque Python ES et vous aide à appeler ses méthodes de manière plus simple. Je vais écrire une autre réponse pour vous :)
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: p> 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 p> et tout devrait fonctionner comme vous le souhaitez: D P> P> réponse = S.Execute () code> p>
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 () code> et a vu que
s code> est vide avant
exécuté () code>. J'ai vérifié que cela entre bien les déclarations si elles sont également.
Vous devez vous assigner dans s code>: