2012-11-29 6 views
10

私は決して問い合わせることのないフィールドの数を持つドキュメントを持っていますので、リソースを節約するためにこれらのフィールドのインデックスを無効にしたいと思います。私はdisable the _all fieldにする必要があると信じていますが、次にどのフィールドにインデックスを付けるかを指定しますか?ElasticSearchでインデックスを付けるフィールドを指定します。

答えて

24

デフォルトでは、すべてのフィールドは特別なフィールドの_all内でも索引付けされています。これは、いわゆるキャッチオール機能をそのまま使用できます。しかし、あなたはinclude_in_allオプションを使用して、_allフィールドに追加するかしないかどうか、あなたのマッピングで、各フィールドに指定することができます

"person" : { 
    "properties" : { 
     "name" : { 
      "type" : "string", "store" : "yes", "include_in_all" : false 
     } 
    } 
} 

上記の例では、獲得した名前のフィールドのデフォルトの動作を無効にします_allフィールドの一部である必要はありません。それ以外の場合は

、あなたがもう一度あなたのマッピングでは、このようにそれを無効にすることができ、特定のタイプのために全く_allフィールドを必要としない場合:あなたはそれを無効にすると、あなたのフィールドはまだインデックスが作成されます

"person" : { 
    "_all" : {"enabled" : false}, 
    "properties" : { 
     "name" : { 
      "type" : "string", "store" : "yes" 
     } 
    } 
} 

あなたは_allが提供する包括的な機能を持っていないでしょう。 _all特殊フィールドに頼るのではなく、特定のフィールドを照会する必要があります。実際に、クエリを実行してフィールドを指定しなかった場合、elasticsearchはクエリのデフォルトフィールドをオーバーライドしない限り、フードの_allフィールドをクエリします。

+0

ことをありがとう!ですから、私はその機能を使用していないので、 '_all'を無効にすることができます。うまくいけば、インデックスのサイズを小さくする必要があります。そして、私がよく理解していれば、私が持っているインデックスサイズを減らす唯一の選択肢は、検索しないフィールドに 'not_analyzed'を指定することです。 – Michael

+2

さて、インデックスサイズを変更するだけではなく、データのインデックス方法を変更します。フィールドを分析しないと、単一のトークンが含まれます。トークナイザやトークンフィルタは使用されません。それに文が含まれている場合(空白などで)、一致するようにするには、正確な文全体を照会する必要があります。フィールドを照会しない場合は、indexed = falseを設定します。 – javanna

+0

それは私が思ったことですね。説明ありがとう。私は自分の文書に「説明」や「リンク」のようないくつかのフィールドを持っていますので、検索する必要はありません。それを分析するためのリソースが無駄です。そして、インデックス全体をメモリ( '{" index ":{" store.type ":" memory "}}')で実行することをテストしていますので、インデックスサイズが重要な要素になります。 – Michael

6

各文字列フィールドは、index paramをマッピング設定に持ちます。defaults toanalyzedです。これは、_allフィールドのほかに、各フィールドが単独で索引付けされることを意味します。

そして、それが参照して言われ_all fieldのそれ:

デフォルトで

、それが有効になっていると、すべてのフィールドは、使いやすさのために、それに含まれています。 _allフィールドにそれらを含めるかどうかに照会しなければならない分野については

"mappings": { 
     "your_mapping": { 
      "properties": { 
       "field_not_to_index": { 
        "type": "string", 
        "include_in_all": false, 
        "index": "no" 
       } 
      } 
     } 
    } 

:あなたは(_allフィールドが有効になっている場合)を指定する必要がフィールドのための完全に無効にインデックスへ

ので

、 _allフィールドを使用してクエリを実行する場合は、リソースを保存するために"index": "no"を使用してください。または、これらのフィールドでクエリを実行する場合は、indexパラメータをすべて正の値(analyzedまたはnot_analyzed)で使用し、リソースを保存する_allフィールドを無効にします。

2

には、以下の理想的なあなたは、フィールドのプロパティでnoに「インデックス」フラグを設定するべきではありません、あなたの問題のために弾性検索 http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/mapping-intro.html

でインデックスの設定を理解するための重要なドキュメントのページです。

+1

このリンクでは、 "index": "not_analyzed"と表示されています。しかし、私は索引付けと分析がESの明確な概念であると考えました。 'いいえ'は 'not_analyzed'とは異なる設定ですか?どうか明らかにしてください。 – szeitlin

+2

'analyze' 最初に文字列を分析し、それにインデックスを付けます。つまり、このフィールドをフルテキストとして索引付けします。 'not_analyzed' このフィールドにはインデックスを付けるので、検索可能ですが、指定したとおりに正確に値をインデックスします。それを分析しないでください。 'no' このフィールドはまったく索引付けしないでください。このフィールドは検索できません。 – Tjorriemorrie

0

動的インデックスと_allインデックスをfalseに設定します。マッピングに必要なフィールドを指定します。 https://www.elastic.co/guide/en/elasticsearch/guide/current/dynamic-mapping.html

{ 
    "mappings":{ 
     "candidates":{ 
     "_all":{ 
      "enabled":false 
     }, 
      "dynamic": "false", 
     "properties":{ 
      "tags":{ 
       "type":"text" 
      }, 
      "derivedAttributes":{ 
       "properties":{ 
       "city":{ 
        "type":"text" 
        }, 
        "zip5":{ 
        "type":"keyword" 
        } 
       } 
      } 
     } 
     } 
    } 
} 
関連する問題