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

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


当前回答

对于ES版本5。X及以上,你可以这样查询ES:

    GET /.../...
    {
      "_source": {
        "includes": [ "FIELD1", "FIELD2", "FIELD3" ... " ]
      },
      .
      .
      .
      .
    }

其他回答

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

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

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

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

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

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

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

有几种方法可以用于实现特定领域的结果。 可以通过源方法。 根据我们的兴趣,另一个方法filter_path也可以用来接收更清晰、更概括的答案:

索引"index1"中的文档Json:

"hits" : [
  {
    "_index" : "index1",
    "_type" : "_doc",
    "_id" : "1",
    "_score" : 1,
    "_source" : {
      "year" : 2020,
      "created_at" : "2020-01-29",
      "url" : "www.github.com/mbarr0987",
      "name":"github"
    }
  }

查询:

GET index1/_search?filter_path=hits.hits._source.url
{
  "query": { 
        {"term": {"name":"github" }
    }
  }
}

输出:

{
  "hits" : {
    "hits" : [
      {
        "_source" : {
          "url" : "www.github.com/mbarr0987"
            }
          }
      ]
   }
}

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

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

结果是,请仔细查看includes键

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

在这里,你可以在输出中指定你想要的字段,也可以指定你不想要的字段:

  POST index_name/_search
    {
        "_source": {
            "includes": [ "field_name", "field_name" ],
            "excludes": [ "field_name" ]
        },
        "query" : {
            "match" : { "field_name" : "value" }
        }
    }