Ответ 1
Если у вас есть дискретный, известный набор категорий, вы можете использовать запрос bool:
"bool" : {
"must" : {
"terms" : { "categories" : ["c", "d"],
minimum_should_match : 2
}
},
"must_not" : {
"terms" : { "categories" : ["a", "b", "e"],
minimum_should_match : 1
}
}
}
В противном случае, вероятно, самый простой способ сделать это, я думаю, состоит в том, чтобы сохранить другое поле, служащее ключевым словом категории.
{"id": 1, "categories" : ["c", "d"], "categorieskey" : "cd"}
Что-то вроде этого. Затем вы можете легко запросить запрос терминов точно для результатов, которые вы хотите, например:
term { "categorieskey" : "cd" }
И вы все равно можете искать не исключительно, как:
term { "categories" : "c" }
Запросить для двух категорий, которые должны присутствовать, достаточно просто, но тогда предотвращение присутствия любых других потенциальных категорий немного сложнее. Вы могли бы это сделать, наверное. Вероятно, вы захотите написать запрос, чтобы найти записи с обоими, а затем применить к нему фильтр, исключая любые записи с категориями, отличными от указанных. Насколько я знаю, Lucene, по сути, предназначен для обработки.
Честно говоря, у меня проблемы с хорошим фильтром для использования здесь. Вам может понадобиться фильтр script, или вы можете фильтровать результаты после их получения.