2009-03-03 7 views
0

In meinen Lucene-Dokumenten habe ich ein Feld "Firma", wo der Firmenname Tokenized ist. Ich brauche die Tokenisierung für einen bestimmten Teil meiner Anwendung. Aber für diese Abfrage muss ich eine PrefixQuery über das gesamte Firmenfeld erstellen können.Machen Sie Lucene behandeln alle Begriffe in einem Feld als ein einziges Wort

Beispiel:

  • Meine Marke
    • meine
    • Marke
  • Brahmane Bauernhof
    • Brahmane
    • Farm

regelmäßig für „bra“ Abfrage würde beiden Dokumente zurückgeben, da sie beide einen Begriff, beginnend mit BH haben.
Das Ergebnis, das ich möchte, würde jedoch nur den letzten Eintrag zurückgeben, da der erste Ausdruck mit BH beginnt.

Irgendwelche Vorschläge?

Antwort

0

Verwenden Sie eine SpanQuery, um nur die erste Termposition zu suchen. Ein PrefixQuery von SpanMultiTermQueryWrapper von SpanPositionRangeQuery gewickelt:

<SpanPositionRangeQuery: spanPosRange(SpanMultiTermQueryWrapper(company:bra*), 0, 1)> 
1

Erstellen Sie ein anderes indiziertes Feld, wobei der Firmenname nicht Tokenized ist. Suchen Sie bei Bedarf nach diesem Feld und nicht nach dem Feld mit dem Namen in Token.


Wenn Sie schnelle Suchvorgänge wünschen, benötigen Sie Indexeinträge, die direkt auf die gewünschten Datensätze zeigen. Es kann etwas geben, das Sie mit den Näherungsdaten zum Filtern von Datensätzen tun können, aber es wird langsam sein. Ich sehe das Problem als: Wie kann eine "contains" -Abfrage über ein komplettes Feld effizient durchgeführt werden?

Sie können möglicherweise die Erhöhung der Indexgröße minimieren, indem Sie (für jedes aktuelle Feld) ein Feld für den ersten Ausdruck und das Feld für die verbleibenden Terme erstellen. Dies würde Doppelungen des ersten Begriffs in zwei Bereichen vermeiden. Bei "normalen" Abfragen suchen Sie nach Abfragebegriffen in einem dieser Felder. Bei "startswith" -Abfragen suchen Sie nur das Feld "first term". Aber das scheint mehr Mühe als es wert ist.

+0

Dies wäre eine Lösung, sondern würde auch meinen Index sehr viel erhöhen. Ich müsste alle meine Felder auf diese Weise (etwa 15) für 2500K + Datensätze duplizieren. Ich hatte gehofft, einen Weg zu finden, einfach einen Start mit einem kompletten Feld zu machen –

Verwandte Themen