web-dev-qa-db-ja.com

Solrインデックスと保存済み

Solrフィールドのインデックスと保存された属性の動作については少し混乱しています。

たとえば、Schema.xmlに次のものがある場合

<field name="test1" type="text" indexed="false"
        stored="false" required="false" />

フィールドtest1は、そのフィールドを含むドキュメントを作成し、そのフィールドに値を設定し、ドキュメントをSolrにコミットしても、Solrドキュメントに保存されませんか? stored=false属性、フィールドの値がSolrで失われ、永続化されないことを意味しますか?

57
user1965449

それは正しいです。通常、フィールドにインデックスを付けるか保存するか、またはその両方が必要になります。両方をfalseに設定すると、Solrドキュメントでそのフィールドを使用できなくなります(検索または表示のいずれか)。両方をfalseに設定する特別な場合については、Alexandreの回答を参照してください。

前述のとおり、 hereindexed=trueは、フィールドを検索可能(およびソート可能およびファセット可能)にします。たとえば、test1という名前のフィールドにindexed=trueがある場合、q=test1:fooのように検索できます。ここで、fooは検索する値です。 indexed=falseフィールドtest1の場合、test1の値がfooであるドキュメントがSolrにある場合でも、そのクエリは結果を返しません。

stored=trueは、検索時にフィールドを取得できることを意味します。クエリのフィールドの値を明示的に取得する場合は、fl=test1のようなクエリでfl paramを使用します(デフォルトはfl=*で、保存されたすべてのフィールドを取得します)。 stored=truetest1の場合のみ、値が返されます。それ以外の場合は返されません。

102
arun

両方をfalseに設定する主なポイントは、その特定のフィールドを明示的にスキップすることです。

たとえば、dynamicFieldマッピングの保存/インデックス作成があり、それ以外の場合はdynamicFieldのパターンに該当する特定の名前を無視する場合。

または、dynamicFieldを使用して、サードパーティからの同じプレフィックス/サフィックスを持つフィールドのセット全体を無視することもできます。たとえば、Tikaは、無視したいメタデータフィールド全体を送信します。 Solrの例で定義されているこれを参照してください schema.xml および solrconfig.xml で使用されています

Solrの以降のバージョンでは、代わりに IgnoreFieldUpdateProcessorFactory (他の場合は full list を参照)を使用することもできます。これにより、インデックス作成プロセスの早い段階でこれらのフィールドが削除されます。

26

Solrのメールスレッドの this responseから引用:

「indexed」と「stored」は独立した直交属性です-trueとfalseの4つの組み合わせのいずれかを使用できます。 「インデックス付き」は、検索またはクエリ、クエリリクエストの処理の「ルックアップ」部分に使用されます。検索/クエリ/ルックアップが完了し、ドキュメントのセットが選択されると、「格納」は、Solr応答で表示または返すことができる値を持つフィールドのセットです。

分離の理由の一部は、Solr/Luceneが入力データを「分析」または変換して、より高速で関連性の高い検索/ルックアップのためのより効率的な形式にすることです。残念ながら、その分析/変換されたデータは、多くの場合、表示や人間の消費には適していません。つまり、分析/変換は双方向/可逆ではありません。 「stored = true」を設定すると、元のデータを元の形式で取得できることが保証されます。

6
Pale Blue Dot

両方とも偽の場合、そのフィールドのデータは失われます。インデックスがtrueの場合、データは検索可能ですが、表示できません。 stored trueを設定すると、そのフィールドで検索できなくなりますが、表示することはできます(この場合、copyfieldルールを記述して、そのフィールドからデフォルトの検索可能なフィールドに情報をコピーできます)。両方ともtrueに設定->検索および表示できます。

2
Alik Vardanyan