2017-06-26 9 views
0

J'ai une requête assez complexe et maintenant je veux booster certains documents qui répondent à certains critères. J'ai la structure de document simplifiée suivante et j'essaie de donner un coup de pouce à certains documents en fonction de l'identifiant, du genre, du tag.Comment booster des documents individuels

{ 
    "id": 123, 
    "genres": ["ACTION", "DRAMA"], 
    "tags": ["For kids", "Romantic", "Nature"] 
} 

Ce que je veux faire est par exemple

id: 123 boost: 5 
genres: ACTION boost: 3 
tags: Romantic boost: 0.2 

et stimuler tous les documents qui sont contenus dans ma requête et correspondent aux critères, mais je ne veux pas les filtrer. Donc, la stimulation de la clause de requête n'est pas utile, je suppose. Edit: Pour rendre plus facile à comprendre ce que je veux réaliser (je ne sais pas si c'est possible avec elasticsearch, non est aussi une réponse valide).

Je souhaite effectuer une recherche avec une requête et obtenir un jeu de résultats. Dans cet ensemble je veux augmenter quelques documents. Mais je ne veux pas agrandir le jeu de résultats ou le filtrer. Le boost devrait être indépendant de la requête. Par exemple, je recherche une étiquette spécifique et je veux augmenter tous les documents avec la catégorie 'ACTION' dans le jeu de résultats. Mais je ne veux pas tous les documents avec la catégorie 'ACTION' dans le jeu de résultats et je ne veux pas seulement des documents avec l'étiquette spécifique et la catégorie 'ACTION'.

+0

Si elle vous était à la réponse que vous pourriez s'il vous plaît accepter? Je vous remercie. – tukan

+0

Ce n'était pas moi. :) –

+0

Je vois. J'ai essayé de mettre à jour la réponse basée sur votre édition, que je n'ai pas entièrement comprise. – tukan

Répondre

0

J'ai trouvé une solution et il était assez simple. J'utilise une requête boostante. Je viens d'imbriquer les différents critères de boosting et ma requête d'origine est maintenant la requête de base.

https://www.elastic.co/guide/en/elasticsearch/reference/2.3/query-dsl-boosting-query.html

Par exemple:

{ 
    "query": { 
    "boosting": { 
     "positive": { 
     "boosting": { 
      "positive": { 
      "match": { 
       "director": "Spielberg" 
      } 
      }, 
      "negative": { 
      "term": { 
       "genres": "DRAMA" 
      } 
      }, 
      "negative_boost": 1.3 
     } 
     }, 
     "negative": { 
     "term": { 
      "tags": "Romantic" 
     } 
     }, 
     "negative_boost": 1.2 
    } 
    } 
} 
2

Je pense que vous devez avoir une amélioration dynamique pendant le temps de requête.

Le premier correspond au titre de l'ID avec boost et le second correspond à l'ACTION 'sexes'.

{ 
    "query": { 
    "bool": { 
     "should": [ 
     { 
      "match": { 
      "title": { 
       "query": "id", 
       "boost": 5 
      } 
      } 
     }, 
     { 
      "match": { 
      "content": "Action" 
      } 
     } 
     ] 
    } 
    } 
} 

Si vous voulez avoir multi_match correspondance en fonction de votre requête:

{ 
    "multi_match" : { 
    "query": "some query terms here", 
    "fields": [ "id^5", "genders^3", "tags^0.2" ] 
    } 
} 

Note: les^5 signifie stimuler le titre.

Edit: Peut-être vous demandez différents types de requêtes multi_match (au moins pour 5.x ES) du guide de référence ES:

best_fields

(par défaut) Trouve les documents qui correspondent à n'importe quel champ, mais utilise la _score du meilleur champ. Voir best_fields.

most_fields

Recherche les documents qui correspondent à tous les domaines et combine les _SCORE de chaque champ. Voir most_fields.

cross_fields

Traite des champs avec le même analyseur comme si elles étaient un grand champ . Cherche chaque mot dans n'importe quel champ. Voir cross_fields.

phrase

Lance une requête match_phrase sur chaque champ et combine les _SCORE de chaque champ. Voir phrase et phrase_prefixe.

phrase_prefix

exécute une requête de match_phrase_prefix sur chaque champ et combine les _SCORE de chaque champ. Voir phrase et phrase_prefixe.

Plus sur: ES 5.4 ElasticSearch reference

+0

Mais cela élargirait aussi mon ensemble de résultats. Par exemple je veux chercher un tag et booster tous les documents avec cette balise et catégorie 'ACTION' mais je ne veux pas tous les documents avec la catégorie 'ACTION' et je ne veux pas que des documents avec le tag AND catégorie 'ACTION' . Ni devrait ni doit aider dans ce cas. –

+0

@Peter La réponse a deux parties. Avez-vous réellement essayé le 'multi_match'? Cela booste les champs individuels - vous pouvez lire plus à la référence - https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-multi-match-query.html#_literal_fields_literal_and_per_field_boosting – tukan