如何让ElasticSearch只返回某些字段?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (10)
  • 关注 (0)
  • 查看 (10102)

我正在使用ElasticSearch索引我的文档。

是否可以指示它只返回特定的字段,而不是它存储的整个JSON文档?

提问于
用户回答回答于

源滤波器如果使用JSON进行搜索,它将如下所示:

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

在ES 2.4及更早版本中,还可以使用“搜索api”的“字段”选项。:

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

这在ES 5+中是不可取的。而且源过滤器也更强大!

用户回答回答于

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

   }
}

请参阅有关如何索引存储字段的文档。

用户回答修改于

针对最新版本(6.X)。比如你只想返回 ‘name’ 字段。

1. rest 方式

1.1 请求路径后加 '_source=<field>'

_search?_source=name

1.2 请求体内加 ‘"_source":["field"]’

{
	"_source":["name"],
	"query": {
		...
	}
}
	

2. java 实现

SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.fetchSource("name", null);
用户回答回答于

可以使用'_source'参数创建REST API GET请求。

示例请求

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
            }
        }
    ]
}

}

用户回答回答于

在java中,可以使用setFetchSource,如下所示:

client.prepareSearch(index).setTypes(type)
            .setFetchSource(new String[] { "field1", "field2" }, null)
用户回答回答于
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" }
        }
    }
用户回答回答于

这里是另一个解决方案,现在使用匹配表达

源滤波

允许控制每次点击时返回_source字段的方式。

使用弹奏搜索版本5.5进行测试

关键词“包括”定义具体的字段。

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

response_filtering

所有REST API都接受filter_path参数,该参数可用于减少elasticsearch返回的响应。 该参数采用用点符号表示的以逗号分隔的过滤器列表。

用户回答回答于
For the ES versions 5.X and above you can a ES query something like this

    GET /.../...
    {
      "_source": {
        "includes": [ "FIELD1", "FIELD2", "FIELD3" ... " ]
      },
      .
      .
      .
      .
    }
用户回答回答于

我发现获取api的文档很有帮助 - 特别是两个部分,即源过滤和字段:http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs-get.html

他们说关于源过滤:

如果只需要完整_source中的一个或两个字段,则可以使用_source_include&_source_exclude参数来包含或过滤出您需要的部分。 这对大型文档尤其有用,因为部分检索可以节省网络开销

完全符合我的用例。最后,我只需像这样过滤源代码(使用速记):

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

扫码关注云+社区

领取腾讯云代金券