使弹性search只返回某些领域?

我正在使用elasticsearch来索引我的文档。

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

是的! 使用源filter 。 如果您使用JSON进行search,它会看起来像这样:

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

在ES 2.4及更早版本中,您也可以使用searchAPI的fields选项 :

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

这在ES 5+中已被弃用。 无论如何,源代码filter更强大!

我发现get api的文档是有帮助的 – 尤其是两个部分, 源过滤字段 : http : //www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs-get.html

他们陈述有关源过滤:

如果您只需要完整_source中的一个或两个字段,则可以使用_source_include&_source_exclude参数来包含或过滤掉所需的部分。 这对大型文档特别有用,在这种文档中部分检索可以节省networking开销

这完全符合我的用例。 我结束了简单的过滤源代码(使用简写):

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

仅供参考,他们在关于字段参数的文档中声明:

get操作允许指定一组存储的字段,这些字段将通过传递fields参数来返回。

它似乎迎合了专门存储的字段,它将每个字段放置在一个数组中。 如果指定的字段没有被存储,它将从_source中获取每一个,这可能导致“较慢”的检索。 我也遇到了麻烦,试图让它返回types对象的字段。

所以总之,你有两个select,通过源过滤或[存储]字段。

 For the ES versions 5.X and above you can a ES query something like this GET /.../... { "_source": { "includes": [ "FIELD1", "FIELD2", "FIELD3" ... " ] }, . . . . } 

response_filtering

所有REST API都接受一个filter_path参数,可用于减lesselasticsearch返回的响应。 该参数采用逗号分隔的以点表示法表示的filter列表。

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

在Elasticsearch 5.x中,上面提到的方法已经被弃用了。 您可以使用_source方法,但是在某些情况下,存储字段是有意义的。 例如,如果您的文档具有标题,date和非常大的内容字段,则可能只需检索标题和date,而不必从大_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":{ } } 

请参阅有关如何索引存储字段的文档。 总是乐意为Upvote!

这里另一个解决scheme,现在使用匹配expression式

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

使用Elastiscsearch 5.5版进行testing

关键字“包含”定义了具体的字段。

 GET /my_indice/my_indice_type/_search { "_source": { "includes": [ "my_especific_field"] }, "query": { "bool": { "must": [ {"match": { "_id": "%my_id_here_without_percent%" } } ] } } } 
 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" } } } 

在Java中,你可以像这样使用setFetchSource:

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

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

}