2016-12-15 2 views
0

Ich habe eine Requirment, wo ich eine Teilzeichenfolge in einer Abfrage übereinstimmen müssen. beispiel, wenn das Feld hat den Wert:Teilstring-Übereinstimmung in Solr-Abfrage

PREFIXabcSUFFIX

Ich habe eine Abfrage erstellen, die abc übereinstimmt. Ich kenne immer die Länge des Präfixes.

Ich kann nicht EdgeNgram und Ngram wegen der räumlichen Gegebenheiten nutzen. (Da sie mehrere Indizes schaffen.)

Also muss ich das auf die Abfragezeit tun und nicht auf Index Zeit. Die Verwendung eines Platzhalters als Präfix, wie etwa *abc*, wird sich stark auf die Leistung auswirken.

Da ich die Länge des Präfixes kenne, hoffe ich, etwas zu haben, wo ich etwas tun kann wie wo Punkte die genaue Länge des Präfix darstellt, so dass die Abfrage nicht so schlecht ist wie die Suche nach dem ganzen Index wie im Fall der Wildcard-Abfrage (*abc*).

Ist das in solr möglich? Vielen Dank für Ihre Zeit .

Solr-Version: 4.10

Antwort

3

Sicher, Wildcard-Syntax ist documented here, Sie so etwas wie ????abc* suchen könnte. Sie können auch eine Regex-Abfrage verwenden.

Allerdings wird der Leistungsvorteil von diesem über *abc* sehr klein sein. Es muss weiterhin eine sequentielle Suche über den gesamten Index durchführen. Aber wenn es keine Möglichkeit gibt, Ihre Analyse zu verbessern, um Ihre Suchanforderungen zu erfüllen, kann es dazu kommen (GIGO).

1

Sie könnten dafür the RegularExpressionPatternTokenizer verwenden. Für das folgende Beispiel habe ich geschätzt, dass die Länge Ihres Präfixes 6 ist. Ihr Beispieltext PREFIXabcSUFFIX würde abcSUFFIX werden. Auf diese Weise können abc*

<analyzer> 
    <tokenizer class="solr.PatternTokenizerFactory" pattern=".{6}(.+)" group="1"/> 
</analyzer> 

Über den Tokenizer für die Suche kann:

Diese tokenizer verwendet eine Java regulären Ausdruck des Eingangstextstrom in Token zu brechen. Der durch das Musterargument bereitgestellte Ausdruck kann entweder als Trennzeichen interpretiert werden, das Token trennt, oder als Muster, die aus dem Text als Token extrahiert werden sollen.