2016-06-22 20 views
2

Ich habe folgendes Problem: Ich habe einen Solr-Kern mit mehreren Indizes. Ich habe zum Beispiel drei verschiedene Suchtypen auf meiner Website:Solr: mehrere Suggester für bestimmte Autovervollständigung

  1. Autos
  2. dvds
  3. alle Elemente (Autos, DVDs und vielleicht auch andere Artikel)

Ich habe Autosuggest für Nr.3 . 1 und 2 haben bisher keinen suggester. Aber ich möchte einen zusätzlichen suggester für Autos implementieren, so dass, wenn ich nur in Autos suchen möchte, suggester mir Wörter zeigen wird, die nur Autos und nicht zu dvds usw. gehören. Ich habe über neue Anfrage gedachtHandler und ausführende Suche, weil Ich brauche für diese zwei spezifischen Felder, um Vorschläge zu füllen, wo Nr.3 Suche automatisch durch Wörterbuch gefüllt wird. Ist es möglich, zwei oder mehr verschiedene Suggester in einem Solr Core zu haben? Und wie kann ich bestimmte Felder für einen bestimmten Suchtyp für Autocomplete und Vorschläge verwenden, so dass nur Autos in diesen Vorschlägen aufgeführt sind?

Vielen Dank im Voraus!

Antwort

3

Sicher, das kann getan werden. einrichten nur zwei Suchkomponenten etwas wie folgt aus:

<searchComponent name="suggest" class="solr.SuggestComponent"> 
    <lst name="suggester"> 
     <str name="name">suggest_cars</str> 
     <str name="lookupImpl">BlendedInfixLookupFactory</str> 
     <str name="blenderType">linear</str> 
     <str name="dictionaryimpl">DocumentDictionaryFactory</str> 
     <str name="field">cars_suggest</str> 
     <str name="weightField">popularity</str> 
     <str name="suggestAnalyzerFieldType">text_suggest</str> 
     <str name="queryAnalyzerFieldType">phrase_suggest</str> 
     <str name="indexPath">cars_suggest</str> 
     <str name="buildOnStartup">false</str> 
     <str name="buildOnCommit">false</str> 
     <bool name="exactMatchFirst">true</bool> 
    </lst> 
    <lst name="suggester"> 
     <str name="name">suggest_all</str> 
     <str name="lookupImpl">BlendedInfixLookupFactory</str> 
     <str name="blenderType">linear</str> 
     <str name="dictionaryimpl">DocumentDictionaryFactory</str> 
     <str name="field">suggest</str> 
     <str name="weightField">popularity</str> 
     <str name="suggestAnalyzerFieldType">text_suggest</str> 
     <str name="queryAnalyzerFieldType">phrase_suggest</str> 
     <str name="indexPath">all_suggest</str> 
     <str name="buildOnStartup">false</str> 
     <str name="buildOnCommit">false</str> 
     <bool name="exactMatchFirst">true</bool> 
    </lst> 

dann einen Request-Handler erstellen:

<requestHandler name="/suggest" class="solr.SearchHandler" startup="lazy"> 
    <lst name="defaults"> 
     <str name="echoParams">all</str> 
     <str name="wt">json</str> 
     <str name="indent">false</str> 
     <str name="suggest">true</str> 
     <str name="suggest.count">10</str> 
    </lst> 
    <arr name="components"> 
    <str>suggest</str> 
    </arr> 
</requestHandler> 

In der schema.xml Datei, diese beiden Feldtypen:

<fieldType name="phrase_suggest" class="solr.TextField" positionIncrementGap="100"> 
     <analyzer> 
      <tokenizer class="solr.KeywordTokenizerFactory"/> 
      <filter class="solr.LowerCaseFilterFactory"/> 
      <filter class="solr.TrimFilterFactory"/> 
     </analyzer> 
    </fieldType> 

<fieldType name="text_suggest" class="solr.TextField" positionIncrementGap="100"> 
     <analyzer> 
      <tokenizer class="solr.StandardTokenizerFactory"/> 
      <filter class="solr.LowerCaseFilterFactory"/> 
      <filter class="solr.ASCIIFoldingFilterFactory"/> 
      <filter class="solr.EnglishPossessiveFilterFactory"/> 
     </analyzer> 
    </fieldType> 

Und Natürlich benötigen Sie die beiden Felder cars_suggest und all_suggest, die Vorschläge für Autos bzw. Autos/DVDs enthalten, mit Feldtyp phrase_suggest (dh mit einem Stichwort-Tokenizer).

Die Abfrage erfolgt wie folgt:

http://localhost:8983/solr/collection0/suggest?q=peug&suggest.dictionary=suggest_cars 
+0

Das ist genial. Es funktionierte! Vielen Dank James :) Obwohl ich verschiedene Konfigurationen für Wörterbuch und Filter gemacht habe, weil die Ansicht und das Aussehen für mich nicht optimal waren. Aber die Funktionalität tut genau das, was ich brauchte :) – middleendian

+0

danke James, Für alle newbees ist der Haken hier ein anderer Indexpfad für zwei verschiedene Felder, im Datenverzeichnis werden Ordner mit dem gleichen Namen angelegt, egal was gegen indexpath.if angegeben wird verwendet dann für die zweite Komponente solr wird nicht die erforderlichen Dateien bcz von write.lock erstellen –