2013-01-07 11 views
5

Ich habe meine Dateien solrconfig.xml und schema.xml konfiguriert, um die Vorschläge abzufragen.Wie wird die Suggester-Komponente in SolrNet eingesetzt?

Ich bin in der Lage, die Vorschläge aus der URL

http://localhost:8080/solr/collection1/suggest?q=ha&wt=xml 

Mein SolrConfig.xml zu erhalten sieht aus wie

Curently sieht Meine solr Abfrage wie

<fields> 
    <!-- declare fields of entity class --> 
    <!-- type will specify the table name --> 
    <field name="type" type="string" indexed="true" stored="true" /> 

    <field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" /> 
    <field name="name" type="text_general" indexed="true" stored="true" omitNorms="true"/> 

    <field name="text" type="text_general" indexed="true" stored="false" multiValued="true"/> 
    <field name="_version_" type="long" indexed="true" stored="true"/> 

    <!-- unique field --> 
    <field name="uid" type="uuid" indexed="true" stored="true" /> 

    </fields> 

    <uniqueKey>uid</uniqueKey> 

    <copyField source="name" dest="text"/> 

    <types> 
    <fieldType name="uuid" class="solr.UUIDField" indexed="true" /> 
    <fieldType name="string" class="solr.StrField" sortMissingLast="true" /> 
    <fieldType name="boolean" class="solr.BoolField" sortMissingLast="true"/> 

    <fieldType name="int" class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0"/> 
    ..... 
    </types> 

Und mein schema.xml sieht so aus

<searchComponent name="suggest" class="solr.SpellCheckComponent"> 
    <!-- a spellchecker built from a field of the main index --> 
    <lst name="spellchecker"> 
     <str name="name">suggest</str> 
     <str name="field">name</str> 
     <str name="classname">org.apache.solr.spelling.suggest.Suggester</str> 
     <str name="lookupImpl">org.apache.solr.spelling.suggest.tst.TSTLookup</str> 
     <str name="buildOnCommit">true</str>   
     <str name="distanceMeasure">internal</str> 
     <float name="accuracy">0.5</float> 
     <int name="maxEdits">2</int> 
     int name="minPrefix">1</int> 
     <int name="maxInspections">5</int> 
     <int name="minQueryLength">4</int> 
     <float name="maxQueryFrequency">0.01</float> 
     <float name="thresholdTokenFrequency">.01</float>  
    </lst> 

    <!-- a spellchecker that can break or combine words. See "/spell" handler below for usage --> 
    <lst name="spellchecker"> 
     <str name="name">wordbreak</str> 
     <str name="classname">solr.WordBreakSolrSpellChecker</str> 
     <str name="field">name</str> 
     <str name="combineWords">true</str> 
     <str name="breakWords">true</str> 
     <int name="maxChanges">10</int> 
    </lst> 
</searchComponent> 

<requestHandler name="/suggest" class="solr.SearchHandler" startup="lazy"> 
    <lst name="defaults"> 
     <str name="df">text</str> 
     <!-- Solr will use suggestions from both the 'default' spellchecker 
      and from the 'wordbreak' spellchecker and combine them. 
      collations (re-written queries) can include a combination of 
      corrections from both spellcheckers --> 
     <str name="spellcheck">true</str> 
     <str name="spellcheck.dictionary">suggest</str> 
     <!--<str name="spellcheck.dictionary">wordbreak</str>--> 
     <str name="spellcheck">on</str> 
     <str name="spellcheck.extendedResults">true</str>  
     <str name="spellcheck.count">10</str> 
     <str name="spellcheck.alternativeTermCount">5</str> 
     <str name="spellcheck.maxResultsForSuggest">5</str>  
     <str name="spellcheck.collate">true</str> 
     <str name="spellcheck.collateExtendedResults">true</str> 
     <str name="spellcheck.maxCollationTries">10</str> 
     <str name="spellcheck.maxCollations">5</str>   
    </lst> 
    <arr name="last-components"> 
     <str>spellcheck</str> 
    </arr> 
    </requestHandler> 
Jedoch 210

Mein Code der SolrNet API aufrufen sieht wie unten

new SolrBaseRepository.Instance<T>().Start(); 
     var solr = ServiceLocator.Current.GetInstance<ISolrOperations<T>>(); 
     var options = new QueryOptions 
     { 
      FilterQueries = new ISolrQuery[] { new SolrQueryByField("type", type) } 
     }; 
     var results = solr.Query(keyword, options); 
     return results; 

, ich bin keine Daten zu bekommen. Ergebnisse zählen ist Null. Und auch die Rechtschreibprüfung in den Ergebnissen ist gleich null.

Ich sehe auch nicht die Vorschlagsliste in den Ergebnissen.

enter image description here

Bitte helfen

Antwort

2

Um Ihre Abfrage für die /suggest-Request-Handler auszuführen, die Sie eingerichtet haben, müssen Sie den qt Solr Parameter mit den ExtraParameters in Ihrem SolrNet QueryOptions wie unten setzen:

new SolrBaseRepository.Instance<T>().Start(); 
var solr = ServiceLocator.Current.GetInstance<ISolrOperations<T>>(); 
var options = new QueryOptions 
{ 
    FilterQueries = new ISolrQuery[] { new SolrQueryByField("type", type) }, 
    ExtraParams = new Dictionary<string, string>{{"qt", "suggest"}}, 
}; 
var results = solr.Query(keyword, options); 
return results; 

Ansonsten Ihre Anfrage noch gegen die Standard /select-Request-Handler ausgeführt wird (oder was auch immer Sie defi haben als Standard in Ihrer solrconfig.xml).

+0

Ich habe wie vorgeschlagen Änderungen vorgenommen, bekomme aber immer noch keine Ergebnisse – Prasad

+0

Welche Werte verwenden Sie für das Schlüsselwort und den Typ in Ihrer SolrNet-Abfrage? Außerdem haben Sie dieselbe Abfrage direkt gegen Solr ausgeführt. Ich sehe aus Ihrer Frage, dass Sie eine mit 'q = ha 'ausführen. Versuchen Sie, die Filterabfrage hinzuzufügen, um sicherzustellen, dass sie wie erwartet funktioniert ... Das könnte der Fall sein, wenn Sie den Suggester verwenden, den Sie nicht filtern möchten die Abfrageergebnisse ... –

1

Siehe http://wiki.apache.org/solr/SolrRequestHandler, insbesondere der Abschnitt über das alte handleSelect = True-Verhalten. Wenn Sie gegen einen neueren Solr-Server laufen, ist dies wahrscheinlich Ihr Problem. (Dh Einstellung „qt“ hat keine Auswirkung und entweder der Handler Standard in SolrNet muss geändert werden oder die Solr Config muss gesetzt handleSelect = true.) Hier ist, wie ich dieses Problem in meinem Fall gelöst:

ISolrConnection connection = ServiceLocator.Current.GetInstance<ISolrConnection>(); 
List<KeyValuePair<string, string>> termsParams = new List<KeyValuePair<string, string>>(); 
termsParams.Add(new KeyValuePair<string, string>("terms.fl", "name")); 
termsParams.Add(new KeyValuePair<string, string>("terms.prefix", mySearchString)); 
termsParams.Add(new KeyValuePair<string, string>("terms.sort", "count")); 
string xml = connection.Get("/terms", termsParams); 

ISolrAbstractResponseParser<Document> parser = ServiceLocator.Current.GetInstance<ISolrAbstractResponseParser<Document>>(); 
SolrQueryResults<Document> results = new SolrQueryResults<Document>(); 
parser.Parse(System.Xml.Linq.XDocument.Parse(xml), results); 

TermsResults termResults = results.Terms; 
foreach (TermsResult result in termResults) 
{ 
    foreach (KeyValuePair<string, int> kvp in result.Terms) 
    { 
     //... do something with keys 
    } 
} 

Grundsätzlich I Verwenden Sie den SolrNet-Parser und den Verbindungscode, aber nicht den Abfragesatz. Hoffe das hilft.

5

Ich hatte die exakt gleiche Anforderung, konnte aber keinen Weg finden, Suggester Ergebnisse mit SolrNet leicht zu handhaben. Unglücklicherweise scheint SolrNet um den Standard-Request-Handler /select herum aufgebaut zu sein und unterstützt derzeit keinen anderen Handler, einschließlich /suggest für Objekttypzuordnungen (T). Es erwartet, dass alle Zuordnungen mit indizierten Solr-Dokument-Ergebnissen und nicht mit Sugger-Ergebnissen erfolgen.

Daher funktionierte @Paige Cook's answer nicht für mich. T Typ mit Zuordnungen ist nicht kompatibel mit einer Antwortergebnisantwort. Der gesamte Standard-Installationscode von der Initialisierung der Anforderung (Startup.Init<T>()) bis zur Abfrage (ISolrQueryResults<T> results = solr.Query()) benötigt einen zugeordneten Solr-Dokumenttyp und nicht ein einfaches Array von Strings, das der Suggester bereitstellt.

Daher (ähnlich wie @dfay) ging ich mit dem Erstellen einer Web-Anfrage und Parsing die vorgeschlagenen Ergebnisse aus der XML-Web-Antwort. Die SolrConnection Klasse wurde dafür verwendet:

string searchTerm = "ha"; 
string solrUrl = "http://localhost:8080/solr/collection1"; 
string relativeUrl = "/suggest"; 
var parameters = new Dictionary<string, string> 
                { 
                    {"q", searchTerm}, 
                    {"wt", "xml"}, 
                }; 

var solrConnection = new SolrConnection(solrUrl); 
string response = solrConnection.Get(relativeUrl, parameters); 
// then use your favorite XML parser to extract 
// suggestions from the reponse string 

Alternativ kann anstelle von XML, kann die Anforderung eine JSON Antwort zurückgeben den wt=json Parameter verwendet:

var parameters = new Dictionary<string, string> 
                { 
                    {"q", searchTerm}, 
                    {"wt", "json"}, // change this! 
                }; 
// then use your favorite JSON parser 
0

den qt Parameter Passing nicht funktioniert, zumindest nicht in Solr 4.7 sogar mit handleSelect = true in SolrConfig. Sie können dies überprüfen, indem Sie einen benutzerdefinierten Handler angeben, der dem Standard/select sehr ähnlich ist, sagen Sie, dass Sie edismax verwenden und debugQuery = true in ExtraParams senden und die Ergebnisse in Fiddler abfangen.

Auch wenn Sie die Erklärung auf dem handleSelect-Flag lesen, heißt es "wenn die Anfrage verwendet"/select ", aber es gibt keine Anfrage-Handler mit diesem Namen".

Sie möchten den/select-Handler nicht berühren oder deaktivieren, da Solr ihn selbst verwendet.

Ich endete mit ExtraParams, um alle Werte zu übergeben, die ich in meinem benutzerdefinierten Handler definierte, gab es nicht so viele. Es schien besser, als nur einen Teil von SolrNET zu verwenden und dann das Ergebnis zu parsen.