我使用elasticsearch来索引我的文档。
是否有可能指示它只返回特定的字段,而不是它所存储的整个json文档?
我使用elasticsearch来索引我的文档。
是否有可能指示它只返回特定的字段,而不是它所存储的整个json文档?
当前回答
在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":{
}
}
有关如何为存储的字段建立索引,请参阅文档。 总是很高兴得到好评!
其他回答
这是另一个解决方案,现在使用匹配表达式
源过滤允许控制每次命中_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%"
}
}
]
}
}
}
例如,你有一个有三个字段的doc:
PUT movie/_doc/1
{
"name":"The Lion King",
"language":"English",
"score":"9.3"
}
如果你想返回名字和分数,你可以使用下面的命令:
GET movie/_doc/1?_source_includes=name,score
如果你想获得一些匹配模式的字段:
GET movie/_doc/1?_source_includes=*re
可能会排除一些字段:
GET movie/_doc/1?_source_excludes=score
我发现get api的文档很有帮助——尤其是Source filtering和Fields: https://www.elastic.co/guide/en/elasticsearch/reference/7.3/docs-get.html#get-source-filtering这两个部分
他们阐述了源过滤:
如果您只需要完整_source中的一个或两个字段,则可以 使用_source_include & _source_exclude参数来包含或 过滤掉你需要的部分。这一点特别有用 部分检索可以节省网络开销的大型文档
这非常适合我的用例。我最终只是像这样简单地过滤源代码(使用简写):
{
"_source": ["field_x", ..., "field_y"],
"query": {
...
}
}
供参考,他们在文档中声明了fields参数:
get操作允许指定一组存储字段 通过传递fields参数返回。
它似乎是为了满足特定存储的字段,它将每个字段放在一个数组中。如果指定的字段还没有被存储,它将从_source中获取每个字段,这可能会导致“更慢”的检索。我也有麻烦试图让它返回类型对象的字段。
因此,总的来说,您有两个选择,要么通过源过滤,要么通过[存储]字段。
是的,通过使用源过滤器你可以做到这一点,这里是文档源过滤器
示例请求
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)