我对ElasticSearch很陌生,我认为我在脑子里犯了一些错误,关于它应该如何工作。我无法通过谷歌找到帮助,也不确定是因为我,还是因为ElasticSearch仍然很新。
我们是一家电子商务公司。我们拥有一个坚实的平台,客户可以在其上管理和销售产品。它们可以有多个子平台,并且可以为每个子平台启用/禁用产品。
因此,每个ElasticSearch过滤器(聚合,方面,无论名称是什么 - 我真的可以选择ES字典)都必须默认过滤此子平台ID。对于Solr,我可以查看每个文档应该是什么样子,但到目前为止还没有ES的喜悦。
我认为这将是
的内容<doc>
<field name="subplatforms">[1, 120, 360]</field>
<field name="name">Product 1</field>
<field name="categories">['Apparel', 'Shoes', 'Nike']</field>
</doc>
这是Solr中的XML文件应该是什么样子,但由于ES没有这样的东西,我只是这样写出来。
要显示每个所选类别的过滤器,搜索将类似于:
curl -XPOST "http://localhost:9200/products/_search" -d'
{
"size": 0,
"aggregations": {
"filter": {
"term": { "category": "Shoes"
}
}
}
}'
右?我们不希望显示类别的存储桶,因为这是在ElasticSearch之外完成的。但是,我们确实希望在桶中显示所选类别中每个可能选择的所有聚合。对于每个具有“鞋子”类别的产品,它应该找到所有可能的聚合(如何定义它们?),如鞋码,鞋带颜色,鞋带类型(平/圆)等。
我很困惑,到目前为止,我找到的所有资源都没有帮助我。新手文档确实缺乏。
答案 0 :(得分:5)
如果您有以下文件:
curl -XPOST 'http://localhost/test/product' -d'
{
"name": "Product 1",
"categories":["Apparel", "Shoes", "Nike"],
"shoesize":[38, 39, 40],
"lacecolor": "blue"
}'
curl -XPOST 'http://localhost/test/product' -d'
{
"name": "Product 2",
"categories":["Shoes"],
"shoesize":[38, 39, 40, 41],
"lacecolor": "red"
}'
然后获得一个聚类,首先按类别分组,然后穿鞋和鞋带颜色桶:
curl -XGET 'http://localhost/test/product/_search?pretty' -d '{
"query": { "match_all": { } },
"aggs" : {
"category_agg" : {
"terms" : { "field" : "categories" } ,
"aggs" : {
"shoesize_agg" : { "terms" : { "field" : "shoesize" } },
"lacecolor_agg" : { "terms" : { "field" : "lacecolor" } }
}
}
}
}'
如果你想对聚合进行过滤 - 例如因为用户已搜索特定术语或选择了一个类别,我会将该标准放在查询语句中(即不是agg过滤器):
curl -XGET 'http://localhost/test/product/_search?pretty' -d '{
"query": {
"filtered": {
"query": {"query_string" :{"query" :"blue"}},
"filter" : { "terms" : {"categories" : ["shoes"]} }}},
"aggs" : {
"category_agg" : {
"terms" : { "field" : "categories" } ,
"aggs" : {
"shoesize_agg" : { "terms" : { "field" : "shoesize" } },
"lacecolor_agg" : { "terms" : { "field" : "lacecolor" } }
}
}
}
}'