1. ホーム
  2. elasticsearch

elasticsearchで "store": "yes "が必要な理由とは?

2023-12-20 16:34:54

質問

私は本当に理解できないのですが、なぜ コアタイプのリンク には、属性の説明で (たとえば数値の場合) こう書かれているのですが、これはなぜなのでしょうか。

  1. store - 実際のフィールドをインデックスに格納する場合は yes、格納しない場合は no に設定します。デフォルトは no です(注。 の場合、JSONドキュメント自体は保存され、そこから取得することができます。 )
  2. index - 値をインデックス化しない場合は、no に設定します。この場合、インデックスされずに保存されるのであれば、storeはyesに設定されるべきです。 を使用することはできません。

太字の2つの部分が矛盾しているように見えます。もし "index":"no", "store":"no" でもソースから値を取得することができますね。これは、例えばURLを含むフィールドがある場合、良い使い方ができるかもしれません。そうでしょうか?

私はちょっとした実験をしました。2つのマッピングがあり、1つはフィールドに "store":"yes" に設定し、もう一方では "store":"no" .

どちらの場合も、私はまだ私のクエリで指定することができました。

{"query":{"match_all":{}}, "fields":["my_test_field"]}

と入力すると、フィールドを返して同じ答えが返ってきました。

と思ったのですが、もし "store" が設定されている場合 "no" に設定されている場合、特定のフィールドを取得することができず、全体の _source を取得し、クライアント側でそれをパースする必要があります。

では "store""yes" ? のフィールドを除外する場合のみ関係するのでしょうか? "_source" フィールドから明示的に除外する場合のみですか?

どのように解決するのですか?

store"が"no"に設定されている場合、特定のフィールドを取得できないと思っていました。 特定のフィールドを取得することはできず、_source 全体を取得し、クライアント側で解析する必要があります。 クライアント側でパースする必要があります。

これはまさにelasticsearchが、フィールドが格納されていない場合(デフォルト)、そして _source フィールドが有効な場合 (これもデフォルト)。

通常、elasticsearchにフィールドを送信するのは、そのフィールドで検索するか、またはそれを取得したいからです。しかし、フィールドを明示的に保存せず、ソースを無効にしない場合でも、フィールドを検索するために _source . つまり、インデックス化も保存もされないフィールドを持つことが、実際に意味を持つ場合もあるということです。

フィールドを保存する場合、それは基礎となる lucene で行われます。Lucene は転置インデックスであり、高速な全文検索を可能にし、テキストクエリで与えられたドキュメント ID を返します。Lucene は転置インデックスの他に、ドキュメント ID を指定して検索するためのフィールド値を格納するストレージを備えています。通常、検索結果として返したいフィールドを lucene に格納します。Elasticsearchは、デフォルトで送信されたすべてのドキュメントを保存するため、返したいすべてのフィールドを保存する必要はありません。

いくつかのケースでは、lucene に明示的にフィールドを保存しておくと便利なことがあります。 _source フィールドが無効な場合や、elasticsearch が自動的にパースする場合でもパースを避けたい場合です。 しかし、保存された多くのフィールドを lucene から取得する場合、フィールドごとにディスクシークが必要になる可能性があることを覚えておいてください。 _source を取得し、必要なフィールドを取得するためにそれをパースすることは、1回のディスクシークで済み、ほとんどの場合においてより高速になります。