web-dev-qa-db-ja.com

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

私はドキュメントの索引付けにelasticsearchを使用しています。

保存したJSON文書全体ではなく、特定のフィールドのみを返すように指示することは可能ですか?

346
user1199438

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

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

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

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

これはES 5+では推奨されていません。とにかく、ソースフィルタはより強力です。

476
kevingessner

私はget apiのためのドキュメントが役に立つことを見つけました - 特に2つのセクション、ソースフィルタリングフィールドhttp://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs-get.html

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

完全な_sourceから1つか2つのフィールドしか必要としない場合は、_source_includeと_source_excludeパラメータを使用して、必要な部分を含めたり、除外したりできます。これは、部分的な検索でネットワークのオーバーヘッドを削減できる大きな文書では特に便利です。

これは私のユースケースにぴったり合ったものです。 (省略形を使って)そのように単純にソースをフィルタリングしました。

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

参考までに、fieldsパラメータについてのドキュメントで述べています。

Get操作では、fieldsパラメータを渡して返されるストアドフィールドのセットを指定できます。

具体的に格納されているフィールド(各フィールドを配列に配置する場所)に対応するようです。指定されたフィールドが保存されていない場合は、_sourceから各フィールドを取得します。その結果、検索が遅くなる可能性があります。また、オブジェクト型のフィールドを返すようにしようとしてもうまくいきませんでした。

つまり、要約すると、ソースフィルタリングまたは[stored]フィールドのどちらかを使用して、2つの選択肢があります。

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

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

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":{  

   }
}

保存されたフィールドにインデックスを付ける方法についてのドキュメントを参照してください。常に投票に満足しています!

9
woltob

response_filtering

すべてのREST AP​​Iは、elasticsearchによって返される応答を減らすために使用できるfilter_pathパラメータを受け入れます。このパラメーターは、ドット表記で表現されたフィルターのコンマ区切りリストを取ります。

https://stackoverflow.com/a/35647027/844700

7
The Demz

ここでもう1つの解決策、今はmatch式を使う

ソースフィルタリング
ヒットするたびに_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%"
                    }
                }
            ]
        }
    }
}
6
Fabricio
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
Gaurav

REST AP​​I 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
            }
        }
    ]
}

}

3
Ironluca

はい、あなたはこれを達成することができますソースフィルタを使用することで、これがdoc source-filteringです

リクエスト例

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
RCP

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

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

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

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

nameおよびscoreを返す場合は、次のコマンドを使用できます。

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

パターン付きのフィールドを取得する場合:

GET moive/_doc/1?_source_includes=*re

たぶんいくつかのフィールドを除いて:

GET moive/_doc/1?_source_excludes=score
0
Yao Pan