使弹性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列表。
在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 } } ] }
}