重命名弹性搜索输出字段

时间:2012-08-12 15:04:19

标签: elasticsearch

我目前使用弹性搜索时遇到问题。当我尝试执行搜索并且只想要返回的字段的子集时,如果字段是嵌套的,我需要使用点表示法指定字段。这是我的mapper json文档的示例,它映射了我的couchDB文档:

{
    "product": {
        "_type": {"store": "yes"},
        "_source": {"compress": true},
        "index_analyzer": "standard",
        "search_analyzer": "standard",
        "dynamic_date_formats": ["date_time_no_millis", "date_optional_time"],
        "properties": {
              "_id": {"type": "string", "store": "yes", "index": "not_analyzed"},
            "key": {"type": "string", "store": "yes"},
            "content": {
                "type": "object",
                "path": "just_name",
                "properties": {
                    "key": {"type": "string", "store": "yes"},
                    "name": {"type": "string", "store": "yes", "index_name": "name"},
                    "description": {"type": "string", "store": "yes", "index_name": "description"},
                    "brand": {
                        "type": "object",
                        "index_name": "brand",
                        "properties": {
                            "abbreviation": {"type": "string", "store": "yes", "index_name": "brand_abbreviation"},
                            "name": {"type": "string", "store": "yes", "index_name": "brand_name"}
                        }
                    }
                                }
                        }
                 }
          }
}

引用_id只是一个简单的_id,但是我想在内容中引用name,我必须将它称为content.name。这个问题是当搜索输出结束时,json输出包含字段名称:“content.name”。

是否可以将其重命名为“名称”而不包含“内容”。字首?你可以看到,我试图指定index_name,但这似乎毫无用处。

1 个答案:

答案 0 :(得分:4)

您可以使用partial_fields执行此操作。

例如,如果您将这样的文档编入索引:

curl -XPUT 'http://127.0.0.1:9200/test/test/1?pretty=1'  -d '
{
   "email" : "john@foo.com",
   "name" : "john",
   "foo" : {
      "bar" : {
         "baz" : 1
      }
   }
}
'

您可以像这样包含所需的字段/对象:

curl -XGET 'http://127.0.0.1:9200/test/test/_search?pretty=1'  -d '
{
   "partial_fields" : {
      "doc" : {
         "include" : [
            "name",
            "foo.*"
         ]
      }
   }
}
'

这会给你一个这样的结果:(注意缺少的email字段,并且该字段foo仍然是一个哈希 - 它没有用点表示法展平)

{
   "hits" : {
      "hits" : [
         {
            "_score" : 1,
            "fields" : {
               "doc" : {
                  "name" : "john",
                  "foo" : {
                     "bar" : {
                        "baz" : 1
                     }
                  }
               }
            },
            "_index" : "test",
            "_id" : "1",
            "_type" : "test"
         }
      ],
      "max_score" : 1,
      "total" : 1
   },
   "timed_out" : false,
   "_shards" : {
      "failed" : 0,
      "successful" : 5,
      "total" : 5
   },
   "took" : 1
}

在旁注中,有关您的映射的一些评论:

  • 您的_id字段(我假设它是弹性搜索ID,而不是外部ID)处于错误的级别 - 它应该与_type处于同一级别。如果它是外部ID,则它处于正确的级别。
  • 为什么要存放所有字段?确实没有必要 - 它只是使用额外的资源。除非你有一个庞大的_source字段,否则检索该字段并解析它要快得多,而不是为每个字段点击磁盘。