1

I have severals doc and each doc contains nested fields and I want to order by position depending on thematic id

Document1 :

{
...
    "thematics":[
        {
            "id": 1,
            "position": 100
        },
        {
             "id": 2,
             "position": 1
        }
    ]
}

Document2:

{
...
    "thematics":[
       {
             "id": 2,
             "position": 3
        }
    ]
}

Document3:

{
...
    "thematics":[
       {
             "id": 1,
             "position": 40
        }
    ]
}

For example, I would like to get only documents with thematics which contains id = 2 So I did something like that

$filter = BoolQuery();
...
$filter->addMust(new Query\Term(["thematics.id" => 2]));

And then when I want to apply sort method on position where thematic id = 2 and not something else.

I tried something like that :

case 'atp': // asc thematic position
            $sort = [
                "_score",
                [
                  "thematics.position" => [
                      "order" => "asc",
                      "missing" => 0,
                  ],
                ],
            ];
            break;
...
 $this->setSort($sort);  // call parent method setSort(array()) of elastica-ruflin

Response example :

First case expected : If I want to display all documents from thematic 1 the order must be : Document3 then Document1.

Second case expected : If I want to display all documents from thematic 2 the order must be : Document1 then Document2.

But for now what I've got is :
- First case : Document3, Document1
- Second case : Document2, Document1

I'm guessing that it takes the first thematic's position of document1 to sort in both cases.

Edit : I tried to change de mapping with a nested type

 thematics:
     type: nested
     properties:
     label: { type: string, index: not_analyzed }
     slug: { index: not_analyzed }
     name: { type: string, index: not_analyzed }
     position: { type: integer }
     id: { type: integer }

And the query but still not working

{
"query": {
    "function_score": {
        "query": {
            "bool": {
                "must": [
                    {
                        "bool": {
                            "must": [
                                {
                                    "match_all": {}
                                }
                            ]
                        }
                    }
                ],
                "filter": [
                    {
                        "bool": {
                            "must": [
                                {
                                    "term": {
                                        "is_searchable": true
                                    }
                                },
                                {
                                    "nested": {
                                        "path": "thematics",
                                        "query": {
                                            "term": {
                                                "thematics.id": {
                                                    "value": 2
                                                }
                                            }
                                        }
                                    }
                                },
                                {
                                    "exists": {
                                        "field": "valuation"
                                    }
                                },
                                {
                                    "bool": {
                                        "should": [
                                            {
                                                "bool": {
                                                    "must": [
                                                        {
                                                            "exists": {
                                                                "field": "valuation.translations.fr.title"
                                                            }
                                                        }
                                                    ]
                                                }
                                            },
                                            {
                                                "bool": {
                                                    "must": [
                                                        {
                                                            "exists": {
                                                                "field": "valuation.translations.en.title"
                                                            }
                                                        }
                                                    ]
                                                }
                                            },
                                            {
                                                "bool": {
                                                    "must": [
                                                        {
                                                            "term": {
                                                                "commercial_subcategory.category.id": 33
                                                            }
                                                        }
                                                    ]
                                                }
                                            }
                                        ]
                                    }
                                }
                            ]
                        }
                    }
                ]
            }
        },
        "boost_mode": "multiply",
        "functions": [
            {
                "field_value_factor": {
                    "field": "booster",
                    "modifier": "square"
                }
            }
        ]
    }
},
"sort": [
    "_score",
    {
        "thematics.position": {
            "order": "asc",
            "missing": 0,
            "mode": "min",
            "nested_filter": {
                "term": {
                    "thematics.id": {
                        "value": 2
                    }
                }
            }
        }
    }
]
}

Edit2: I get around the problem. I changed my mapping so each document looks like that :

{
...
    "thematics":[
        "1": {
            "id": 1,
            "position": 100
         },
        "2": {
             "id": 2,
             "position": 1
         }
    ]
}

And then I apply a Bool Query must / Exists Filter on "thematics.".$thematicId

And finally, my sort method looks like this :

case 'atp': // asc thematic position
        $sort = [
            "_score",
            [
              "thematics." . $thematicId . ".position" => [
                  "order" => "asc",
                  "missing" => 0,
              ],
            ],
        ];
        break;
 ...
 $this->setSort($sort);  // call parent method setSort(array()) of elastica-ruflin
Fr0z3n7
  • 2,548
  • 2
  • 14
  • 15

0 Answers0