如何查询所有文档,过滤特定字段并返回Elasticsearch中每个文档的值?

时间:2016-02-29 21:14:27

标签: mongodb elasticsearch

我目前正在运行一个Elasticsearch实例,它正在通过河流从MongoDB同步。 MongoDB包含如下条目:

{field1: "value1", field2: "value2", cars: ["BMW", "Ford", "Porsche"]}

并非Mongo中的每个条目都有 cars 字段。

现在我想创建一个ElasticSearch查询,该查询搜索每个文档,并返回Elasticsearch中索引的每个文档中的cars字段。

甚至可能吗? Elasticsearch必须触摸每个文档才能返回 cars 字段。也许查询Mongo比Elasticsearch更容易和更快。你觉得怎么样?

2 个答案:

答案 0 :(得分:0)

Elasticsearch(根据我的理解)并非旨在成为SSoT数据库。它非常擅长文本搜索和分析聚合,但它并不一定是您的主数据库。

但是,您的用例在弹性搜索中并不一定具有高性能,听起来您只想过滤汽车领域,您可以按照此处的说明进行操作:

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-fields.html

最后,我真的冒昧说弹性搜索在这种情况下比mongo更快(假设cars字段没有索引,而弹性搜索是,它们各自的默认值),因为你可能想要过滤掉没有设置汽车领域。

tl; dr elasticsearch并不适用于您的特殊情况,但它可能比mongo更快,假设您过滤掉了缺少的汽车领域'

答案 1 :(得分:0)

以下发布到hostname:9200/_search的查询应该可以帮助您入门:

{
  "filter": {
    "exists": {
      "field": "cars"
    }
  },
  "fields": ["cars"]
}

filter子句将结果限制为具有cars字段的文档。

fields子句仅表示返回cars字段。如果您想要返回整个文档,则可以将此部分保留。

参考文献:

https://www.elastic.co/guide/en/elasticsearch/reference/current/common-options.html#_response_filtering

Make elasticsearch only return certain fields?