Elasticsearch:mappingのstore属性を理解する

6758 ワード

デフォルトでは、フィールド値は検索可能にインデックスされますが、保存されません.これは、フィールドをクエリーできるが、元のフィールド値を取得できないことを意味します.ここで理解しなければならないのは、1つのフィールドのmappingにstore属性がtrueである場合、このフィールドのために個別のストレージ領域が格納され、このストレージは_とは独立していることです.ソースの格納.より高速なクエリーがあります.このフィールドを保存すると、ディスク領域が消費されます.ドキュメントから抽出する必要がある場合(つまり、スクリプトで集約する必要がある場合)、計算を減らすのに役立ちます.集約すると、storeプロパティを持つフィールドは、このプロパティを持たないフィールドよりも速くなります.このオプションの可能な値はfalseとtrueです.
普通はどうでもいいです.このフィールドの値はすでに_ソースフィールドの一部は、デフォルトで格納されています.1つのフィールドまたは複数のフィールドの値のみを取得したい場合は、_全体ではなくsourceの値は、source filteringを使用して実現できます.
場合によっては、ストレージフィールドが意味を持つ可能性があります.たとえば、見出し、日付、および大きなコンテンツフィールドを持つドキュメントがある場合は、見出しと日付のみを取得し、大きな_から取得する必要はありません.ソースフィールドからこれらのフィールドを抽出します.
次に、上記の説明は少し迂回しているが、具体的な例を通じてこれを説明する.
まずmyという名前のindexのインデックス:
PUT my_index
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "store": true 
      },
      "date": {
        "type": "date",
        "store": true 
      },
      "content": {
        "type": "text"
      }
    }
  }
}

上のmappingでは、titleフィールドとdateフィールドのstoreプロパティをtrueに設定し、index fragementが個別に配備され、値が格納されていることを示します.ドキュメントをmy_に書きますindexインデックス:
PUT my_index/_doc/1
{
  "title": "Some short title",
  "date": "2015-01-01",
  "content": "A very long content field..."
}

次に、検索を行います.
GET my_index/_search

次の結果が表示されます.
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "title" : "Some short title",
          "date" : "2015-01-01",
          "content" : "A very long content field..."
        }
      }
    ]
  }

上にはsourceには、このドキュメントのtitle、date、contentフィールドが表示されます.
source filteringの方法で、必要なフィールドを事前に入手できます.
GET my_index/_search
{
  "_source": ["title", "date"]
}

次の結果が表示されます.
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "date" : "2015-01-01",
          "title" : "Some short title"
        }
      }
    ]
  }

明らかに上の結果は、私たちが望んでいるフィールドdateとtitleが_ソースで取得しました.
この2つのフィールドの値は、次の方法で取得することもできます.
GET my_index/_search
{
  "stored_fields": [
    "title",
    "date"
  ]
}

次の結果が返されます.
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "fields" : {
          "date" : [
            "2015-01-01T00:00:00.000Z"
          ],
          "title" : [
            "Some short title"
          ]
        }
      }
    ]
  }

上ではfieldsにdateとtitleの配列がクエリの結果を返すことがわかります.
このstoreにはいったいどんな用途があるのか、多くの人が知りたいのかもしれません.もしすべて_からソースでフィールドの値を取得します.
最初に説明したように、すべてのフィールドを保存したくない場合があります.ソースでは、このフィールドの内容が大きいので、保存したくないかもしれません.ソースですが、一部のフィールドでは、コンテンツを取得したいと思っています.この場合、storeを使用して実現することができます.
私たちはやはり一つの例で説明します.まずmy_という名前のindex 1のインデックス:
PUT my_index1
{
  "mappings": {
    "_source": {
      "enabled": false
    },
    "properties": {
      "title": {
        "type": "text",
        "store": true
      },
      "date": {
        "type": "date",
        "store": true
      },
      "content": {
        "type": "text",
        "store": false
      }
    }
  }
}

contentフィールドの内容が大きいかもしれないと思っているので、このフィールドを保存したくないです.上には、私たちも_sourceのenabledスイッチはfalseに設定され、sourceフィールドが格納されないことを示します.次にmy_にドキュメントを書きますindex 1に行きます.
PUT my_index1/_doc/1
{
  "title": "Some short title",
  "date": "2015-01-01",
  "content": "A very long content field..."
}

同様に検索を行います.
GET my_index1/_search
{
  "query": {
    "match": {
      "content": "content"
    }
  }
}

検索結果が表示されます.
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 0.2876821,
    "hits" : [
      {
        "_index" : "my_index1",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.2876821
      }
    ]
  }

今回の表示では、私たちは見ていませんでした.ソースフィールドは、disabledに渡したからです.しかし、storeフィールドは次の方法で取得できます.
GET my_index1/_search
{
  "stored_fields": [
    "title",
    "date"
  ],
  "query": {
    "match": {
      "content": "content"
    }
  }
}

結果は次のとおりです.
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 0.2876821,
    "hits" : [
      {
        "_index" : "my_index1",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.2876821,
        "fields" : {
          "date" : [
            "2015-01-01T00:00:00.000Z"
          ],
          "title" : [
            "Some short title"
          ]
        }
      }
    ]
  }

戻り結果にdateおよびtitleの値を表示できます.
フィールドを適切に格納できるもう1つのケースは、ソースフィールド(copy_toフィールドなど)のフィールド.別の記事「Elasticsearchのcopy_toを使用して検索効率を向上させる方法」を参照してください.
Elasticsearchのストレージの詳細については、「Elasticsearch:inverted index,doc_valuesおよびsource」という記事を参照してください.
 
 
参照先:
【1】https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-store.html
【2】https://stackoverflow.com/questions/17103047/why-do-i-need-storeyes-in-elasticsearch