3

我有以下示例 mappipng:

{
    “书” : {
        “特性” : {
                        “作者”:{“类型”:“字符串”},
                        “标题”:{“类型”:“字符串”},
                        “评论”:{
                                “特性” : {
                                        “网址”:{“类型”:“字符串”},
                                        “分数”:{“类型”:“整数”}
                                }
                        },
                        “章节”:{
                                “include_in_root”:1,
                                “类型”:“嵌套”,
                                “特性” : {
                                        “名称”:{“类型”:“字符串”}
                                }
                        }
                }
        }
}

我想了解评论数量的一个方面——即“评论”数组的长度。例如,我需要的口头结果是:“100 个文档,10 个评论,20 个文档,5 个评论,......”

我正在尝试以下统计方面:

{
    “询问” : {
        “match_all”:{}
    },
    “方面”:{
        “stat1”:{
            “统计”:{“脚本”:“doc['reviews.score'].values.size()”}
        }
    }
}

但它一直失败:

{
  “错误”:“SearchPhaseExecutionException[未能执行阶段 [query_fetch],完全失败;shardFailures {[mDsNfjLhRIyPObaOcxQo2w][facettest][0]:QueryPhaseExecutionException[[facettest][0]:query[ConstantScore(NotDeleted(cache(org.elasticsearch) .index.search.nested.NonNestedDocsFilter@a2a5984b)))],from[0],size[10]: 查询失败 [无法执行主查询]]; 嵌套: PropertyAccessException [[错误: 无法访问: 评论; 在类:org.elasticsearch.search.lookup.DocLookup]
[附近:{... doc[reviews.score].values.size() ....}]
                 ^
[行:1,列:5]];}]",
  “状态”:500
}

我怎样才能实现我的目标?

ElasticSearch 版本是 0.19.9。

这是我的示例数据:

{
        “作者”:“马克吐温”,
        "title" : "汤姆索亚历险记",
        “评论”:[
                {
                        “网址”:“amazon.com”,
                        “分数”:10
                },
                {
                        “网址”:“www.barnesandnoble.com”,
                        “分数”:9
                }
        ],
        “章节”:[
                {“名称”:“第 1 章”},{“名称”:“第 2 章”}
        ]
}

{
        “作者”:“杰克伦敦”,
        "title" : "野性的呼唤",
        “评论”:[
                {
                        “网址”:“amazon.com”,
                        “分数”:8
                },
                {
                        “网址”:“www.barnesandnoble.com”,
                        “分数”:9
                },
                {
                        “网址”:“www.books.com”,
                        “分数”:5
                }
        ],
        “章节”:[
                {“名称”:“第 1 章”},{“名称”:“第 2 章”}
        ]
}
4

1 回答 1

6

看起来您正在使用 curl 执行查询,并且此 curl 语句如下所示: curl localhost:9200/my-index/book -d '{....}'

这里的问题是,因为您使用撇号来包装请求的主体,所以您需要转义它包含的所有撇号。所以,你的脚本应该变成:

{"script" : "doc['\''reviews.score'\''].values.size()"}

或者

{"script" : "doc[\"reviews.score"].values.size()"}

第二个问题是,从您的描述看来,您正在寻找直方图方面范围方面,而不是统计方面。所以,我建议尝试这样的事情:

curl "localhost:9200/test-idx/book/_search?search_type=count&pretty" -d '{
    "query" : {
        "match_all" : {}
    },
    "facets" : {
        "histo1" : {
            "histogram" : {
                "key_script" : "doc[\"reviews.score\"].values.size()",
                "value_script" : "doc[\"reviews.score\"].values.size()",
                "interval" : 1
            }
        }        
    }
}'

第三个问题是,将为结果列表中的每条记录调用构面中的脚本,如果您有很多结果,则可能需要很长时间。因此,我建议索引一个名为的附加字段number_of_reviews,该字段应填充您客户的评论数量。那么您的查询将简单地变为:

curl "localhost:9200/test-idx/book/_search?search_type=count&pretty" -d '{
    "query" : {
        "match_all" : {}
    },
    "facets" : {
        "histo1" : {
            "histogram" : {
                "field" : "number_of_reviews"
                "interval" : 1
            }
        }        
    }
}'
于 2013-01-30T21:12:36.683 回答