not_analyzed为ElasticSearch上的嵌套类型?

时间:2013-06-30 13:06:19

标签: elasticsearch

我在嵌套对象上执行构面搜索时遇到问题。

举例来说,我有以下文件:

tags: [
   {
       tag: "tag0",
       tag_url: "http://xxxxxxx.com/tag/tag0/"
   },
   {
       tag: "tag1",
       tag_url: "http://xxxxxx.com/tag/tag1/"
   }
],

categories: [
    {
        category: "cat0",
        category_url: "http://xxxxxx.com/category/cat0/"
    },
    {
        category: "cat1",
        category_url: "http://xxxxxx.com/category/cat1/"
    }
],

我想在tags.tagtags.tag_url

上执行一个方面

所以我使用什么映射来为嵌套字段创建index:not_analyzed

我试过这个映射:

    mapping_data[mapping_name]["properties"] = {
        "tags.tag" : {
            "type": "multi_field",
                "fields" : {
                    "tags.tag": {"type" : "string", "index" : "analyzed", "store": "yes"},
                    "untouched" : {"type" : "string", "index" : "not_analyzed"}
                }
        },
        "tags.tag_url" : {
            "type": "multi_field",
                "fields" : {
                    "tags.tag_url": {"type" : "string", "index" : "analyzed", "store": "yes"},
                    "untouched" : {"type" : "string", "index" : "not_analyzed"}
                }
        },
        "categories.category" : {
            "type": "multi_field",
                "fields" : {
                    "categories.category": {"type" : "string", "index" : "analyzed", "store": "yes"},
                    "untouched" : {"type" : "string", "index" : "not_analyzed"}
                }
        }, 
        "categories.category_url" : {
            "type": "multi_field",
                "fields" : {
                    "categories.category_url": {"type" : "string", "index" : "analyzed", "store": "yes"},
                    "untouched" : {"type" : "string", "index" : "not_analyzed"}
                }
        },

}

mapping_data[mapping_name]["properties"] = {
        "tags" : {
            "type": "nested"
        },

        "categories" : {
            "type": "nested"
        }, 
}

但它没有给我所需的结果。

使用type:nested仍然会对嵌套字段进行标记,而type: multi_field无法表达,嵌套字段为not_analyzed。 (请注意,我在tags.tag变体中使用了multi_field,但无济于事。)

那么,如何表达映射以实现嵌套文档的方面?

PS:http://www.elasticsearch.org/guide/reference/mapping/nested-type/http://www.elasticsearch.org/guide/reference/mapping/nested-type/没有产生我需要的结果,因为我没有value_field。

1 个答案:

答案 0 :(得分:5)

以下是您应该用于tags嵌套字段的json映射:

{
    "type" : {
        "properties" : {
            "tags" : {
                "type": "nested",
                "properties" : {
                    "tag" : {
                        "type": "multi_field",
                        "fields" : {
                            "tag": {"type" : "string", "index" : "analyzed", "store": "yes"},
                            "untouched" : {"type" : "string", "index" : "not_analyzed"}
                        }
                    },
                    "tag_url" : {
                        "type": "multi_field",
                        "fields" : {
                            "tag_url": {"type" : "string", "index" : "analyzed", "store": "yes"},
                            "untouched" : {"type" : "string", "index" : "not_analyzed"}
                        }
                    }
                }
            }
        }
    }
}

在你的案例multi_field中定义一个包含属性的嵌套对象是完全没错的。

然后,您可以在tags.untouched字段上创建所需的方面,如下所示:

{
    "query" : {
      "match_all" : {} 
    },
    "facets": {
      "tags": {
        "terms": {
          "field": "tags.tag.untouched",
          "size": 10
        },
        "nested" : "tags"
      }
    }
}

我使用最新版本的elasticsearch进行了测试。请记住,嵌套构面的方式自0.90以来已发生变化。请查看this issue以了解详情。