elasticsearchが特定のフィールドのみを返すようにしますか?


434

ドキュメントのインデックスを作成するためにelasticsearchを使用しています。

保存したjsonドキュメント全体ではなく、特定のフィールドのみを返すように指示することはできますか?


1
elastic.co/guide/en/elasticsearch/reference/current/…、一部のフィールドのみを除外することもできることに注意してください
Christophe Roussy

回答:


619

うん!ソースフィルターを使用します。JSONで検索している場合は、次のようになります。

{
    "_source": ["user", "message", ...],
    "query": ...,
    "size": ...
}

ES 2.4以前では、検索APIにfieldsオプションを使用することもできました

{
    "fields": ["user", "message", ...],
    "query": ...,
    "size": ...
}

これはES 5以降では非推奨です。そしてソースフィルターはとにかくより強力です!


12
それらを "stored"として定義してください:マッピングではtrue。それ以外の場合、ESは_sourceドキュメントをロードし、そこからフィールドをロードします。返されるデータがドキュメント全体のサイズに対して比較的小さい場合は、パフォーマンスに影響を与える可能性があります。
Zaar Hai

6
あなたは「ストア」を意味しました:true
sscarduzio 2014

これらはconfファイルで作成されていますか?
vbNewbie 14

@vbNewbie:マッピングを定義しているところ。マッピングを明示的に定義せず、ESに依存して生成する場合は、ESに保存するフィールドのマッピングを定義する必要があります。特別な動作が必要なフィールド( "store":true、 "index": "not_analyzed"など)またはすべてのフィールドに対してのみマッピングを定義できます。詳細については、マッピングドキュメントをご覧ください。
サンハーシュ2014年

3
新しいバージョンではフィールドはサポートされなくなりました。代わりにstored_fieldsを使用してください:)
Sachin Sharma

88

私はのドキュメントget apiが役立つことがわかりました-特に2つのセクション、ソースフィルタリングフィールドhttps : //www.elastic.co/guide/en/elasticsearch/reference/7.3/docs-get.html#get-source-フィルタリング

彼らはソースフィルタリングについて述べています:

完全な_sourceから1つまたは2つのフィールドのみが必要な場合は、_source_include&_source_excludeパラメーターを使用して、必要な部分を含めたり、フィルターで除外したりできます。これは、部分的な検索でネットワークのオーバーヘッドを節約できる大きなドキュメントで特に役立ちます。

これは私のユースケースに完全に適合しました。私は単純にそのようにソースをフィルタリングすることになりました(省略形を使用):

{
    "_source": ["field_x", ..., "field_y"],
    "query": {      
        ...
    }
}

参考までに、フィールドパラメータに関するドキュメントで次のように述べてます。

get操作では、fieldsパラメータを渡すことによって返される、格納されたフィールドのセットを指定できます。

明確に格納されているフィールドに対応しているようで、各フィールドを配列に配置します。指定されたフィールドが格納されていない場合、_sourceから各フィールドがフェッチされるため、検索が遅くなる可能性があります。また、オブジェクト型のフィールドを返すようにするのにも問題がありました。

したがって、要約すると、ソースフィルタリングまたは[保存]フィールドのいずれかを使用した2つのオプションがあります。


私のためにトリックをしました。「フィールド」を使用してgeo_pointを返すことに問題がありましたが、「_ source」は問題なく機能します。
16

23
For the ES versions 5.X and above you can a ES query something like this

    GET /.../...
    {
      "_source": {
        "includes": [ "FIELD1", "FIELD2", "FIELD3" ... " ]
      },
      .
      .
      .
      .
    }

12

Elasticsearch 5.xでは、上記のアプローチは非推奨です。_sourceアプローチを使用できますが、特定の状況ではフィールドを格納することが理にかなっています。たとえば、タイトル、日付、非常に大きなコンテンツフィールドを持つドキュメントがある場合、大きな_sourceフィールドからこれらのフィールドを抽出する必要なく、タイトルと日付のみを取得することができます。

この場合、以下を使用します。

{  
   "size": $INT_NUM_OF_DOCS_TO_RETURN,
   "stored_fields":[  
      "doc.headline",
      "doc.text",
      "doc.timestamp_utc"
   ],
   "query":{  
      "bool":{  
         "must":{  
            "term":{  
               "doc.topic":"news_on_things"
            }
         },
         "filter":{  
            "range":{  
               "doc.timestamp_utc":{  
                  "gte":1451606400000,
                  "lt":1483228800000,
                  "format":"epoch_millis"
               }
            }
         }
      }
   },
   "aggs":{  

   }
}

保存されたフィールドにインデックスを付ける方法に関するドキュメントを参照してください。賛成票をいただき、ありがとうございます。


7
here you can specify whichever field you want in your output and also which you don't.

  POST index_name/_search
    {
        "_source": {
            "includes": [ "field_name", "field_name" ],
            "excludes": [ "field_name" ]
        },
        "query" : {
            "match" : { "field_name" : "value" }
        }
    }


6

ここで別の解決策、今は一致式を使用しています

ソースフィルタリング
ヒットごとに_sourceフィールドを返す方法を制御できます。

Elastiscsearchバージョン5.5でテスト済み

キーワード「includes」は、詳細フィールドを定義します。

GET /my_indice/my_indice_type/_search
{
    "_source": {
        "includes": [ "my_especific_field"]
        },
        "query": {
        "bool": {
                "must": [
                {"match": {
                    "_id": "%my_id_here_without_percent%"
                    }
                }
            ]
        }
    }
}

5

REST API GETリクエストは、「_ source」パラメーターを使用して作成できます。

リクエストの例

http://localhost:9200/opt_pr/_search?q=SYMBOL:ITC AND OPTION_TYPE=CE AND TRADE_DATE=2017-02-10 AND EXPIRY_DATE=2017-02-23&_source=STRIKE_PRICE

応答

{
"took": 59,
"timed_out": false,
"_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
},
"hits": {
    "total": 104,
    "max_score": 7.3908954,
    "hits": [
        {
            "_index": "opt_pr",
            "_type": "opt_pr_r",
            "_id": "AV3K4QTgNHl15Mv30uLc",
            "_score": 7.3908954,
            "_source": {
                "STRIKE_PRICE": 160
            }
        },
        {
            "_index": "opt_pr",
            "_type": "opt_pr_r",
            "_id": "AV3K4QTgNHl15Mv30uLh",
            "_score": 7.3908954,
            "_source": {
                "STRIKE_PRICE": 185
            }
        },
        {
            "_index": "opt_pr",
            "_type": "opt_pr_r",
            "_id": "AV3K4QTgNHl15Mv30uLi",
            "_score": 7.3908954,
            "_source": {
                "STRIKE_PRICE": 190
            }
        },
        {
            "_index": "opt_pr",
            "_type": "opt_pr_r",
            "_id": "AV3K4QTgNHl15Mv30uLm",
            "_score": 7.3908954,
            "_source": {
                "STRIKE_PRICE": 210
            }
        },
        {
            "_index": "opt_pr",
            "_type": "opt_pr_r",
            "_id": "AV3K4QTgNHl15Mv30uLp",
            "_score": 7.3908954,
            "_source": {
                "STRIKE_PRICE": 225
            }
        },
        {
            "_index": "opt_pr",
            "_type": "opt_pr_r",
            "_id": "AV3K4QTgNHl15Mv30uLr",
            "_score": 7.3908954,
            "_source": {
                "STRIKE_PRICE": 235
            }
        },
        {
            "_index": "opt_pr",
            "_type": "opt_pr_r",
            "_id": "AV3K4QTgNHl15Mv30uLw",
            "_score": 7.3908954,
            "_source": {
                "STRIKE_PRICE": 260
            }
        },
        {
            "_index": "opt_pr",
            "_type": "opt_pr_r",
            "_id": "AV3K4QTgNHl15Mv30uL5",
            "_score": 7.3908954,
            "_source": {
                "STRIKE_PRICE": 305
            }
        },
        {
            "_index": "opt_pr",
            "_type": "opt_pr_r",
            "_id": "AV3K4QTgNHl15Mv30uLd",
            "_score": 7.381078,
            "_source": {
                "STRIKE_PRICE": 165
            }
        },
        {
            "_index": "opt_pr",
            "_type": "opt_pr_r",
            "_id": "AV3K4QTgNHl15Mv30uLy",
            "_score": 7.381078,
            "_source": {
                "STRIKE_PRICE": 270
            }
        }
    ]
}

}


これは私にとって非常に完全な使用です。
サイサイタインディル

4

はい、ソースフィルターを使用することでこれを達成できます。これがドキュメントのソースフィルターです

リクエストの例

POST index_name/_search
 {
   "_source":["field1","filed2".....] 
 }

出力は

{
  "took": 57,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 1,
    "hits": [
      {
        "_index": "index_name",
        "_type": "index1",
        "_id": "1",
        "_score": 1,
        "_source": {
          "field1": "a",
          "field2": "b"
        },
        {
          "field1": "c",
          "field2": "d"
        },....
      }
    ]
  }
}

2

Javaでは、次のようにsetFetchSourceを使用できます。

client.prepareSearch(index).setTypes(type)
            .setFetchSource(new String[] { "field1", "field2" }, null)

2

たとえば、次の3つのフィールドを持つドキュメントがあるとします。

PUT movie/_doc/1
{
  "name":"The Lion King",
  "language":"English",
  "score":"9.3"
}

あなたが返すようにしたい場合namescore、あなたは、次のコマンドを使用することができます。

GET movie/_doc/1?_source_includes=name,score

パターンに一致するいくつかのフィールドを取得したい場合:

GET movie/_doc/1?_source_includes=*re

たぶんいくつかのフィールドを除外します:

GET movie/_doc/1?_source_excludes=score

0

Java APIを使用して、以下を使用して、特定のフィールドのセットからすべてのレコードを取得します。

public List<Map<String, Object>> getAllDocs(String indexName) throws IOException{
    int scrollSize = 1000;
    List<Map<String,Object>> data = new ArrayList<>();
    SearchResponse response = null;
    while( response == null || response.getHits().getHits().length != 0){
        response = client.prepareSearch(indexName)
            .setTypes("typeName")  // The document types to execute the search against. Defaults to be executed against all types.
        .setQuery(QueryBuilders.matchAllQuery())
        .setFetchSource(new String[]{"field1", "field2"}, null)
        .setSize(scrollSize)
        .execute()
        .actionGet();
        for(SearchHit hit : response.getHits()){
            System.out.println(hit.getSourceAsString());
        }
    }
    return data;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.