Was ist die SpanQuery?

SpanQuerys ermöglichen verschachtelte, positionsbezogene Einschränkungen beim Abgleich von Dokumenten in Lucene. SpanQuerys ähneln PhraseQuerys oder MultiPhraseQuerys insofern, als sie alle…

SpanQuerys ermöglichen verschachtelte, positionsbezogene Einschränkungen beim Abgleich von Dokumenten in Lucene. SpanQuerys ähneln PhraseQuerys oder MultiPhraseQuerys insofern, als sie alle Termtreffer nach Position einschränken, aber SpanQuerys können viel ausdrucksstärker sein. Die grundlegenden SpanQuery-Einheiten sind die SpanTermQuery und die SpanNearQuery. Eine SpanTermQuery ist die grundlegendste SpanQuery und ermöglicht es Ihnen einfach, ein Feld, einen Term und einen Boost anzugeben, indem Sie einen Term übergeben, genau wie bei einer TermQuery. SpanTermQuery wird als grundlegender Baustein beim Aufbau von kombinierten SpanQuery-Klassen wie SpanNearQuery verwendet. Eine SpanNearQuery sucht nach einer Anzahl von SpanQuerys, die in einem bestimmten Abstand zueinander liegen. Sie können angeben, dass die Spans in der angegebenen Reihenfolge kommen müssen oder dass die Reihenfolge nicht berücksichtigt werden soll. Diese SpanQuerys können eine beliebige Anzahl von TermQuerys, andere SpanNearQuerys oder eine der anderen unten genannten SpanQuerys sein. Sie können beliebig verschachteln, z.B. können SpanNearQuerys andere SpanNearQuerys enthalten, die wiederum andere SpanNearQuerys enthalten, usw. Angenommen, wir möchten lucene innerhalb von 5 Positionen von doug finden, wobei doug auf lucene folgt (die Reihenfolge ist wichtig) – dann könnten Sie die folgende SpanQuery verwenden:

new SpanNearQuery(new SpanQuery[] {
  new SpanTermQuery(new Term(FIELD, "lucene")),
  new SpanTermQuery(new Term(FIELD, "doug"))},
  5,
  true);
Lucene span Abfrage
In diesem Beispieltext ist Lucene innerhalb von 3 von Doug

Der SpanNearQuery-Konstruktor nimmt ein Array von SpanQuerys, den zulässigen Abstand zwischen den Spans und einen Booleschen Wert an, der angibt, ob die Reihenfolge (wie durch die Reihenfolge des SpanQuery-Arrays angegeben) erforderlich ist. Sie können eine ähnliche Abfrage mit einer PhraseQuery spezifizieren, indem Sie lucene innerhalb von 5 von doug angeben, aber Sie können die Reihenfolge nicht genau steuern, es sei denn, die Begriffe liegen direkt nebeneinander (z.B. geben Sie einen Null-Abstand an). Um lucene innerhalb von 5 von doug zu finden, müssten Sie den Slop auf über 1 erhöhen. Wenn Sie das tun, lassen Sie eine größere Edit-Distanz für die Übereinstimmung zu, und Edit-Distanz schränkt nicht durch Reihenfolge und Distanz ein, sondern durch ‚Term Moves‘ (Anmerkung: Lucene verwendet keine klassische Edit-Distanz, sondern einen Edit-Distanz-ähnlichen Algorithmus). Die Editierdistanz ist etwas weniger intuitiv als die direkte Positionsdifferenz, aber es reicht, wenn Sie wissen, dass Sie bei der Editierdistanz nicht nach der Reihenfolge einschränken können, es sei denn, Sie erlauben 0 oder 1 ‚Term Moves‘ (oder Slop im Lucene-Jargon). Sobald Sie einen Slop von 2 festlegen, reicht das aus, um zuzulassen, dass Begriffe außerhalb der Reihenfolge übereinstimmen. Unten sehen Sie ein weiteres SpanNearQuery-Beispiel. Diesmal suchen wir nach doug innerhalb von 5 nach lucene und dann nach hadoop innerhalb von 4 nach der Spanne lucene -> doug.

SpanNearQuery spanNear = new SpanNearQuery(new SpanQuery[] {
  new SpanTermQuery(new Term(FIELD, "lucene")),
  new SpanTermQuery(new Term(FIELD, "doug"))},
  5,
  true);

new SpanNearQuery(new SpanQuery[] {
  spanNear,
  new SpanTermQuery(new Term(FIELD, "hadoop"))},
  4,
  true);
Lucene span Abfrage
Die zweite Spanne liegt innerhalb von 4 der ersten.

Sie können nicht nur SpanTermQuerys und SpanNearQuerys innerhalb von SpanNearQuerys verschachteln, sondern es gibt auch einige andere Span-Klassen, mit denen Sie SpanQuerys kombinieren und verschachteln können: SpanOrQuery Die SpanOrQuery nimmt ein Array von SpanQuerys auf und passt, wenn eine der zugrunde liegenden SpanQuerys passt. SpanNotQuery Die SpanNotQuery nimmt zwei SpanQuerys als Parameter entgegen – eine SpanQuery, nach der gesucht werden soll, sowie eine SpanQuery, die eine Übereinstimmung verhindert, wenn sich die passende SpanQuery mit ihr überschneidet. Damit können Sie z.B. nach george innerhalb von 10 von bush suchen, ohne w zu überspannen. SpanFirstQuery Mit der SpanFirstQuery können Sie festlegen, dass eine passende Endposition des Spans vor einer bestimmten Position liegen muss, die der SpanFirstQuery übergeben wird. Mit anderen Worten, Sie können damit nach Spans suchen, die innerhalb der ersten n Positionen des Dokuments beginnen und enden. In bestimmten Situationen kann es praktisch sein, eine SpanAndQuery zu haben. Sie können dies leicht mit einer SpanNearQuery mit einem Abstand von Integer.MAX_VALUE simulieren. Der Standard Lucene QueryParser hatte noch nie eine Syntax zur Angabe von SpanQuerys. Ein neuer Parser, der den alten erweitert, wurde hinzugefügt, der SpanQueries verwendet, um eine eingeschränkte Lucene-Syntax innerhalb von Phrase-Abfragen zu ermöglichen. Dieser Parser generiert zwar SpanQuerys, um diese Funktionalität zu ermöglichen, aber Sie können deren Erstellung nicht kontrollieren/spezifizieren. Um die Leistungsfähigkeit von SpanQuerys tatsächlich zu nutzen, müssen Sie sie entweder manuell im Code erstellen oder einen der alternativen QueryParser in Lucene contrib ausprobieren. Lesen Sie einen früheren Beitrag über Query-Parser: Exploring Query Parsers – Surround, Xml-Query-Parser und Qsol unterstützen alle Spans (Hinweis: Qsol kann nicht die gesamte Bandbreite von SpanQuerys ausdrücken) Der SpanScorer (in Solr als hl.usePhraseHighlighter verfügbar) kann zur Hervorhebung von Span-Abfragen verwendet werden und ermöglicht eine positionskorrekte Hervorhebung (der Standard-Highlighter findet nur Begriffe unabhängig von der Position). Er hebt sogar Phrasen korrekt hervor, indem er eine PhraseQuery in eine sehr ähnliche SpanQuery konvertiert. Wenn die Benutzer erst einmal sehen, welche Begriffe hervorgehoben werden, haben sie oft Fragen dazu, wie Spans übereinstimmen – insbesondere: Wenn ich nach worda innerhalb von n von wordb suche, warum wird dann nicht jedes Vorkommen von worda innerhalb von n von wordb hervorgehoben? Das hat etwas damit zu tun, wie SpanQuerys übereinstimmen. Was bedeutet es, dass Spans in der richtigen Reihenfolge sein müssen, und wie passen SpanQuerys tatsächlich zusammen? Betrachten Sie die folgende Abfrage: (lucene innerhalb von 3 von doug) innerhalb von 0 von (war innerhalb von 3 von cutting) [in Reihenfolge]

SpanNearQuery spanNear1 = new SpanNearQuery(new SpanQuery[] {
  new SpanTermQuery(new Term(FIELD, "lucene")),
  new SpanTermQuery(new Term(FIELD, "doug"))},
  3,
  true);

SpanNearQuery spanNear2 = new SpanNearQuery(new SpanQuery[] {
  new SpanTermQuery(new Term(FIELD, "was")),
  new SpanTermQuery(new Term(FIELD, "cutting"))},
  3,
  true);

new SpanNearQuery(new SpanQuery[] {
  spanNear1,
  spanNear2},
  0,
  true);
Lucene span Abfrage
Solange Spanne 2 auf den Beginn von Spanne 1 folgt, wird davon ausgegangen, dass sie der Reihe nach kommen.

Das obige Diagramm zeigt, wie diese Abfrage übereinstimmen könnte. Sie können sehen, dass, obwohl wir darum gebeten haben, dass die Spans in der Reihenfolge kommen und der Abstand zwischen den Spans 0 sein muss, die Übereinstimmung war->cutting überschneidet sich mit lucene-> doug. Das liegt daran, dass eine in order SpanNearQuery mit einem Abstand von 0 übereinstimmen kann, wenn der zweite Span entweder eins nach dem Beginn des ersten Spans bis eins nach dem Ende des ersten Spans beginnt. Die Verwendung von made anstelle von was würde also passen, ebenso wie die Verwendung von by anstelle von was. Wenn die zweite Spanne mit Schneiden beginnt, könnte sie immer noch übereinstimmen, da doug und Schneiden einen Abstand von 0 haben. Jede Spanne, die von was bis cutting beginnt, liegt also innerhalb von 0 der ersten lucene-> doug-Spanne. Der Abstand wird vom Ende von span1 bis zum Beginn von span2 gemessen, aber die Einschränkung der Reihenfolge bedeutet nur, dass der Beginn von span2 nach dem Beginn von span1 liegen muss. Ein anderes Beispiel: Betrachten Sie den Text [Katzen und Hunde und Katzen und Katzen]. Sie könnten zunächst annehmen, dass, wenn Sie den Span Highlighter verwenden, um diesen Text für eine Abfrage von Katzen innerhalb von 10 von Hunden (die Reihenfolge spielt keine Rolle) hervorzuheben, jede Instanz von Katzen und Hunden hervorgehoben werden würde. Schließlich liegt jede Instanz innerhalb von 10 von jeder anderen. Aber sehen wir mal, was tatsächlich passiert: Sie können sehen, dass die letzten Katzen nicht hervorgehoben sind. Das liegt daran, dass Lucene Spans als nicht überlappend definiert. Das bedeutet, dass jeder Span nach dem letzten Span beginnen muss (mindestens eine Position nach). Im obigen Beispiel gibt es zwei übereinstimmende Spans, cats->dogs und dogs->cats.

Lucene span Abfrage

Damit die zweiten Katzen in die Spanne aufgenommen werden können, müsste die Spanne bei Hunden beginnen. Aber ein Span geht bereits von Hunden zu den ersten Katzen – es kann keinen weiteren Span geben, der bei Hunden beginnt. SpanQuerys führen keinen erschöpfenden Abgleich durch – aber wenn es mindestens eine Übereinstimmung gibt, wird diese auch gefunden.

You Might Also Like

Vom Suchunternehmen zum praktischen KI-Pionier: Unsere Vision für 2025 und darüber hinaus

CEO Mike Sinoway gibt Einblicke in die Zukunft der KI und stellt...

Read More

Wenn KI schief geht: Fehlschläge in der realen Welt und wie man sie vermeidet

Lassen Sie nicht zu, dass Ihr KI-Chatbot einen 50.000 Dollar teuren Tahoe...

Read More

Lucidworks Kernpakete: Branchenoptimierte KI-Such- und Personalisierungslösungen

Entdecken Sie unsere umfassenden Core Packages, die Analytics Studio, Commerce Studio und...

Read More

Quick Links