我正在尝试根据我编入索引的某些产品属性创建过滤器。早些时候,他们的索引如下 - :
"attributes": {
"name1": "value1",
"name2": "value2",
....
}
我之前使用的过滤器是根据URL查询参数生成的,如下所示:
"/search?q=product&color=black&color=blue&size=xl"
会导致 -
>>> and_filter = ANDFilter(
[
ORFilter(
[
TermFilter('color', 'blue'),
TermFilter('color', 'black')
]
),
ORFilter(
[
TermFilter('size', 'xl')
]
)
]
)
>>> main_filter = BoolFilter().add_must(and_filter)
由于后端发生了一些变化,映射必须更改为嵌套映射。
新映射 - :
"attributes":
{
"type": "nested",
"properties": {
"name": {"type": "string"},
"display_name": {"type": "string"},
"type": {"type": "string"},
"value": {"type": "string"}
}
}
我想到了新的过滤器 - :
>>> and_filter = ANDFilter(
[
ORFilter(
[
ANDFilter(
[
TermFilter("attributes.name", "color"),
TermFilter("attributes.value", "blue"),
]
),
ANDFilter(
[
TermFilter("attributes.name", "color"),
TermFilter("attributes.value", "black"),
]
)
]
),
ORFilter(
[
ANDFilter(
[
TermFilter("attributes.name", "size"),
TermFilter("attributes.value", "xl"),
]
)
]
)
]
)
>>> nested_filter = NestedFilter("attributes", BoolFilter().add_must(and_filter))
但是,这似乎不是正确的方法。当我尝试使用应用此过滤器的产品生成方面时,所有计数每次都为零。
此外,尝试搜索产品时,在应用过滤器时不会产生预期的结果。
我很欣赏有关如何正确设计过滤器的一些指示。
修改
旧过滤器 - :
{
"bool": {
"must": [
{
"and": [
{
"or": [
{
"term": {
"color": "blue"
}
},
{
"term": {
"color": "black"
}
}
]
},
{
"or": [
{
"term": {
"size": "xl"
}
}
]
}
]
}
]
}
}
新过滤器 - :
{
"nested": {
"filter": {
"bool": {
"must": [
{
"and": [
{
"or": [
{
"and": [
{
"term": {
"attributes.name": "color"
}
},
{
"term": {
"attributes.value": "blue"
}
}
]
},
{
"and": [
{
"term": {
"attributes.name": "color"
}
},
{
"term": {
"attributes.value": "black"
}
}
]
}
]
},
{
"or": [
{
"and": [
{
"term": {
"attributes.name": "size"
}
},
{
"term": {
"attributes.value": "xl"
}
}
]
}
]
}
]
}
]
}
},
"path": "attributes"
}
}