2017-05-21 3 views
0

Ich versuche, die LIKE-Funktionalität von SQL in Lucene zu replizieren.LIKE Funktionalität für Satz in Lucene

Wenn ich die Platzhalter Suche mit, sagen Sie "* Tulpen Inn Riyadhh *" Ich bin vor mit folgendem Verhalten:

  1. Tulpen Inn Riyadh - Passende
  2. Tulpen Inn Riyadhhhss - Passende
  3. Nicht
  4. Tulpen Inn Riyadh HHSS - Passende
  5. Tulpen -
  6. Riyadhh passend -
01 passend

Eigentlich brauche ich ein Beispiel in Lucene, wo die Bedingung "2" übereinstimmen sollte und "4" nicht übereinstimmen sollte.

Ich habe versucht mit allen Abfragen, aber das zweite Szenario ist nicht übereinstimmend.

Einige Leute rieten zur Verwendung des Tokenizers und benutzerdefinierten Analysators.

Da ich Lucene neu bin, habe ich mit Abfragen gearbeitet, weiß aber nicht, wie Tokenizer und Custom Analyzer in unsere Abfragen integriert werden sollen.

+0

Wenn Sie in Ihrem Post die Analysekette der Felder einfügen, die in Ihrer Suche enthalten sind, werden alle Parameter, die in den von Ihnen ausprobierten Abfragen verwendet wurden, und die Version von Solr, die Sie verwenden, sehr hilfreich sein. – freedev

Antwort

0

Wenn Sie nur will Abgleich von Präfixen Sie eine KeywordTokenizer mit einem LowercaseFilter verwenden können und einen EdgeNgramFilter:

<analyzer> 
    <tokenizer class="solr.KeywordTokenizerFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="4" maxGramSize="50"/> 
</analyzer> 

Diese Kette wird den eingehenden Text als einzelnes Token (KeywordTokenizer) hält, dann wandeln die ankommender Text in Kleinbuchstaben (LowerCaseFilter), bevor er basierend auf der Zeichenfolgenlänge in mehrere Tokens aufgeteilt wird.

Wenn Sie irgendwo in einem String zu wollen, können Sie eine einfache ngramfilter verwenden:

<filter class="solr.NGramFilterFactory" minGramSize="1" maxGramSize="4"/> 

.. aber bewusst sein, dass die Größe des Index schnell wachsen wird, wenn die Differenz zwischen min und max groß.

Es gibt auch eine zweite Option, die den ReversedWildcardFilter verwendet, der speziell auf die Abfragebedingung *foo* abgestimmt ist, also wenn Sie keine weitere Verarbeitung jedes Tokens benötigen (wie das Stemmen jedes einzelnen Token usw.) das könnte eine Option sein.