2016-10-07 2 views
0

Wenn ich richtig verstehe, stempelt SynonymFilterFactory Synonyme in keiner Weise. Insofern müsste man mit Pluralformen und Zeitformen in ihrer Synonymdatei ziemlich erschöpfend sein, wenn sie ungeachtet der Pluralisierung/Spannung eine gute Erinnerung haben wollen.SOLR: SynonymFilterFactory mit stemming

Ich sehe, dass die SynonymFilterFactory hat ein optionales Argument, wo es einen Analysator akzeptieren kann.

Analysator: (optional; Standard: WhitespaceTokenizerFactory) Der Name der Analysatorklasse, die beim Analysieren der Synonymdatei verwendet werden soll. Wenn der Analysator angegeben wird, ist TokenizerFactory möglicherweise nicht vorhanden und umgekehrt.

Ich bezweifle, dass wie so den gewünschten Analysator nisten gilt:

<analyzer type="query"> 
    <tokenizer class="solr.WhitespaceTokenizerFactory" /> 
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" /> 
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" /> 
    <filter class="solr.LowerCaseFilterFactory" /> 
    <filter class="solr.SnowballPorterFilterFactory" /> 
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true" > 
     <analyzer> 
      <tokenizer class="solr.WhitespaceTokenizerFactory" /> 
      <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" /> 
      <filter class="solr.LowerCaseFilterFactory" /> 
      <filter class="solr.SnowballPorterFilterFactory" /> 
      <filter class="solr.RemoveDuplicatesTokenFilterFactory" /> 
     </analyzer> 
    </filter> 
    <filter class="solr.RemoveDuplicatesTokenFilterFactory" /> 
</analyzer> 

Ich vermute, dass eine Erweiterung Analysator Kompilieren .jar und es in SOLR lib Ordnern ablegen könnte der einzige Weg, dies zu tun. Gibt es eine Möglichkeit, einen benannten Analysator in der Konfiguration zu definieren, oder eine andere Methode, um dieses Ziel zu erreichen?

Antwort

0

Dies beantwortet nicht meine ursprüngliche Frage (wie man dies nur über die Konfiguration tut), aber ist die Lösung, die ich für den Fall verwendet habe, dass jemand anderes es tun möchte.

Zuerst wird ein kundenspezifische Analysator, der verwendet wird, um die Synonyme kommt aus dem Synonym Filter vorzuverarbeiten (am wichtigsten ist, ergibt sie mit Schneeballeffekt):

public class SnowballAnalyzer extends Analyzer { 
    /** 
    * Creates a 
    * {@link org.apache.lucene.analysis.Analyzer.TokenStreamComponents} which 
    * tokenizes text when given a reader. 
    * 
    * @return A 
    *   {@link org.apache.lucene.analysis.Analyzer.TokenStreamComponents} 
    *   built from an {@link WhitespaceTokenizer} filtered with 
    *   {@link LowerCaseFilter} and English {@link SnowballFilter}. 
    */ 
    @Override 
    protected TokenStreamComponents createComponents(String fieldName) { 
     Tokenizer source = new WhitespaceTokenizer(); 
     TokenStream filter = new LowerCaseFilter(source); 
     filter = new SnowballFilter(filter, "English"); 
     return new TokenStreamComponents(source, filter); 
    } 

} 

Diese als .jar- extrahiert wird, und bereitgestellt in Ihrem SOLR home's lib-Verzeichnis. Als nächstes stellen Sie sicher, SOLR zu sagen, diesen Analysator in Ihren Synonym-Filter zu verwenden (in der Regel in schema.xml oder Managed-Schema):

<fieldType name="stemmedText" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/> 
     <filter class="solr.WordDelimiterFilterFactory" catenateNumbers="1" generateNumberParts="1" generateWordParts="1" catenateAll="0" catenateWords="1"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.SnowballPorterFilterFactory"/> 
     <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
    </analyzer> 
    <analyzer type="query"> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/> 
     <filter class="solr.WordDelimiterFilterFactory" catenateNumbers="0" generateNumberParts="1" generateWordParts="1" catenateAll="0" catenateWords="0"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.SnowballPorterFilterFactory"/> 
     <filter class="solr.SynonymFilterFactory" expand="true" analyzer="your.package.SnowballAnalyzer" ignoreCase="true" synonyms="synonyms.txt"/> 
     <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
    </analyzer> 
</fieldType> 

Und schließlich auf die oben genannte Art mit, was auch immer Sie wollen Felder:

In diesem Beispiel werden die Schlüsselwörterfelder der Dokumente im Index verankert. Wenn eine Abfrage für dieses Feld ausgeführt wird, wird der Begriff "" und dann "" verwendet, um Synonyme (die bereits vom benutzerdefinierten Analysator vorgestempelt wurden) zu suchen. Das Ergebnis ist, dass eine Synonymdatei, die eine "unvollständige" Synonymliste (Pluralformen, Zeitformen) enthält, eine viel höhere Wahrscheinlichkeit hat, eine Übereinstimmung zu erhalten.

Konkretes Beispiel

Synonym Dateieintrag: [Hund, Hündchen, Hunde, Hundeartige, canid, Welpen, Welpen, Welpen]

Suchbegriff: Welpen (beachten Sie, dass es nicht in der Synonymliste ist)

Parsierte Abfrage: SynonymQuery (Synonym (Schlüsselwörter: canid Schlüsselwörter: Hund Schlüsselwörter: doggi Schlüsselwörter: pup Schlüsselwörter: puppi))