如何让SolrNet中的建议器组件工作?
我已经配置了solrconfig.xml和schema.xml来查询建议。
我能从url获得建议
http://localhost:8080/solr/collection1/suggest?q=ha&wt=xml
我的SolrConfig.xml看起来像
当然,我的solr查询看起来像
uid .....
我的schema.xml看起来像这样
suggest name org.apache.solr.spelling.suggest.Suggester org.apache.solr.spelling.suggest.tst.TSTLookup true internal 0.5 2 int name="minPrefix">1 5 4 0.01 .01 wordbreak solr.WordBreakSolrSpellChecker name true true 10 text true suggest <!--wordbreak--> on true 10 5 5 true true 10 5 spellcheck
我调用SolrNet API的代码如下所示
new SolrBaseRepository.Instance().Start(); var solr = ServiceLocator.Current.GetInstance<ISolrOperations>(); var options = new QueryOptions { FilterQueries = new ISolrQuery[] { new SolrQueryByField("type", type) } }; var results = solr.Query(keyword, options); return results;
但是,我没有得到任何数据。 结果计数为零。 而且结果中的拼写检查也是零。
我也没有在结果中看到建议清单。
请帮忙
我有完全相同的要求,但找不到任何方法可以轻松处理SolrNet的建议结果。 不幸的是,SolrNet似乎是围绕默认/select
请求处理程序构建的,目前不支持任何其他处理程序,包括/suggest
对象类型映射( T
)。 它希望所有映射都与索引的Solr文档结果一起发生,而不是建议结果。
因此, @ Paige Cook的回答对我不起作用。 具有映射的T
类型与建议者结果响应不兼容。 从初始化请求( Startup.Init
)到查询( ISolrQueryResults
)的所有标准管道代码都需要映射的Solr文档类型,而不是提示符的简单字符串数组提供。
因此,(类似于@dfay )我提出了一个Web请求,并从XML Web响应中解析出建议的结果。 SolrConnection
类用于此:
string searchTerm = "ha"; string solrUrl = "http://localhost:8080/solr/collection1"; string relativeUrl = "/suggest"; var parameters = new Dictionary { {"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
或者,请求可以使用wt=json
参数返回JSON响应,而不是XML:
var parameters = new Dictionary { {"q", searchTerm}, {"wt", "json"}, // change this! }; // then use your favorite JSON parser
为了对您设置的/suggest
请求处理程序执行查询,您需要使用SolrNet QueryOptions中的ExtraParameters设置qt
Solr参数,如下所示:
new SolrBaseRepository.Instance().Start(); var solr = ServiceLocator.Current.GetInstance>(); var options = new QueryOptions { FilterQueries = new ISolrQuery[] { new SolrQueryByField("type", type) }, ExtraParams = new Dictionary{{"qt", "suggest"}}, }; var results = solr.Query(keyword, options); return results;
否则,您的查询仍在针对标准/select
请求处理程序(或您在solrconfig.xml中定义为默认值的任何内容)执行。
请参阅http://wiki.apache.org/solr/SolrRequestHandler ,特别是有关旧handleSelect = true行为的部分。 如果您针对较新的Solr服务器运行,这很可能是您的问题。 (即设置“qt”无效,并且必须更改SolrNet中的默认处理程序或Solr配置需要设置handleSelect = true。)以下是我在以下情况中解决此问题的方法:
ISolrConnection connection = ServiceLocator.Current.GetInstance(); List> termsParams = new List>(); termsParams.Add(new KeyValuePair("terms.fl", "name")); termsParams.Add(new KeyValuePair("terms.prefix", mySearchString)); termsParams.Add(new KeyValuePair("terms.sort", "count")); string xml = connection.Get("/terms", termsParams); ISolrAbstractResponseParser parser = ServiceLocator.Current.GetInstance>(); SolrQueryResults results = new SolrQueryResults (); parser.Parse(System.Xml.Linq.XDocument.Parse(xml), results); TermsResults termResults = results.Terms; foreach (TermsResult result in termResults) { foreach (KeyValuePair kvp in result.Terms) { //... do something with keys } }
基本上我使用SolrNet解析器和连接代码,但不使用查询。 希望这可以帮助。
传递qt参数不起作用,至少在Solr 4.7中不行,即使在SolrConfig中使用handleSelect = true也是如此。 您可以通过指定与默认/ select非常不同的自定义处理程序进行validation,例如make makers使用edismax并在ExtraParams中发送debugQuery = true并在Fiddler中捕获结果。
另外,如果你阅读handleSelect标志的说明,它会说“如果请求使用”/ select“但是没有该名称的请求处理程序”。
您不想触摸或禁用/ select处理程序,因为Solr自己使用它。
我最终使用ExtraParams来传递我在自定义处理程序中定义的所有值,但没有那么多。 看起来不仅仅是使用SolrNET的一部分然后进行结果解析。