如何让建议者成分SolrNet工作?(How to get the suggester compon

2019-07-17 22:52发布

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

我能够从URL中得到的建议

http://localhost:8080/solr/collection1/suggest?q=ha&wt=xml

我solrconfig.xml中的样子

Curently,我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>

我的代码来调用API SolrNet看起来如下

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;

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

我还没有看到结果里面的建议列表。

请帮忙

Answer 1:

我有完全相同的要求,但找不到任何方法可以轻松地处理建议者与SolrNet结果。 不幸的是,SolrNet似乎周围的默认内置/select请求处理程序,目前不支持任何其他处理程序,包括/suggest的对象类型映射( T )。 它要求所有的映射文件和索引文件Solr的结果,而不是建议者的结果发生。

因此, @Paige库克的回答并没有为我工作。 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

或者,代替XML,该请求可以使用返回的JSON响应wt=json参数:

var parameters = new Dictionary<string, string>
                {
                    {"q", searchTerm},
                    {"wt", "json"}, // change this!
                };
// then use your favorite JSON parser


Answer 2:

为了对执行查询/suggest ,你必须设置请求处理程序,您将需要设置qt使用ExtraParameters Solr的参数在SolrNet QueryOptions象下面这样:

 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中的默认值)。



Answer 3:

见http://wiki.apache.org/solr/SolrRequestHandler ,特别是在老handleSelect =真实行为的部分。 如果你对一个新的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解析器和连接代码,但不能查询的东西。 希望这可以帮助。



Answer 4:

路过QT参数不工作,在SolrConfig Solr中4.7甚至handleSelect =至少不是真的。 您可以通过指定一个自定义的处理程序是非常不同从默认的验证/选择,说会使你使用edismax和发送debugQuery = true在ExtraParams,赶上在提琴手的结果。

此外,如果您在handleSelect标记读取解释它说:“如果请求使用‘/选择’但这个名字的请求处理程序”。

你不想碰或禁用/选择处理程序,因为Solr的使用它本身。

最后我用ExtraParams通过我在自定义处理程序中定义的所有值,有没有那么多。 似乎比仅仅使用SolrNET的一部分,然后做的结果更好的解析。



文章来源: How to get the suggester component working in SolrNet?