J'essaye actuellement de migrer une application basée sur solr vers elasticsearch.
J'ai cette question lucene
((
name:(+foo +bar)
OR info:(+foo +bar)
)) AND state:(1) AND (has_image:(0) OR has_image:(1)^100)
Pour autant que je sache, il s'agit d'une combinaison de clauses MUST combinées avec booléen OR:
"Obtenez tous les documents contenant (foo AND bar in name) OR (foo AND bar in info). Après cela, filtrez les résultats par état de la condition = 1 et améliorez les documents qui ont une image."
J'ai essayé d'utiliser une requête booléenne avec MUST mais je n'arrive pas à obtenir boolean OR dans les clauses must. Voici ce que j'ai:
GET /test/object/_search
{
"from": 0,
"size": 20,
"sort": {
"_score": "desc"
},
"query": {
"bool": {
"must": [
{
"match": {
"name": "foo"
}
},
{
"match": {
"name": "bar"
}
}
],
"must_not": [],
"should": [
{
"match": {
"has_image": {
"query": 1,
"boost": 100
}
}
}
]
}
}
}
Comme vous pouvez le voir, les conditions MUST pour "info" sont manquantes.
Quelqu'un a-t-il une solution?
Merci beaucoup.
** METTRE À JOUR **
J'ai mis à jour ma requête elasticsearch et supprimé ce score de fonction. Mon problème de base existe toujours.
la source
Réponses:
Exemple:
Vous voulez voir tous les éléments qui sont (ronds ET (rouge OU bleu)):
Vous pouvez également faire des versions plus complexes de OR, par exemple si vous voulez faire correspondre au moins 3 sur 5, vous pouvez spécifier 5 options sous "devrait" et définir un "minimum_should" de 3.
Merci à Glen Thompson et Sebastialonso d'avoir trouvé où ma nidification n'était pas tout à fait juste avant.
Merci également à Fatmajk pour avoir signalé que «terme» devient «match» dans ElasticSearch 6.
la source
should
dans le niveau supérieurbool
, et y compris unminimum_should_match: 1
travail?[term] malformed query, expected [END_OBJECT] but found [FIELD_NAME]
. Cela dépend-il en quelque sorte de la version?minimum_should
est 1, et l'encapsulation de cebool
résultat dans ce groupe est true si au moins un élément correspond, false si aucun ne correspond. Ma motivation pour créer cette réponse était que je résolvais exactement ce genre de problème, et la documentation disponible et même les réponses que je pouvais trouver sur des sites comme celui-ci n'étaient au mieux d'aucune utilité, alors j'ai continué à chercher jusqu'à ce que je sente que j'avais une assez bonne compréhension de ce qui se passait. J'accueille volontiers tous les conseils constructifs sur la façon dont je peux encore améliorer la réponse.J'ai finalement réussi à créer une requête qui fait exactement ce que je voulais:
Une requête booléenne imbriquée filtrée. Je ne sais pas pourquoi cela n'est pas documenté. Peut-être que quelqu'un ici peut me le dire?
Voici la requête:
En pseudo-SQL:
Veuillez garder à l'esprit que cela dépend de l'analyse de votre champ de document et des mappages de la manière dont name = foo est géré en interne. Cela peut varier d'un comportement flou à strict.
"minimum_should_match": 1 dit qu'au moins une des instructions should doit être vraie.
Cela signifie que chaque fois qu'il y a un document dans le jeu de résultats qui contient has_image: 1, il est amplifié par un facteur 100. Cela change l'ordre des résultats.
Amusez-vous les gars :)
la source
C'est ainsi que vous pouvez imbriquer plusieurs requêtes booléennes dans une seule requête booléenne externe en utilisant Kibana,
Voici comment vous pouvez imbriquer une requête dans ES
Il y a plus de types dans "bool" comme -
Filtre
ne doit pas
la source
J'ai récemment dû résoudre ce problème aussi, et après beaucoup d'essais et d'erreurs, je suis venu avec ceci (en PHP, mais mappé directement sur le DSL):
Qui correspond à quelque chose comme ça dans SQL:
La clé de tout cela est le
minimum_should_match
cadre. Sans cela, lefilter
remplace totalement leshould
.J'espère que cela aide quelqu'un!
la source
Dans
must
vous devez ajouter le tableau de conditions de requête avec lequel vous souhaitez travaillerAND
et dansshould
vous devez ajouter la condition de requête avec laquelle vous souhaitez travaillerOR
.Vous pouvez vérifier ceci: https://github.com/Smile-SA/elasticsuite/issues/972
la source
Si vous utilisiez l'analyseur de requête par défaut de Solr ou Lucene, vous pouvez à peu près toujours le mettre dans une requête de chaîne de requête:
Cela dit, vous pouvez utiliser une requête booléenne , comme celle que vous avez déjà publiée, ou même une combinaison des deux.
la source