2

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
4
  • so, it's not working? could you show sample response? Commented Feb 10, 2017 at 7:52
  • @Mysterion I just did it, hope it's clearer Commented Feb 10, 2017 at 9:51
  • 1
    Your question looks similar to stackoverflow.com/questions/35746662/… Commented Feb 10, 2017 at 10:38
  • @nikoshr thanks, I'll have a look Commented Feb 13, 2017 at 10:31

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.