Как сделать заказ по дочерним узлам в ElasticSearch - PullRequest
0 голосов
/ 13 июня 2019

Я пытаюсь отсортировать некоторые товары по дочерним узлам. У меня есть продукты, для каждого продукта есть дочерний узел "stock" (содержит productId (поле соединения), stockId, QuantityAvailable, amountReserved ...), может быть несколько дочерних узлов, и мне нужно суммировать количество продуктаAvailable из всех запасов и сортировать по ним , Но, как я узнал, запросы на упругость поиска для сортировки - сложная задача.

Я пытался найти в Google похожие проблемы, и все, что я получил от Google, - это использовать скрипт и фактор (см. Код ниже). Но я не знаю, как работать с этими решениями, в таком запросе. Это сложно, но если вы хорошо знаете ElasticSearch, я думаю, вы поймете эту проблему, увидев это краткое описание и мой код, который я начал писать из руководств Google:

SearchDescriptor<T> res = ...;
res.Sort(sort => {
                        foreach (var item in Order)
                        {
                            if (item.ColumnName == "quantity")
                            {
                                sort.Script(sc => sc
                                    .Type("number")
                                    .Ascending()
                                    .Script(script => script
                                        .Source("doc['stockQuantityAvailable'].value * params.factor")
                                        .Params(p => p.Add("factor", 1.1))
                                    )
                                );
                            }
                            else if(new[] { "productId", "vendorName", "productType", "name" }.Contains(item.ColumnName))
                            {
                                sort.Field(f =>
                                {
                                    f.Field(new Field(item.ColumnName));
                                    f.Order(item.Ascending ? SortOrder.Ascending : SortOrder.Descending);
                                    return f;
                                });
                            }

                        }
                        return sort;
                    });
...