C# 如何让suggester组件在SolrNet中工作?
我已经配置了solrconfig.xml和schema.xml来查询建议 我可以从网址上得到建议C# 如何让suggester组件在SolrNet中工作?,c#,.net,solr,solrnet,C#,.net,Solr,Solrnet,我已经配置了solrconfig.xml和schema.xml来查询建议 我可以从网址上得到建议 http://localhost:8080/solr/collection1/suggest?q=ha&wt=xml 我的SolrConfig.xml看起来像 现在,我的solr查询看起来像 <fields> <!-- declare fields of entity class --> <!-- type will specify the t
http://localhost:8080/solr/collection1/suggest?q=ha&wt=xml
我的SolrConfig.xml看起来像
现在,我的solr查询看起来像
<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>
液体
.....
我的schema.xml如下所示
<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>
建议
名称
org.apache.solr.spelling.Suggester
org.apache.solr.spelling.suggest.tst.TSTLookup
真的
内部的
0.5
2.
int name=“minPrefix”>1
5.
4.
0.01
.01
断字
solr.WordBreakSolrSpellChecker
名称
真的
真的
10
文本
真的
建议
在…上
真的
10
5.
5.
真的
真的
10
5.
拼写检查
我调用SolrNet API的代码如下所示
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;
new SolrBaseRepository.Instance().Start();
var solr=ServiceLocator.Current.GetInstance();
变量选项=新查询选项
{
FilterQueries=new-ISolrQuery[]{new-SolrQueryField(“type”,type)}
};
var results=solr.Query(关键字、选项);
返回结果;
然而,我没有得到任何数据。
结果计数为零。而且结果中的拼写检查也是零
我也没有看到结果中的建议列表
请提供帮助为了对已设置的
/suggest
请求处理程序执行查询,您需要使用SolrNet查询选项中的ExtraParameters设置qt
Solr参数,如下所示:
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;
new SolrBaseRepository.Instance().Start();
var solr=ServiceLocator.Current.GetInstance();
变量选项=新查询选项
{
FilterQueries=new-ISolrQuery[]{new-SolrQueryField(“type”,type)},
ExtraParams=新字典{{“qt”,“建议”},
};
var results=solr.Query(关键字、选项);
返回结果;
否则,您的查询仍然针对标准的/select
请求处理程序(或您在solrconfig.xml中定义为默认值的任何处理程序)执行。请参阅,特别是关于旧handleSelect=true行为的部分。如果您运行的是较新的Solr服务器,这很可能是您的问题。(即设置“qt”无效,必须更改SolrNet中的默认处理程序,或者Solr配置需要设置handleSelect=true。)以下是我在本例中解决此问题的方法:
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
}
}
ISolrConnection连接=ServiceLocator.Current.GetInstance();
列表项SPARAMS=新列表();
termsParams.Add(新的KeyValuePair(“terms.fl”、“name”));
termsParams.Add(新的KeyValuePair(“terms.prefix”,mySearchString));
termsParams.Add(新的KeyValuePair(“terms.sort”、“count”));
字符串xml=connection.Get(“/terms”,termsParams);
IsolabstractResponseParser=ServiceLocator.Current.GetInstance();
SolrQueryResults结果=新的SolrQueryResults();
parser.Parse(System.Xml.Linq.XDocument.Parse(Xml),结果);
TermsResults termResults=结果。术语;
foreach(TermsResult结果在termResults中)
{
foreach(结果术语中的KeyValuePair kvp)
{
//…用钥匙做点什么
}
}
基本上,我使用SolrNet解析器和连接代码,但不使用查询内容。希望这有帮助。我有完全相同的要求,但无法找到任何方法轻松处理SolrNet的结果。不幸的是,SolrNet似乎是围绕默认的
/select
请求处理程序构建的,目前不支持任何其他处理程序,包括对象类型映射的/suggest
(T
)。它希望所有映射都与索引的Solr文档结果一起发生,而不是与建议结果一起发生
因此,它对我不起作用<代码>T带有映射的类型与suggester results响应不兼容。从初始化请求(Startup.Init()
)到查询(ISolrQueryResults results=solr.Query()
)的所有标准管道代码都需要映射的solr文档类型,而不是建议者提供的简单字符串数组
因此,(类似于)我提出了一个web请求,并从XMLWeb响应中解析出建议的结果。SolrConnection
类用于:
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
传递qt参数不起作用,至少在Solr 4.7中不起作用,即使SolrConfig中handleSelect=true。您可以通过指定一个与默认的/select非常不同的自定义处理程序进行验证,比如在ExtraParams中使用edismax并发送debugQuery=true,在Fiddler中捕获结果 另外,如果您阅读handleSelect标志上的解释,它会显示“如果请求使用“/select”,但没有该名称的请求处理程序” 您不想触摸或禁用/select处理程序,因为Solr本身使用它
我最终使用ExtraParams来传递我在自定义处理程序中定义的所有值,没有那么多。似乎比只使用SolrNET的一部分然后进行结果解析要好 使用新版本的SolrNet(.net 4.6),您可以更改默认处理程序“/select”。 尝试用这种方式调用您的建议处理程序
using CommonServiceLocator;
using SolrNet;
using SolrNet.Commands.Parameters;
Startup.Init<MwDoc>("http://localhost:8983/solr/mycore");
var solr = ServiceLocator.Current.GetInstance<ISolrOperations<MyClass>>();
QueryOptions options = new QueryOptions()
{
RequestHandler = new RequestHandlerParameters("/suggest"),
// define your other Options here
};
solr.Query("keyword to search", options);
使用CommonServiceLocator;
使用SolrNet;
使用SolrNet.Commands.Parameters;
Startup.Init(“http://localhost:8983/solr/mycore");
var solr=ServiceLocator.Current.GetInstance();
QueryOptions选项=新QueryOptions()
{
RequestHandler=new RequestHandlerParameters(“/suggest”),
//在此处定义其他选项
};
solr.Query(“要搜索的关键字”,选项);
我已经按照建议进行了更改,但仍然没有得到结果您对关键字和类型使用了哪些值
using CommonServiceLocator;
using SolrNet;
using SolrNet.Commands.Parameters;
Startup.Init<MwDoc>("http://localhost:8983/solr/mycore");
var solr = ServiceLocator.Current.GetInstance<ISolrOperations<MyClass>>();
QueryOptions options = new QueryOptions()
{
RequestHandler = new RequestHandlerParameters("/suggest"),
// define your other Options here
};
solr.Query("keyword to search", options);