5

我已经配置了我的 solrconfig.xml 和 schema.xml 来查询建议。

我能够从 url 获得建议

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>

我调用 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;

但是,我没有得到任何数据。结果计数为零。结果中的拼写检查也为零​​。

我也没有在结果中看到建议列表。

在此处输入图像描述

请帮忙

4

5 回答 5

7

我有完全相同的要求,但找不到任何方法来使用 SolrNet轻松处理Suggester结果。不幸的是,SolrNet 似乎是围绕默认/select请求处理程序构建的,目前不支持任何其他处理程序,包括 /suggest对象类型映射 ( T)。它期望所有映射都与索引的 Solr 文档结果而不是建议结果一起发生。

因此,@Paige Cook 的回答对我不起作用。T带有映射的类型与建议者结果响应不兼容。Startup.Init<T>()从初始化请求 ( ) 到查询 ( )的所有标准管道代码都ISolrQueryResults<T> 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<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

或者,请求可以使用以下wt=json参数返回 JSON 响应,而不是 XML:

var parameters = new Dictionary<string, string>
                {
                    {"q", searchTerm},
                    {"wt", "json"}, // change this!
                };
// then use your favorite JSON parser
于 2013-03-22T15:20:00.357 回答
3

请参阅http://wiki.apache.org/solr/SolrRequestHandler,特别是关于旧的 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
    }
}

基本上我使用 SolrNet 解析器和连接代码,但不使用查询内容。希望这可以帮助。

于 2013-01-14T21:10:52.027 回答
2

为了对/suggest您设置的请求处理程序执行查询,您需要qt使用 SolrNet QueryOptions 中的 ExtraParameters 设置 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;

否则,您的查询仍会针对标准/select请求处理程序(或您在 solrconfig.xml 中定义为默认值的任何内容)执行。

于 2013-01-07T13:04:38.700 回答
0

传递 qt 参数不起作用,至少在 Solr 4.7 中不起作用,即使在 SolrConfig 中使用 handleSelect=true 也是如此。您可以通过指定与默认 /select 非常不同的自定义处理程序进行验证,例如让您使用 edismax 并在 ExtraParams 中发送 debugQuery = true 并在 Fiddler 中捕获结果。

此外,如果您阅读了有关 handleSelect 标志的说明,它会显示“如果请求使用“/select”但没有该名称的请求处理程序”。

您不想触摸或禁用 /select 处理程序,因为 Solr 自己使用它。

我最终使用 ExtraParams 来传递我在自定义处理程序中定义的所有值,没有那么多。似乎比只使用 SolrNET 的一部分然后进行结果解析要好。

于 2014-10-15T21:26:56.397 回答
0

使用新版本的 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);
于 2020-10-30T09:15:16.800 回答