3

我目前在使用弹性搜索时遇到问题。当我尝试执行搜索并且只希望返回字段的子集时,如果字段是嵌套的,我需要使用点表示法指定字段。这是我的映射器 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,但这似乎没用。

4

1 回答 1

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字段,否则只检索该字段并对其进行解析要快得多,而不是为每个单独的字段敲击磁盘。
于 2012-08-13T14:28:30.890 回答