2013-05-13 5 views
24

すべてのフィールドを保持している2人の違いはわかりません。Elasticsearchの_sourceと_allの違いは何ですか?

私の文書が持っている場合:

{"mydoc": 
    {"properties": 
     {"name":{"type":"string","store":"true"}}, 
     {"number":{"type":"long","store":"false"}}, 
     {"title":{"type":"string","include_in_all":"false","store":"true"}} 

    } 
} 

私は_sourceは、すべてのフィールドを持っている分野であることを理解しています。しかし、そうなのですか? これは、「名前」が複数回(_srcと_allに2回)保存され、文書のディスク容量が増えることを意味しますか?

は、「名前」に一度_sourceため、フィールドに一度格納され、一度_allのためですか? 「番号」については、_sourceではなく、すべてに格納されていますか?

いつ私のクエリで_sourceを使用する必要がありますか?

私は「_all」を無効にすることができユースケースで、どのような機能はその後、私を拒否されるでしょうか?

答えて

43

これは、luceneのインデックス付きフィールドと格納フィールドの違いとほぼ同じです。

あなたがそれらを検索したい場合は、あなたが検索結果として返すようにしたいフィールドを保存しているときは、インデックスフィールドを使用しています。

_sourceフィールドはもともとelasticsearchに送られた全ソースドキュメントを保存することを意味します。それは検索結果として使用され、検索されます。あなたはそれを検索することはできません。実際、それはluceneの格納されたフィールドであり、索引付けされていません。

_allフィールドには、インデックスにドキュメントが構成されているすべてのフィールドから来るすべてのコンテンツを意味しています。索引付けされているが、luceneには格納されていないので、検索はできますが、返すことはできません。

冗長性はなく、2つのフィールドは異なるユースケースを意味し、ルセンインデックス内の異なる場所に格納されます。 _allフィールドは、反転インデックスと呼ばれるものの一部となり、テキストを索引付けして全文検索を実行できる一方、_sourceフィールドは単にルーシー文書の一部として格納されます。

あなたは結果を取り戻す場合にのみ、それはelasticsearchがデフォルトで返すものですので、あなたは、あなたのクエリで_sourceフィールドを使用することはありません。 _sourceフィールドに依存する機能がいくつかありますが、無効にすると失われます。そのうちの1つはupdate APIです。また、無効にする場合は、検索結果として返すすべてのフィールドをマッピングにstore:yesとして設定することを忘れないでください。私はむしろそれが本当に多くの場合に役立つので、それがあなたを気にしない限り、それを無効にしないと言うでしょう。もう1つの一般的な用途は、データを再インデックスする必要がある場合です。 elasticsearch自体からすべてのドキュメントを取得し、別のインデックスに再送信するだけで済みます。

一方、_allフィールドは、すべてのフィールドを検索したいだけで、クエリですべてを指定したくない場合に使用できるデフォルトのキャッチオールフィールドです。それは便利ですが、生産にはあまり依存しません。異なる重みを使って、異なるフィールドでより複雑なクエリを実行するほうが良いでしょう。あなたがそれを使用しない場合は無効にしたいかもしれませんが、これは私の意見では_sourceを無効にするよりも小さい影響を与えます。

+0

ありがとうございます! フィールドを「インデックス」に設定した場合:「いいえ」、それでも「_all」に表示されます。 したがって、一度に複数の指定フィールドでフルテキスト検索を行うつもりがない場合、すべてのフィールドで「include_in_all」をfalseにするとスペースが節約されますか? – eran

+1

私はその間に私の答えにいくつかの考えを加えました。 '_all'フィールドは、デフォルトで' 'index ':yes''に設定されています。' 'include_in_all''オプションを使用していない場合、他のフィールドのマッピングには関係しません。 '_all'フィールドを使用しない場合は、すべてのフィールドを' 'include_in_all ':false''に設定するのではなく、完全に無効にします。 – javanna

+0

ありがとうございます。 '_all'フィールドを無効にするとかなりのディスク容量を節約できますか? (それは、直感的に必要なスペースをほぼ倍増すると思われます) – eran

関連する問題