Gruppieren von match_phrase-Suchergebnissen nach Übereinstimmungstext in Elastic Search

9

Eine passende Phrasenübereinstimmung wie folgt gegeben:

%Vor%

Gibt es eine Möglichkeit, Ergebnisse nach der genauen Übereinstimmung zu gruppieren?

Wenn ich also ein Dokument mit text.english mit "Der schnelle Fuchs springt über die kleine Mauer" und 3 Dokumenten mit "Der faule Fuchs sprangen über die große Mauer" habe, lande ich mit diesen beiden Ergebnisgruppen / p>

Ich bin in Ordnung, wenn ich mehrere Abfragen ausführen und einige Prozesse außerhalb von ES ausführen möchte, aber ich brauche eine Lösung, die vernünftig über eine große Menge von Dokumenten funktioniert. Idealerweise hoffe ich, dass es einen Weg gibt, dies mit Aggregationen zu tun, die ich vermisst habe.

Die beste Lösung, die ich mir ausgedacht habe, besteht darin, die obige Abfrage mit Hervorhebungen auszuführen, alle Hervorhebungen aus allen Ergebnissen zu analysieren und sie basierend auf dem Hervorhebungsinhalt zu gruppieren. Dies ist in Ordnung für sehr kleine Ergebnismengen, jedoch ist es bei einem Ergebnissatz von mehr als 1000 Dokumenten zu langsam.

BEARBEITEN: Vielleicht kann ich das etwas klarer machen. Wenn ich Beispieldokumente mit den folgenden Werten habe:

  1. "Der schnelle Fuchs springt über die kleine Mauer. Blah bla bla bla, viele Seiten ohne Zusammenhang."
  2. "Der faule Fuchs ist über die große Mauer gesprungen. Blah bla bla bla, viele Seiten ohne Zusammenhang."
  3. "Der faule Fuchs ist über die große Mauer gesprungen. Blah bla bla bla, viele Seiten ohne Zusammenhang."
  4. "Der faule Fuchs ist über die große Mauer gesprungen. Blah bla bla bla, viele Seiten ohne Zusammenhang."

Ich möchte meine Ergebnisse folgendermaßen mit dem Abfragetext "Der Fuchs sprang über die Mauer" gruppieren können:

  • "Der schnelle Fuchs springt über die kleine Mauer" - Dokument 1
  • "Der faule Fuchs sprang über die große Mauer" - Dokumente 2, 3, 4
Cole Maclean 23.10.2015, 14:08
quelle

4 Antworten

2

Meiner Meinung nach ist highlighting die einzige Option, da Elasticsearch nur so anzeigt, welche Teile des Textes übereinstimmen. Und in Ihrem Fall möchten Sie Dokumente basierend darauf gruppieren, was "übereinstimmt".

Wenn der Text kürzer gewesen wäre (wie einige Wörter), wäre vielleicht eine kompliziertere Lösung gewesen, den Text in shingle - Art und Weise zu teilen und irgendwie auf diese Sätze zu gruppieren ... vielleicht .

Aber für Textseiten denke ich, dass die einzige Option darin besteht, die Hervorhebung zu verwenden und anschließend weitere Schritte auszuführen, um die hervorgehobenen Teile zu gruppieren.

    
Andrei Stefan 29.10.2015, 15:20
quelle
2

Wenn die Anweisungen in Ihrem text.english "genau" gleich sind, dann sollte das Ergebnis gleich sein. Sie können Ergebnisse basierend auf Elastic Search _score aggregieren.

Bitte beachten Sie diese SO Frage ElasticSearch: Aggregation auf _score Feld?

Da ES das dynamische Scripting deaktiviert hat, könnte dies hilfreich sein. ElasticSearch: Aggregation im _score-Feld mit Groovy deaktiviert

    
ChintanShah25 23.10.2015 18:37
quelle
0

Ich habe ein ähnliches Problem / eine ähnliche Herausforderung in einer Produktsuchanwendung. Ich möchte Produkte nach Marken gruppieren, z.

%Vor%

Um dieses Problem zu lösen, experimentiere ich mit dem Suggester . Die Idee dahinter ist, dass der Suggestor mir Vorschläge für meine Recherchen gibt. Die Vorschläge werden gruppiert und nicht für alle Dokumente wiederholt (obwohl möglicherweise ein anderer Text vorhanden ist). Sie können einen Term Suggester oder einen Sugaser-Suggestion

Dieser Ansatz erfordert jedoch wahrscheinlich, dass Sie die Handhabung der Ergebnisse ändern. Sie müssen die Vorschläge als Gruppen anzeigen und die Suchergebnisse separat verarbeiten. Der Vorteil dieses Ansatzes ist, dass Sie die Gruppierung nicht selbst vornehmen müssen.

Eine andere Lösung ist die Verwendung einer Begriffsaggregation mit Schindeln. Diese Aggregation würde Wortgruppen (Schindeln) gruppieren. Um Ihr Ergebnis zu erhalten, müssen Sie jedoch alle Aggregationen übernehmen und sie mit Ihren Abfrageeingaben abgleichen. Siehe Beispielzuordnung, Daten und Abfrage:

%Vor%

Dokument 1:

%Vor%

Dokument 2:

%Vor%

Dokument 3:

%Vor%

Abfrage:

%Vor%     
paweloque 31.10.2015 22:26
quelle
-1

Ich glaube, Sie könnten eine Aggregation von Termen über eine nicht analysierte Version des Feldes erstellen.

Wenn text.raw als not_analyzed definiert ist, sollte eine Aggregation den ganzen Feldwert annehmen.

Ich habe es nicht getestet, aber ich habe etwas ziemlich ähnliches gefunden: ElasticSearch Begriffe Aggregation von gesamtes Feld

    
Slomo 27.10.2015 14:30
quelle

Tags und Links