我目前使用弹性搜索时遇到问题。当我尝试执行搜索并且只想要返回的字段的子集时,如果字段是嵌套的,我需要使用点表示法指定字段。这是我的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,但这似乎毫无用处。
答案 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
字段,否则检索该字段并解析它要快得多,而不是为每个字段点击磁盘。