J'essaie de filtrer et de trier par nom avec Par exemple - Ceci est ma requête de base p> En ce moment, il trie par ordre alphabétique.
J'ai pensé à quelques idées pouvant fonctionner: p> ajoutez un "devrait" avec boosting par "match". Mais alors j'ai eu un problème avec
Trier par "_score", il brise mon tri alphabétique, bien que je trie d'abord par "_score" et par nom de marque. Exemple avec l'ajout de cela au "Bool": "Doit": [{"Match": {"Brand.ID": {"Query": 34709, "Boost": 20}}} P> Li>
J'ai essayé avec des "agrégats" afin que la première requête (seau) soit
"Faites correspondre" le nom de marque spécifique et trie l'alphabéticaly à l'intérieur, le
La deuxième requête ne tiendrait que l'alphabétique. mais j'ai totalement gâché. P> li>
OL> Je dois utiliser filtré -> Filtres, je ne peux pas utiliser les requêtes de scripts.
Merci. P>
3 Réponses :
J'ai testé localy ici c'est. Aussi à simplifier la requête Ne demandez pas de nom mais pour les identifiants de marque depuis que votre marque pourrait avoir de nombreux noms. Si vous souhaitez toujours faire trier les noms, vous pouvez modifier le script comme vous le souhaitez
POST stack/_search { "query": { "function_score": { "boost_mode": "replace", "query": { "bool": { "must": [ { "exists": { "field": "brand.id" } } ] } }, "script_score": { "script": { "params": { "ids": [ 406, 405 ] }, "inline": "return params.ids.indexOf(doc['brand.id'].value) > -1 ? 1000 - params.ids.indexOf(doc['brand.id'].value) : _score;" } } } } }
Merci, mais comme je l'ai dit: "Je dois utiliser filtré -> Filtres, je ne peux pas utiliser les requêtes de scripts."
Si la priorité de la marque est connue à l'heure index, vous pouvez l'indexer directement dans votre doc, comme:
"sort" : [ { "brand.priority" : {"order" : "desc"}}, { "brand.name" : {"order" : "asc" }} ]
Merci, mais je ne veux pas être dépend de l'indexation
Voulez-vous dire une marque peut avoir une priorité différente pour différentes requêtes?
Non, je sais que je peux le faire dans l'index, je ne veux pas que cela dépend de l'indice .. J'ai quelques raisons de boutonneuse. Je cherche d'autres options. Merci
Au moment de la requête, comment allez-vous transmettre la priorité relative des marques étant donné que cela pourrait ne pas être connu APIORI quelles marques vont correspondre à vos critères de filtrage. La liste de marques générale peut également augmenter énormément.
c'est exactement ce que je demande, je veux stimuler les marques avec la priorité et assurez-vous que les autres marques seront toujours tribiliquement alphabétiquement.
Mon point est le point: Si vous envisagez de transmettre la priorité des marques au moment de la requête à condition que vous ne connaissez même pas les marques applicables correspondant aux critères de filtrage, cela me semble totalement impraticable, à moins que ces informations soient stockées quelque part dans l'index.
mais je connais les marques que je veux faire la priorité au moment de la requête, voir mon exemple
Si vous utilisez ElasticsSearch Version 1.x, la requête suivante doit vous fournir le résultat attendu:
(Peut être à adapter un peu à utiliser des champs bruts si nécessaire) sur les versions ultérieures d'Elasticsearch La requête filtrée est remplacée par la requête Bool ,
Cette requête doit faire le travail (avec une adaptation similaire à celle précédente pour l'utilisation de champs bruts si nécessaire) P> dans les deux cas, vous pouvez utiliser la fonction Boost si vous vouloir avoir le haut rempli de plus d'une correspondance préférée, dans une commande donnée p> p>
Suivant. J'ai aussi essayé de faire la même chose sans scripts.
Qu'est-ce que ce tableau? Vous voulez que les marques soient triées sur votre priorité ou quoi?
Si vous postez un exemple de document et un résultat attendu, cela aiderait à comprendre
@Volodymyrbilyachat - Publier mis à jour
Pourriez-vous indiquer la version d'Elasticsearch que vous utilisez? Je crois que cela est pertinent pour les options disponibles.