Полный новичок здесь, вполне возможно, пытающийся сделать невозможное. У меня есть следующая структура, которую я хотел бы сохранить в Elasticsearch:
{
"id" : 1,
"code" : "03f3301c-4089-11e7-a919-92ebcb67fe33",
"countries" : [
{
"id" : 1,
"name" : "Netherlands"
},
{
"id" : 2,
"name" : "United Kingdom"
}
],
"tags" : [
{
"id" : 1,
"name" : "Scanned"
},
{
"id" : 2,
"name" : "Secured"
},
{
"id" : 3,
"name" : "Cleared"
}
]
}
У меня есть полный контроль над тем, как он будет храниться, поэтому структура может меняться, но она должна содержать все эти поля в той или иной форме. Я хотел бы иметь возможность запрашивать эти данные по countries
и tags
таким образом, чтобы возвращались все элементы, имеющие хотя бы одно совпадение, упорядоченные по количеству совпадений. Если это вообще возможно, я бы предпочел не выполнять полнотекстовый поиск.
Например:
id, code, country ids, tag ids
1, ..., [1, 2, 3], [1]
2, ..., [1], [1, 2, 3]
На вопрос: "which of these was in country 1 or has tag 1 or has tag 2"
должно вернуться:
2, ..., [1], [1, 2, 3]
1, ..., [1, 2, 3], [1]
Именно в таком порядке, потому что вторая строка соответствует большему количеству подзапросов в приведенной выше дизъюнкции.
По сути, я хотел бы воспроизвести этот SQL-запрос:
SELECT p.id, p.code, COUNT(p.id) FROM packages p
LEFT JOIN tags t ON t.package_id = p.id
LEFT JOIN countries c ON c.package_id = p.id
WHERE t.id IN (1, 2, 3) OR c.id IN (1, 2, 3)
GROUP BY p.id
ORDER BY COUNT(p.id);
Я использую ElasticSearch 2.4.5, если это имеет значение.
Надеюсь, я был достаточно ясен. Спасибо за помощь!