1

既存のドキュメントにタグを追加したい。フィールドは保存されますが、インデックスは作成されませんが、(ソフト)コミットのオーバーヘッドなしでの最新の値tags確認したいと思います。たとえば、コミットされる前に最新のタグを返します。tagsq=christmas&fl=text,tags

Solr 4.0には部分的なドキュメントの更新があることは知っていますが、その変更が表示される前に、ドキュメントのインデックスを再作成する必要があります。

コストのかかるインデックスの再作成を行わずに最新の値を取得する方法はありますか。NRTのように?


私は結果が古いクエリハンドラーで来ることを好みます。

NRTの場合、最大数秒の遅延を気にしません。

4

1 に答える 1

1

SolrでExternalFileFieldを使用することを検討してください。これは、インデックスに直接格納されていない値のストレージを取得する唯一の方法である可能性があります。ただし、ファイルが更新されるたびに再ロードする必要があるため、パフォーマンスが懸念される可能性があります。SolrメーリングリストのExternalFileFieldのベストプラクティスを参照してください。

また、SolrでExternalFileFieldを使用する場合は、ここで説明します。

アップデート:

Solr4.0に付属しているRealTimeGetviaの使用をお勧めします。/getこれにより、探している正確な機能が提供されます。次に、これをドキュメントの更新と組み合わせて、ドキュメント全体を毎回更新する必要がないようにすることができます。

Update2:RealTimeGetComponent

そこで、ハンドラーのソースコードを調べたところ、RealTimeGetComponentがあります。次のように、デフォルトの/selectハンドラーで有効にしました。主な項目は、&get=trueパラメータを設定し、それを最後のコンポーネントにすることです。

<!-- RealTimeGet Component-->
<searchComponent name="realtimeGet" class="solr.RealTimeGetComponent"/>

<requestHandler name="/select" class="solr.SearchHandler">
   <lst name="defaults">
     <str name="echoParams">explicit</str>
     <int name="rows">10</int>
     <str name="df">text</str>
     <bool name="get">true</bool>
   </lst>
   <arr name="last-components">
     <str>realtimeGet</str>
   </arr>
</requestHandler>

クエリ-/select?q=id%3Amydoc2&wt=xml&id=mydoc2 は次の出力を生成します。

    <response>
       <lst name="responseHeader">
         <int name="status">0</int>
         <int name="QTime">2</int>
         <lst name="params">
           <str name="id">mydoc2</str>
           <str name="wt">xml</str>
           <str name="q">id:mydoc2</str>
         </lst>
      </lst>
      <result name="response" numFound="1" start="0">
        <doc>
          <str name="id">mydoc2</str>
          <arr name="title">
            <str>realtime-get updated3</str>
          </arr>
          <long name="_version_">1419891443321798656</long>
        </doc>
      </result>
      <doc name="doc">
        <str name="id">mydoc2</str>
        <arr name="title">
          <str>realtime-get updated - new</str>
        </arr>
        <long name="_version_">1419892263820984320</long>
      </doc>
    </response>

したがって、この例では、アイテムをクエリしてから、アイテムid=mydoc2の最新バージョンを取得し、値id=mydoc2の違いを示しています。_version_title

ただし、これを取得するには、更新されたバージョンを取得するために1つまたは複数のドキュメントのIDを渡す必要があります。このコンポーネントは、使用されているrequestHandlerで実行されているクエリの更新されたドキュメントをプルできるようにコーディングされているようには見えません。これは素晴らしい将来の機能になるでしょう。

于 2012-11-27T14:43:36.713 に答える