c# - ¿Cómo funciona el componente sugerente en SolrNet?
.net (4)
Configuré mi solrconfig.xml y schema.xml para consultar las sugerencias.
Puedo obtener las sugerencias de la url
http://localhost:8080/solr/collection1/suggest?q=ha&wt=xml
Mi SolrConfig.xml parece
Curamente, mi consulta Solr parece
<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>
Y mi schema.xml se parece a esto
<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>
Mi código para llamar a la API SolrNet se ve a continuación
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;
Sin embargo, no obtengo ningún dato. el recuento de resultados es cero. Y también el corrector ortográfico en los resultados también es cero.
Tampoco veo la lista de sugerencias dentro de los resultados.
Por favor ayuda
Para ejecutar su consulta contra el manejador de solicitudes /suggest
que ha configurado, necesitará establecer el parámetro qt
Solr usando los parámetros ExtraParameters en SolrNet QueryOptions como se muestra a continuación:
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;
De lo contrario, su consulta se sigue ejecutando contra el controlador de solicitud estándar /select
(o lo que sea que haya definido como predeterminado en su solrconfig.xml).
Ver http://wiki.apache.org/solr/SolrRequestHandler , particularmente la sección sobre el antiguo handleSelect = verdadero comportamiento. Si se está ejecutando contra un servidor Solr más nuevo, este es probablemente su problema. (es decir, establecer "qt" no tiene ningún efecto y el controlador predeterminado en SolrNet debe cambiarse o la configuración de Solr necesita establecer handleSelect = true.) Así es como resolví este problema en mi caso:
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
}
}
Básicamente utilizo el analizador SolrNet y el código de conexión, pero no el material de consulta. Espero que esto ayude.
Pasar el parámetro qt NO funciona, al menos no en Solr 4.7 incluso con handleSelect = true en SolrConfig. Puede verificar especificando un controlador personalizado que sea muy diferente del predeterminado / select, por ejemplo, haga que el suyo use edismax y envíe debugQuery = true en ExtraParams y capture los resultados en Fiddler.
Además, si lee la explicación en el indicador handleSelect, indica "si la solicitud utiliza" / select "pero no hay ningún manejador de solicitudes con ese nombre".
No desea tocar ni deshabilitar el controlador / select porque Solr lo usa él mismo.
Terminé usando ExtraParams para pasar todos los valores que definí en mi controlador personalizado, no había tantos. Parecía mejor que simplemente usar parte de SolrNET y luego hacer el análisis de resultados.
Tenía exactamente el mismo requisito, pero no pude encontrar ninguna forma de manejar fácilmente los resultados de Suggester con SolrNet. Desafortunadamente, SolrNet parece estar construido alrededor del controlador de solicitud predeterminado /select
selectivo y actualmente no admite ningún otro controlador que incluya /suggest
para asignaciones de tipo de objeto ( T
). Espera que todas las asignaciones ocurran con los resultados del documento Solr indexado y no con los resultados sugeridos.
Por lo tanto, la respuesta de @Paige Cook no funcionó para mí. T
tipo T
con asignaciones no es compatible con una respuesta de resultados sugerente. Todo el código de plomería estándar desde la inicialización de la solicitud ( Startup.Init<T>()
) a la consulta ( ISolrQueryResults<T> results = solr.Query()
) necesita un tipo de documento de Solr mapeado y no una simple matriz de cadenas que el sugerente proporciona.
Por lo tanto, (similar a @dfay ) hice una solicitud web y analicé los resultados sugeridos de la respuesta web XML. La clase SolrConnection
se usó para esto:
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
Alternativamente, en lugar de XML, la solicitud puede devolver una respuesta JSON utilizando el parámetro wt=json
:
var parameters = new Dictionary<string, string>
{
{"q", searchTerm},
{"wt", "json"}, // change this!
};
// then use your favorite JSON parser