ドキュメントのインデックスを作成するためにelasticsearchを使用しています。
保存したjsonドキュメント全体ではなく、特定のフィールドのみを返すように指示することはできますか?
ドキュメントのインデックスを作成するためにelasticsearchを使用しています。
保存したjsonドキュメント全体ではなく、特定のフィールドのみを返すように指示することはできますか?
回答:
うん!ソースフィルターを使用します。JSONで検索している場合は、次のようになります。
{
"_source": ["user", "message", ...],
"query": ...,
"size": ...
}
ES 2.4以前では、検索APIにfieldsオプションを使用することもできました:
{
"fields": ["user", "message", ...],
"query": ...,
"size": ...
}
これはES 5以降では非推奨です。そしてソースフィルターはとにかくより強力です!
私はのドキュメント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つのオプションがあります。
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":{
}
}
保存されたフィールドにインデックスを付ける方法に関するドキュメントを参照してください。賛成票をいただき、ありがとうございます。
すべてのREST APIは、elasticsearchから返される応答を減らすために使用できるfilter_pathパラメーターを受け入れます。このパラメーターは、ドット表記で表されたフィルターのコンマ区切りリストを取ります。
ここで別の解決策、今は一致式を使用しています
ソースフィルタリング
ヒットごとに_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%"
}
}
]
}
}
}
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
}
}
]
}
}
はい、ソースフィルターを使用することでこれを達成できます。これがドキュメントのソースフィルターです
リクエストの例
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"
},....
}
]
}
}
Javaでは、次のようにsetFetchSourceを使用できます。
client.prepareSearch(index).setTypes(type)
.setFetchSource(new String[] { "field1", "field2" }, null)
たとえば、次の3つのフィールドを持つドキュメントがあるとします。
PUT movie/_doc/1
{
"name":"The Lion King",
"language":"English",
"score":"9.3"
}
あなたが返すようにしたい場合name
とscore
、あなたは、次のコマンドを使用することができます。
GET movie/_doc/1?_source_includes=name,score
パターンに一致するいくつかのフィールドを取得したい場合:
GET movie/_doc/1?_source_includes=*re
たぶんいくつかのフィールドを除外します:
GET movie/_doc/1?_source_excludes=score
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;
}