如何让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 results = solr.Query() )的所有标准管道代码都需要映射的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的一部分然后进行结果解析。