处理弹性搜索的文档中的类别

时间:2014-10-24 14:51:44

标签: arrays elasticsearch categories

一直在挣扎,需要一些帮助。

我在PHP中有一个类似于

的文档数组
array("title"=>"some title",  
      "description" => "Short description",
      "categories" => array ( array("id" => "1", "name" => "category 1"),
                              array("id" => "5", "name" => "category 5"),
                              array("id" => "55", "name" => "category 55"),
                             )
);

所以基本上我有一个分配了许多类别的文档。我的最终目标是按ID返回包含特定类别的所有文档。

我有设置映射,文档索引正常。我试过两个"嵌套"类别的映射类型,根本没有映射,"列表"类型,但在创建映射时出错,根本不起作用。

我如何设置"列表"

的示例
array(
    '_source' => array(
        'enabled' => true
    ),
    'properties' => array(                    
        'title' => array(
            'type' => 'string',
            'analyzer' => 'standard'
        ),            
        'description' => array(
            'type' => 'string',
            'analyzer' => 'standard'
        ),            
        'categories' => array(
            "type" => "lists",
            "properties"=> array(
                    "id" => array("type"=> "integer" ),
                    "name" => array( "type"=> "string" ),
                ),
        ),

    )
    );

为了完整起见,我如何将其设置为"嵌套"

array(
    '_source' => array(
        'enabled' => true
    ),
    'properties' => array(                    
        'title' => array(
            'type' => 'string',
            'analyzer' => 'standard'
        ),            
        'description' => array(
            'type' => 'string',
            'analyzer' => 'standard'
        ),            
        'categories' => array(
            "type" => "nested",
            "properties"=> array(
                    "id" => array("type"=> "integer" ),
                    "name" => array( "type"=> "string" ),
                ),
        ),

    )
    );

尝试对嵌套映射进行搜索时,它会告诉我

 QueryParsingException:  [nested] nested object under path [categories] is not of nested type

当尝试对未映射的类别集进行嵌套搜索(默认为系统找到的内容)时,它也会返回与上面相同的错误。

我的问题是:

  1. 我应该为这些类别数组设置哪种映射?

  2. 给出" match_all"查询,我应该使用什么过滤器(以及如何)来获得单个类别?

  3. 非常感谢任何花时间阅读此内容的人,更不用说回答了。我真的希望你能提供帮助。

1 个答案:

答案 0 :(得分:0)

答案很简单。我误读了文档并在我的映射请求中添加了一个额外的对象类型,而不需要在那里。

        'categories' => array(
        "type" => "lists",
        "properties"=> array(
                "id" => array("type"=> "integer" ),
                "name" => array( "type"=> "string" ),
            ),
    ),

应该是

        'categories' => array(          
        "properties"=> array(
                "id" => array("type"=> "integer" ),
                "name" => array( "type"=> "string" ),
            ),
    ),

不需要将数组类型定义为类型,假定它是一个数组。删除后,它会正确加载映射。

现在开始搜索......