Elasticsearch equivalent to SelectMany



我在 Elasticsearch 索引中有一个嵌套类型:

class Category
{
public string Name;
public Category Child;
public Guid[] ProductIds;
}

例如:

Category1
|_Category2
|_Category3
|_Category4

类别 3 和类别 4 各有 2 个产品。

通过搜索"Category3"获取所有 4 个产品 ID 的正确 NEST 查询是什么?

我想象这样的东西,但实际上无法让它工作:

var response = await elasticClient.SearchAsync<Category>(s => s
.StoredFields(sf => sf
.Fields(f => f.ProductIds)
)
.Query(q => q
.Nested(n => n
.Path(p => p.Child)
.Query(mu => mu
.Bool(b => b
.Must(m => m
.Match(m => m
.Query("Category Name")
)
)
)
)
)
)
)

其中一个选项可能是创建一种面包屑层次结构列,并使用anlyzer和facet对其进行搜索。

因此,索引可以对列和分析器进行类似的设置

"btb_breadcrumb": {
"type": "text",
"fields": {
"facet": { 
"type":  "text",
"analyzer": "custom_path_tree",
"fielddata": "true"
}
}
},  

"settings" : {
"analysis": {
"analyzer": {
"english_exact": {
"tokenizer": "standard",
"filter": [
"lowercase"
]
},
"custom_path_tree": {
"tokenizer": "custom_hierarchy"
},
"custom_path_tree_reversed": {
"tokenizer": "custom_hierarchy_reversed"
}           
},
"tokenizer": {
"custom_hierarchy": {
"type": "path_hierarchy",
"delimiter": ">"
},
"custom_hierarchy_reversed": {
"type": "path_hierarchy",
"delimiter": ">",
"reverse": "true"
}
}   
}
}         

然后你可以像这样搜索这个列

{

"bool" : 
{
"must" : 
[               
{"match" : {"btb_breadcrumb.facet" :  "catid1>catid2>"}}
]
}

}

现在,这将为您提供具有catid2的所有项目及其所有子类别。同样,如果要获取属于 catid1 的任何子级的所有项,则可以使用以下查询。

{

"bool" : 
{
"must" : 
[               
{"match" : {"btb_breadcrumb.facet" :  "catid1>"}}
]
}

}

最新更新