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

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


当前回答

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

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

其他回答

如果你懂sql,请写一个查询来获取代码的值,例如sql查询等价和elasticsearch查询

POST /_sql/translate
{
  
  "query": "select name,surname from users"
}

结果是,请仔细查看includes键

{
  "size" : 1000,
  "_source" : {
    "includes" : [
      "name",
      "surname"
    ],
    "excludes" : [ ]
  },
  "sort" : [
    {
      "_doc" : {
        "order" : "asc"
      }
    }
  ]
}

是的,使用一个更好的选择源过滤器。如果你使用JSON进行搜索,它会是这样的:

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

在ES 2.4和更早的版本中,你也可以在搜索API中使用fields选项:

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

这在ES 5+中已弃用。而且源过滤器更强大!

是的,通过使用源过滤器你可以做到这一点,这里是文档源过滤器

示例请求

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"
        },....
      }
    ]
  }
}

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

源过滤允许控制每次命中_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%"
          }
        }
      ]
    }
  }
}

我发现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中获取每个字段,这可能会导致“更慢”的检索。我也有麻烦试图让它返回类型对象的字段。

因此,总的来说,您有两个选择,要么通过源过滤,要么通过[存储]字段。