当前位置 : 首页 » 互动问答 » 正文

使elasticsearch只返回某些字段?

分类 : 互动问答 | 发布时间 : 2012-03-08 00:24:08 | 评论 : 9 | 浏览 : 146088 | 喜欢 : 269

我正在使用elasticsearch索引我的文档。

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

回答(9)

  • 1楼
  • Yep! Use a source filter 。如果您正在使用JSON进行搜索,它将看起来像这样:

     {
        “_source”:[“user”,“message”,...],
        “查询”:...,
        “大小”:......
    }
    

    在ES 2.4及更早版本中,您还可以使用字段选项搜索API :

     {
        “fields”:[“user”,“message”,...],
        “查询”:...,
        “大小”:......
    }
    

    这在ES 5+中已弃用。无论如何,源过滤器更强大!

  • 2楼
  • 我发现get api的文档很有帮助 - 尤其是两个部分,源过滤 and Fields: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs-get。 html

    他们说明了源过滤:

    如果你只需要完整_source中的一个或两个字段,你可以   使用_source_include和_source_exclude参数来包含或   过滤掉你需要的部分。这可能特别有用   部分检索可以节省网络开销的大型文档

    完全适合我的用例。我最终只是简单地过滤源(使用速记):

     {
        “_source”:[“field_x”,...,“field_y”],
        “查询”:{
            ...
        }
    }
    

    仅供参考,他们在关于fields parameter:

    的文档中说明了get操作允许指定一组存储的字段   通过传递fields参数返回。

    它似乎迎合了专门存储的字段,它将每个字段放在一个数组中。如果尚未存储指定的字段,它将从_source中获取每个字段,这可能导致“较慢”的检索。我也很难尝试让它返回对象类型的字段。

    总而言之,你有两个选择,无论是源过滤还是[存储]字段。

  • 3楼
  • 对于ES版本5.X及更高版本,您可以进行类似这样的ES查询
    
        GET / ... / ...
        {
          “_资源”: {
            “includes”:[“FIELD1”,“FIELD2”,“FIELD3”......“]
          },
          。
          。
          。
          。
        }
  • 5楼
  • 在Elasticsearch 5.x中,不推荐使用上述方法。 您可以使用_source方法,但在某些情况下,存储字段是有意义的。例如,如果您的文档包含标题,日期和非常大的内容字段,您可能只想检索标题和日期,而无需从大型_source字段中提取这些字段:

    在此如果你使用:

     {
       “size”:$ INT_NUM_OF_DOCS_TO_RETURN,
       “stored_fields”:
          “doc.headline”
          “doc.text”
          “doc.timestamp_utc”
       ]
       “查询”:{
          “BOOL”:{
             “必须”:{
                “术语”:{
                   “doc.topic”: “news_on_things”
                }
             },
             “过滤”:{
                “范围”:{
                   “doc.timestamp_utc”:{
                      “GTE”:1451606400000,
                      “LT”:1483228800000,
                      “格式”: “epoch_millis”
                   }
                }
             }
          }
       },
       “AGGS”:{
    
       }
    }
    

    请参阅有关如何索引存储字段的文档。 Upvote总是很开心!

  • 6楼
  • 这是另一种解决方案,现在使用match expression

    源过滤
    允许控制每次点击返回_source字段的方式。

    使用Elastiscsearch 5.5版测试

    关键字"includes"定义细节字段。

     GET / my_indice / my_indice_type / _search
    {
        “_资源”: {
            “includes”:[“my_especific_field”]
            },
            “查询”:{
            “bool”:{
                    “必须”:[
                    {“比赛”: {
                        “_id”:“%my_id_here_without_percent%”
                        }
                    }
                ]
            }
        }
    }
  • 7楼
  • 在这里,您可以指定输出中所需的任何字段,也可以指定不需要的字段。
    
      POST index_name / _search
        {
            “_资源”: {
                “includes”:[“field_name”,“field_name”],
                “排除”:[“field_name”]
            },
            “查询”:{
                “匹配”:{“field_name”:“value”}
            }
        }
  • 8楼
  • 在java中你可以像这样使用setFetchSource:

     client.prepareSearch(index).setTypes(type)
                .setFetchSource(new String [] {“field1”,“field2”},null)
  • 9楼
  • 可以使用'_source'参数进行REST API GET请求。

    示例请求

     http:// localhost:9200 / opt_pr / _search?q =符号:ITC和OPTION_TYPE = CE和TRADE_DATE = 2017-02- 10 AND EXPIRY_DATE = 2017-02-23&_source = STRIKE_PRICE
    

    Response

     {
    “拿走”:59,
    “timed_out”:false,
    “_shards”:{
        “总数”:5,
        “成功”:5,
        “失败”:0
    },
    “点击”:{
        “总数”:104,
        “max_score”:7.3908954,
        “点击”:[
            {
                “_index”:“opt_pr”,
                “_type”:“opt_pr_r”,
                “_id”:“AV3K4QTgNHl15Mv30uLc”,
                “_score”:7.3908954,
                “_资源”: {
                    “STRIKE_PRICE”:160
                }
            },
            {
                “_index”:“opt_pr”,
                “_type”:“opt_pr_r”,
                “_id”:“AV3K4QTgNHl15Mv30uLh”,
                “_score”:7.3908954,
                “_资源”: {
                    “STRIKE_PRICE”:185
                }
            },
            {
                “_index”:“opt_pr”,
                “_type”:“opt_pr_r”,
                “_id”:“AV3K4QTgNHl15Mv30uLi”,
                “_score”:7.3908954,
                “_资源”: {
                    “STRIKE_PRICE”:190
                }
            },
            {
                “_index”:“opt_pr”,
                “_type”:“opt_pr_r”,
                “_id”:“AV3K4QTgNHl15Mv30uLm”,
                “_score”:7.3908954,
                “_资源”: {
                    “STRIKE_PRICE”:210
                }
            },
            {
                “_index”:“opt_pr”,
                “_type”:“opt_pr_r”,
                “_id”:“AV3K4QTgNHl15Mv30uLp”,
                “_score”:7.3908954,
                “_资源”: {
                    “STRIKE_PRICE”:225
                }
            },
            {
                “_index”:“opt_pr”,
                “_type”:“opt_pr_r”,
                “_id”:“AV3K4QTgNHl15Mv30uLr”,
                “_score”:7.3908954,
                “_资源”: {
                    “STRIKE_PRICE”:235
                }
            },
            {
                “_index”:“opt_pr”,
                “_type”:“opt_pr_r”,
                “_id”:“AV3K4QTgNHl15Mv30uLw”,
                “_score”:7.3908954,
                “_资源”: {
                    “STRIKE_PRICE”:260
                }
            },
            {
                “_index”:“opt_pr”,
                “_type”:“opt_pr_r”,
                “_id”:“AV3K4QTgNHl15Mv30uL5”,
                “_score”:7.3908954,
                “_资源”: {
                    “STRIKE_PRICE”:305
                }
            },
            {
                “_index”:“opt_pr”,
                “_type”:“opt_pr_r”,
                “_id”:“AV3K4QTgNHl15Mv30uLd”,
                “_score”:7.381078,
                “_资源”: {
                    “STRIKE_PRICE”:165
                }
            },
            {
                “_index”:“opt_pr”,
                “_type”:“opt_pr_r”,
                “_id”:“AV3K4QTgNHl15Mv30uLy”,
                “_score”:7.381078,
                “_资源”: {
                    “STRIKE_PRICE”:270
                }
            }
        ]
    }

    }

相关阅读:

Elasticsearch query to return all records

Making a request to a RESTful API using python

Removing Data From ElasticSearch

Solr vs. ElasticSearch

ElasticSearch,Sphinx,Lucene,Solr,Xapian。哪种适合哪种用途?

ElasticSearch:未分配的碎片,如何解决?

将JSON文件导入/索引到Elasticsearch中

列出ElasticSearch服务器上的所有索引?

使elasticsearch只返回某些字段?

从索引/类型中删除所有文档而不删除类型