6

私は solr 3.6 を使用しており、suggester からの照合を複数用語検索のオートコンプリート ソリューションとして使用したいと考えています。残念ながら、Suggester は複数語の検索に対して 1 つの照合のみを返します。これは、1 つの語句ごとに多数の候補が存在する場合でも同様です。私のテスト検索と基礎となるインデックス付きデータに応じて、より多くの照合が存在する必要があると確信しています。

Suggester の設定に何か問題がありますか?

    <!--configuration -->
<searchComponent class="solr.SpellCheckComponent" name="suggest">
<lst name="spellchecker">
  <str name="name">suggest</str>
  <str name="classname">org.apache.solr.spelling.suggest.Suggester</str>
  <str name="lookupImpl">org.apache.solr.spelling.suggest.fst.WFSTLookupFactory</str>
  <str name="field">text</str>  <!-- the indexed field to derive suggestions from -->
  <!--<float name="threshold">0.0005</float> disabled for test-->
  <str name="buildOnCommit">true</str>
</lst>
</searchComponent>

<requestHandler class="org.apache.solr.handler.component.SearchHandler" name="/suggest">
<lst name="defaults">
  <str name="spellcheck">true</str>
  <str name="spellcheck.dictionary">suggest</str>
  <str name="spellcheck.onlyMorePopular">true</str>
  <str name="spellcheck.count">200</str>
  <str name="spellcheck.collate">true</str>
  <str name="spellcheck.maxCollations">10</str>
</lst>
<arr name="components">
  <str>suggest</str>
</arr>
</requestHandler> 

q=bio+ber の応答例:

<response>
<lst name="responseHeader">
    <int name="status">0</int>
    <int name="QTime">4</int>
</lst>
<lst name="spellcheck">
    <lst name="suggestions">
        <lst name="bio">
            <int name="numFound">27</int>
            <int name="startOffset">0</int>
            <int name="endOffset">3</int>
            <arr name="suggestion">
                <str>bio</str>
                <str>bio-estetica</str>
                <str>bio-kosmetik</str>
                                    ...
            </arr>
        </lst>
        <lst name="ber">
            <int name="numFound">81</int>
            <int name="startOffset">4</int>
            <int name="endOffset">7</int>
            <arr name="suggestion">
                <str>beratung</str>
                <str>bern</str>
                ...
            </arr>
        </lst>
        <str name="collation">bio beratung</str>
    </lst>
</lst>
</response>
4

2 に答える 2

14

私はあなたと同じ問題を抱えていましたが、なんとか解決しました。複数の照合順序を適切に機能させるには、知っておく必要があることがいくつかあります。

まず、の「suggest」QueryComponentのリストの下にを指定する必要があります。そうしないと、インデックスのクエリ方法がわからないため、修正された各クエリのヒット数を把握できず、1 つしか取得できません。クエリに を追加した場合は、が 0 であることがわかります。これは、Solr がインデックスに対して修正されたクエリをわざわざチェックしなかったことを示しています。componentsrequestHandlersolrconfig.xmlrequestHandlerspellcheck.collateExtendedResults=truehits

彼らは、やや不透明なエラーメッセージでこれを示唆しています:

INFO: Could not find an instance of QueryComponent. Disabling collation verification against the index.

QueryComponentこれを追加する最も簡単な方法は、「クエリ」と呼ばれるデフォルトの を使用することです。したがって、上に投稿した XML では、「コンポーネント」の部分を次のように変更します。

<arr name="components">
  <str>suggest</str>
  <str>query</str>
</arr>

第 2 に、 1 より大きい値 (当然) を設定する必要spellcheck.maxCollationsがあり、あまり直感的ではありませんがspellcheck.maxCollationTries、大きな値 (1000 など) を設定する必要があります。これらのいずれかがデフォルト (両方とも 0) に設定されている場合、Solr は 1 つの照合のみを提供します。spellcheck.countまた、 1 より大きい値を設定する必要があります。

3 番目に、検索対象のフィールドを含めるようにクエリを変更する必要があります。適切な照合を行うには、用語を引用符で囲む必要があります。したがって、クエリの場合:

q=bio+ber

これは実際には次のようになります。

q=text:"bio+ber"

明らかにあなたの場合、「テキスト」はデフォルトのフィールドなので、必要ありません。しかし、私の場合、デフォルト以外のフィールドを使用していたので、それを指定する必要がありました。そうしないと、Solr は「テキスト」フィールドに対してヒット数をカウントし、すべての結果のヒット数が 0 になるため、ランキングは役に立たなくなります。

したがって、私の場合、クエリは次のようになりました。

q=my_field:"brain+c"
&spellcheck.count=5
&spellcheck.maxCollations=10
&spellcheck.maxCollationTries=1000
&spellcheck.collateExtendedResults=true

そして、私の応答は次のようになりました。

<response>
  <lst name="responseHeader">
    <int name="status">0</int>
    <int name="QTime">4</int>
  </lst>
  <lst name="spellcheck">
    <lst name="suggestions">
      <lst name="brain">
        <int name="numFound">1</int>
        <int name="startOffset">15</int>
        <int name="endOffset">20</int>
        <arr name="suggestion">
          <str>brain</str>
        </arr>
      </lst>
      <lst name="c">
        <int name="numFound">4</int>
        <int name="startOffset">21</int>
        <int name="endOffset">23</int>
        <arr name="suggestion">
          <str>cancer</str>
          <str>cambrian</str>
          <str>contusion</str>
          <str>cells</str>
        </arr>
      </lst>
      <lst name="collation">
        <str name="collationQuery">my_field:"brain cancer"</str>
        <int name="hits">2</int>
        <lst name="misspellingsAndCorrections">
          <str name="brain">brain</str>
          <str name="c">cancer</str>
        </lst>
      </lst>
      <lst name="collation">
        <str name="collationQuery">my_field:"brain contusion"</str>
        <int name="hits">1</int>
        <lst name="misspellingsAndCorrections">
          <str name="brain">brain</str>
          <str name="c">contusion</str>
        </lst>
      </lst>
      <lst name="collation">
        <str name="collationQuery">my_field:"brain cells"</str>
        <int name="hits">1</int>
        <lst name="misspellingsAndCorrections">
          <str name="brain">brain</str>
          <str name="c">cells</str>
        </lst>
      </lst>
    </lst>
  </lst>
  <result name="response" numFound="0" start="0"/>
</response>

成功!

于 2012-05-22T17:52:02.430 に答える
0

同じ問題がありました。

これは Solr 3.6.1 のバグです (以前のバージョンについては不明)。https://issues.apache.org/jira/browse/SOLR-2853を確認してください。

実際、このコメントは光を当てています: https://issues.apache.org/jira/browse/SOLR-2853?focusedCommentId=13136014&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-13136014

考えられる回避策は、spellcheck.maxCollat​​ionTries を必要な照合数と等しくなるように指定することですが、これにより、Solr はこれらの照合を検索インデックスに対してチェックすることになります。したがって、このプロパティを大きな数値に設定するように注意してください。このパラメータの詳細: http://wiki.apache.org/solr/SpellCheckComponent#spellcheck.maxCollat​​ionTries

バグはクローズされていませんが、すでに提出されたパッチがあります。

また、Solr 4.0.0-BETA のコードを確認しました - 修正済みです。

がんばれソルズ!)

于 2012-09-21T18:56:42.347 に答える