2017-06-26 4 views
0

Ich habe eine ziemlich komplexe Abfrage und jetzt möchte ich einige Dokumente, die einige Kriterien erfüllen, erhöhen. Ich habe die folgende vereinfachte Dokumentenstruktur und ich versuche, einigen Dokumenten einen Schub zu geben, basierend auf der ID, dem Genre, dem Tag.So steigern Sie einzelne Dokumente

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

Was möchte ich tun, ist zum Beispiel

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

und alle Dokumente steigern, die in meiner Anfrage enthalten sind und die Kriterien passen, aber ich will sie nicht auszufiltern. Also, Abfrage Klausel Boosting ist keine Hilfe, denke ich.

Edit: Zu machen, wenn einfacher zu verstehen, was ich erreichen will (nicht sicher, ob es mit elasticsearch möglich ist, ist auch eine gültige Antwort).

Ich möchte mit einer Abfrage suchen und eine Ergebnismenge erhalten. In diesem Set möchte ich einige Dokumente verbessern. Aber ich möchte das Ergebnis nicht vergrößern oder filtern. Der Boost sollte unabhängig von der Abfrage sein.

Zum Beispiel suche ich nach einem bestimmten Tag und möchte alle Dokumente mit der Kategorie 'ACTION' in der Ergebnismenge erhöhen. Aber ich möchte nicht alle Dokumente mit der Kategorie 'ACTION' in der Ergebnismenge und auch nicht nur Dokumente mit dem spezifischen Tag UND Kategorie 'ACTION'.

+0

Wenn es Ihnen auf die Antwort könnten Sie bitte das akzeptieren? Vielen Dank. – tukan

+0

Es war nicht ich. :) –

+0

Ich sehe. Ich habe versucht, die Antwort basierend auf Ihrer Bearbeitung zu aktualisieren, was ich nicht vollständig verstanden habe. – tukan

Antwort

0

ich eine Lösung gefunden und es war ziemlich einfach. Ich benutze eine Boosting-Abfrage. Ich verschachtelte nun einfach die verschiedenen Boosting-Kriterien mit und meine ursprüngliche Abfrage ist jetzt die Basisabfrage.

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

Zum Beispiel:

{ 
    "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

Ich denke, Sie müssen dynamische Erhöhung während der Abfragezeit haben.

Der erste passt den ID-Titel mit Boost und der zweite entspricht der "Geschlechter" ACTION.

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

Wenn Sie multi_match Spiel haben, basierend auf Anfrage:

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

Hinweis: Die^5 Mittel für den Titel steigern.

Edit: Vielleicht verschiedene Arten von multi_match Abfragen für Sie gefragt werden (zumindest für ES 5.x) aus dem ES-Referenzhandbuch:

best_fields

(default) Findet Dokumente, die mit einem beliebigen Feld übereinstimmen, verwendet aber die _Score aus dem besten Feld. Siehe best_fields.

most_fields

Findet Dokumente, die jeden Bereich entsprechen und kombiniert die _score von jedes Feld. Siehe most_fields.

cross_fields

Treats Felder mit demselben Analysator, als ob sie Feld eine große waren. Sucht nach jedem Wort in einem Feld. Siehe cross_fields.

Phrase

Führt eine match_phrase Abfrage auf jedem Feld und kombiniert die _score von jedes Feld. Siehe Ausdruck und Ausdruck_präfix.

phrase_prefix

Führt eine match_phrase_prefix Abfrage auf jedem Feld und kombiniert die _score von jedem Feld. Siehe Ausdruck und Ausdruck_präfix.

Mehr auf: ES 5.4 ElasticSearch reference

+0

Aber das würde auch meine Ergebnismenge vergrößern. Ich möchte zum Beispiel nach einem Tag suchen und alle Dokumente mit diesem Tag und der Kategorie 'ACTION' aufladen, aber ich möchte nicht alle Dokumente mit der Kategorie 'ACTION' und ich will nicht nur Dokumente mit dem Tag UND Kategorie 'ACTION' . Weder sollte noch muss, wird in diesem Fall helfen. –

+0

@Peter Die Antwort hat zwei Teile. Hast du das 'multi_match' tatsächlich probiert? Das fördert einzelne Felder - mehr können Sie bei der Referenz lesen - https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-multi-match-query.html#_literal_fields_literal_and_per_field_boosting – tukan

Verwandte Themen