Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何让suggester组件在SolrNet中工作?_C#_.net_Solr_Solrnet - Fatal编程技术网

C# 如何让suggester组件在SolrNet中工作?

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

我已经配置了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 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);