当前位置: 首页 > 知识库问答 >
问题:

ElasticSearch:如何使用ElasticSearch API只返回特定字段?

袁奇文
2023-03-14

我正在使用ElasticSearch 7.3来查询一些文档,
我想在查询响应中只返回每个文档的特定字段,
我发现可以使用_source来实现这一点,
我可以从Kibana使用这个查询来实现这一点-

GET /test/_search?_source=id
{
  "query": {
    "match_all": {}
  }
}

返回给我正确的数据-

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 6,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "test",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 1.0,
        "_source" : {
          "id" : 3
        }
      },
      {
        "_index" : "test",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 1.0,
        "_source" : {
          "id" : 2
        }
      },
      {
        "_index" : "test",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : { }
      },
      {
        "_index" : "test",
        "_type" : "_doc",
        "_id" : "4",
        "_score" : 1.0,
        "_source" : {
          "id" : 4
        }
      },
      {
        "_index" : "test",
        "_type" : "_doc",
        "_id" : "5",
        "_score" : 1.0,
        "_source" : {
          "id" : 5
        }
      },
      {
        "_index" : "test",
        "_type" : "_doc",
        "_id" : "6",
        "_score" : 1.0,
        "_source" : {
          "id" : 6
        }
      }
    ]
  }
}

但我无法使用ElasticSearch的节点客户端实现同样的功能-

const { Client } = require('@elastic/elasticsearch')
const client = new Client({ node: 'http://localhost:9200' })

let searchTest = async () => {
  let indexToQuery = 'test';
  let esQuery = {
    index: indexToQuery,
    //q: '_source:id',
    body: {
        "query": {
          "match_all": {}
        }
    }
  };
  console.log('esQuery =>\n', esQuery);

  const result = await client.search(esQuery);
  console.log("search resp => \n", result.body.hits.hits);
};

searchTest();

有人能帮我找到正确的方法来实现我的用例吗?

引用-
https://www.elastic.co/guide/en/elasticsearch/reference/7.3/docs-get.html#get-source-filtering
https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/16.x/api-reference.html#api-search

共有1个答案

夏弘文
2023-03-14

_source也可以用作查询的一部分。在主体块中添加_source作为query的同级。更新如下:

{
  "query": {
    "match_all": {}
  },
  "_source": ["id"]
}
 类似资料:
  • 是否可以使用spring data elasticsearch返回所有elasticsearch文档的特定嵌套字段? 例如。es数据存储库将如何查找以下查询? 网址: /myIndex/MyType/_search 查询正文:

  • 我想打这个电话并返回一个字符串,但我有这个错误: “java.lang.非法状态异常:块()/块第一()/块最后())正在阻塞,这在线程反应器中不受支持” 我不明白为什么我做错了?WebClient支持异步和同步调用。 这是一个只有3个依赖的springboot项目。 我怎么能像正常的同步调用一样只返回一个字符串? 谢谢。

  • 如何告诉Elasticsearch在按术语搜索时排除某个字段? 当一个普通用户搜索摩托车时,什么都不应该返回,但如果他们搜索史密斯,这两个都应该返回。 有能力搜索认证字段的用户如果搜索摩托车将返回标记,如果搜索史密斯将返回标记。

  • 问题内容: 我正在使用Elasticsearch索引我的文档。 是否有可能指示它仅返回特定字段,而不是它存储的整个json文档? 问题答案: 是的 使用源过滤器。如果您使用JSON搜索,它将看起来像这样: 在ES 2.4及更低版本中,您还可以在search API中 使用fields选项: ES 5+中已弃用此功能。而且,源过滤器更强大!

  • 注释使用Spring数据elasticsearch查询并仅返回特定的嵌套字段 版本: springboot:2.1.7。释放 spring数据弹性搜索:2.1.7。释放 elasticsearch:6.5.4 文件: 存储库: 我只想得到名字的数据,这样可以相对节省内存资源。但我犯了个错误,不能这样使用吗?或者只能使用elasticsearchTemplate?

  • 我有一个索引,它有嵌套的字段。我想在响应中只包括特定的嵌套对象,基于条件以及其他字段。例如,考虑映射 我想按名称搜索用户,并希望响应只包括嵌套对象包含country='U.S.“。请考虑用户索引中的以下文档 我期待搜索结果如下 请为我提供一个合适的elasticsearch查询以获取此文档