Elasticsearch:mappingのstore属性を理解する
6758 ワード
デフォルトでは、フィールド値は検索可能にインデックスされますが、保存されません.これは、フィールドをクエリーできるが、元のフィールド値を取得できないことを意味します.ここで理解しなければならないのは、1つのフィールドのmappingにstore属性がtrueである場合、このフィールドのために個別のストレージ領域が格納され、このストレージは_とは独立していることです.ソースの格納.より高速なクエリーがあります.このフィールドを保存すると、ディスク領域が消費されます.ドキュメントから抽出する必要がある場合(つまり、スクリプトで集約する必要がある場合)、計算を減らすのに役立ちます.集約すると、storeプロパティを持つフィールドは、このプロパティを持たないフィールドよりも速くなります.このオプションの可能な値はfalseとtrueです.
普通はどうでもいいです.このフィールドの値はすでに_ソースフィールドの一部は、デフォルトで格納されています.1つのフィールドまたは複数のフィールドの値のみを取得したい場合は、_全体ではなくsourceの値は、source filteringを使用して実現できます.
場合によっては、ストレージフィールドが意味を持つ可能性があります.たとえば、見出し、日付、および大きなコンテンツフィールドを持つドキュメントがある場合は、見出しと日付のみを取得し、大きな_から取得する必要はありません.ソースフィールドからこれらのフィールドを抽出します.
次に、上記の説明は少し迂回しているが、具体的な例を通じてこれを説明する.
まずmyという名前のindexのインデックス:
上のmappingでは、titleフィールドとdateフィールドのstoreプロパティをtrueに設定し、index fragementが個別に配備され、値が格納されていることを示します.ドキュメントをmy_に書きますindexインデックス:
次に、検索を行います.
次の結果が表示されます.
上にはsourceには、このドキュメントのtitle、date、contentフィールドが表示されます.
source filteringの方法で、必要なフィールドを事前に入手できます.
次の結果が表示されます.
明らかに上の結果は、私たちが望んでいるフィールドdateとtitleが_ソースで取得しました.
この2つのフィールドの値は、次の方法で取得することもできます.
次の結果が返されます.
上ではfieldsにdateとtitleの配列がクエリの結果を返すことがわかります.
このstoreにはいったいどんな用途があるのか、多くの人が知りたいのかもしれません.もしすべて_からソースでフィールドの値を取得します.
最初に説明したように、すべてのフィールドを保存したくない場合があります.ソースでは、このフィールドの内容が大きいので、保存したくないかもしれません.ソースですが、一部のフィールドでは、コンテンツを取得したいと思っています.この場合、storeを使用して実現することができます.
私たちはやはり一つの例で説明します.まずmy_という名前のindex 1のインデックス:
contentフィールドの内容が大きいかもしれないと思っているので、このフィールドを保存したくないです.上には、私たちも_sourceのenabledスイッチはfalseに設定され、sourceフィールドが格納されないことを示します.次にmy_にドキュメントを書きますindex 1に行きます.
同様に検索を行います.
検索結果が表示されます.
今回の表示では、私たちは見ていませんでした.ソースフィールドは、disabledに渡したからです.しかし、storeフィールドは次の方法で取得できます.
結果は次のとおりです.
戻り結果に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
普通はどうでもいいです.このフィールドの値はすでに_ソースフィールドの一部は、デフォルトで格納されています.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