I have index definition like this:
{
"settings": {
"index": {
"number_of_shards": 1,
"number_of_replicas": 0
},
},
"mappings": {
"properties": {
"parameters_for_filter": {
"type": "nested",
"properties": {
"parameters": {
"type": "nested",
"properties": {
"parameter_id": {
"type": "integer"
},
"parameter_value_id": {
"type": "integer"
}
}
}
}
}
}
}
}
This is the exported result for one product:
{
"_index": "product_1_9107bbdeb03269e1142d9822e585008c",
"_type": "_doc",
"_id": "69",
"_version": 1,
"_score": 0,
"_source": {
"id": 69,
"parameters_for_filter": {
"parameters": [
[
{
"parameter_id": 5,
"parameter_value_id": 10
},
{
"parameter_id": 3,
"parameter_value_id": 251
},
{
"parameter_id": 1,
"parameter_value_id": 248
}
],
[
{
"parameter_id": 5,
"parameter_value_id": 16
},
{
"parameter_id": 3,
"parameter_value_id": 251
},
{
"parameter_id": 1,
"parameter_value_id": 254
}
]
]
}
}
}
Another product:
{
"_index": "product_1_9107bbdeb03269e1142d9822e585008c",
"_type": "_doc",
"_id": "83",
"_version": 5,
"_score": 0,
"_source": {
"id": 83,
"parameters_for_filter": {
"parameters": [
[
{
"parameter_value_id": 10,
"parameter_id": 5
},
{
"parameter_value_id": 251,
"parameter_id": 3
},
{
"parameter_value_id": 254,
"parameter_id": 1
}
],
[
{
"parameter_value_id": 16,
"parameter_id": 5
},
{
"parameter_value_id": 121,
"parameter_id": 2
},
{
"parameter_value_id": 254,
"parameter_id": 1
}
]
]
}
}
}
Each sub-array inside parameters_for_filter.parameters represents parameters of individual variants of a product.
What I need to do is get the product with ID 69 for combination of filters:
{{parameter_id: 5, parameter_value_id: 10}, {parameter_id: 1, parameter_value_id: 248}}.
Get the product with ID 83 for combination of filters:
{{parameter_id: 5, parameter_value_id: 10}, {parameter_id: 1, parameter_value_id: 254}}.
Get both products for combination of filters:
{{parameter_id: 5, parameter_value_id: 16}, {parameter_id: 1, parameter_value_id: 254}}.
Get no products for combination of filters:
{{parameter_id: 5, parameter_value_id: 16}, {parameter_id: 1, parameter_value_id: 248}}.
With current query I get the product with all 3 above combinations:
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": [
{
"nested": {
"path": "parameters_for_filter.parameters",
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": [
{
"term": {
"parameters_for_filter.parameters.parameter_id": 5
}
},
{
"terms": {
"parameters_for_filter.parameters.parameter_value_id": [
10
]
}
}
]
}
}
}
},
{
"nested": {
"path": "parameters_for_filter.parameters",
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": [
{
"term": {
"parameters_for_filter.parameters.parameter_id": 1
}
},
{
"terms": {
"parameters_for_filter.parameters.parameter_value_id": [
248
]
}
}
]
}
}
}
}
]
}
}
}
What would the filter that would accomplish what I need look like or is there a better structure that I could use for parameters of product variants in eshop (without exporting variants as separate objects)?
{{parameter_id: 5, parameter_value_id: 10}, {parameter_id: 1, parameter_value_id: 254}}or all combinations that don't fulfil the 2 either/or combinations?parameters_for_filter.parameters. Also, are you familiar with inner hits in nested docs? elastic.co/guide/en/elasticsearch/reference/6.8/… ?