2013-01-07 15 views
5

Skonfigurowałem mój plik solrconfig.xml i schema.xml, aby uzyskać zapytanie o sugestie.Jak uzyskać komponent Suggester pracujący w SolrNet?

jestem w stanie dostać się do sugestii url

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

Moja solrconfig.xml wygląda

curently, Mam kwerendy solr wygląda

<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> 

I moim schema.xml wygląda tak, jak

<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> 

Mój kod do wywołania API SolrNet wygląda jak poniżej

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; 

Jednak ja nie otrzymuję żadnych danych. Liczba wyników wynosi zero. A także sprawdzanie pisowni w wynikach jest również zerowe.

Również nie widzę listy sugestii wewnątrz wyników.

enter image description here

Proszę o pomoc

Odpowiedz

2

Aby wykonać zapytanie przed obsługi /suggest żądanie że masz konfigurację, trzeba będzie ustawić parametr qt Solr używając ExtraParameters w swoim QueryOptions SolrNet jak poniżej:

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; 

Inaczej zapytanie jest jeszcze przed wykonaniem standardowej /select żądanie obsługi (lub cokolwiek masz defi ned jako domyślny w twoim pliku solrconfig.xml).

+0

Wprowadziłem zmiany zgodnie z sugestiami, ale nadal nie otrzymałem wyników. – Prasad

+0

Jakie wartości używasz dla słowa kluczowego i typu w zapytaniu SolrNet? Również uruchomiłeś tę samą kwerendę bezpośrednio z Solr. Z twojego pytania wynika, że ​​używasz 'q = ha', spróbuj dodać zapytanie filtru, aby upewnić się, że działa zgodnie z oczekiwaniami ... Może to być w przypadku, gdy używasz sugestii, której nie chcesz filtrować wyniki zapytania ... –

1

Zobacz http://wiki.apache.org/solr/SolrRequestHandler, w szczególności część dotyczącą starego handleSelect = true behavior. Jeśli korzystasz z nowszego serwera Solr, jest to najprawdopodobniej twój problem. (Tj ustawienie „qt” nie ma żadnego wpływu i albo opiekun domyślne SolrNet musi być zmieniony lub config Solr musi ustawić handleSelect = true). Oto jak rozwiązać ten problem w moim przypadku:

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 
    } 
} 

Zasadniczo użyj parsera SolrNet i kodu połączenia, ale nie zapytań. Mam nadzieję że to pomoże.

5

Miałem dokładnie to samo wymaganie, ale nie mogłem znaleźć żadnego sposobu na łatwe obsłużenie Suggester wyników z SolrNet. Niestety, SolrNet wydaje się być zbudowany wokół domyślnej obsługi żądań /select i obecnie nie obsługuje żadnego innego programu obsługującego, w tym /suggest dla mapowania typów obiektów (T). Oczekuje, że wszystkie odwzorowania wystąpią z indeksowanymi wynikami dokumentu Solr, a nie z wynikami sugestii.

Dlatego @Paige Cook's answer nie działa dla mnie. T Typ z odwzorowaniami nie jest zgodny z odpowiedzią na sugestie. Cały standardowy kod instalacyjny od zainicjowania zapytania (Startup.Init<T>()) do zapytania (ISolrQueryResults<T> results = solr.Query()) wymaga zmapowanego typu dokumentu Solr, a nie prostego zestawu łańcuchów, które udostępnia sugestia.

W związku z tym (podobnie jak w przypadku @dfay) poszedłem z zapytaniem sieciowym i przeanalizowałem sugerowane wyniki z odpowiedzi sieciowej XML. Klasa SolrConnection użyto do tego:

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 

Alternatywnie, zamiast XML, wniosek może zwrócić odpowiedź JSON za pomocą parametru wt=json:

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

przekazując parametr qt NIE działa, przynajmniej nie w Solr 4.7, nawet przy handleSelect = true w SolrConfig. Możesz zweryfikować, określając niestandardowy moduł obsługi, który jest bardzo różny od domyślnego/select, np. Użyj swojego edismax i wyślij debugQuery = true w ExtraParams i złap wyniki w Fiddler.

Również, jeśli przeczytałeś objaśnienie flagi handleSelect, to znaczy "jeśli żądanie używa"/select ", ale nie ma obsługi zlecenia o tej nazwie".

Nie należy dotykać ani wyłączać procedury obsługi/wyboru, ponieważ Solr sam jej używa.

Skończyło się na tym, że używałem ExtraParams do przekazania wszystkich wartości, które zdefiniowałem w moim niestandardowym programie obsługi, nie było ich zbyt wiele. Wydawało się lepsze niż użycie części SolrNET, a następnie wykonanie analizy wyniku.

Powiązane problemy