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

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

設定したリクエスト ハンドラに対してクエリを実行するには、以下のように SolrNet QueryOptions の ExtraParameters を使用して Solr パラメータを/suggest設定する必要があります。qt

 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 に答える