個別の既知のカテゴリセットがある場合は、boolクエリを使用できます。
"bool" : {
"must" : {
"terms" : { "categories" : ["c", "d"],
minimum_should_match : 2
}
},
"must_not" : {
"terms" : { "categories" : ["a", "b", "e"],
minimum_should_match : 1
}
}
}
そうでなければ、おそらくこれを達成するための最も簡単な方法は、categoriesキーワードとして機能する別のフィールドを格納することだと思います。
{"id": 1, "categories" : ["c", "d"], "categorieskey" : "cd"}
そんな感じ。次に、次のように、用語クエリを使用して、必要な結果を正確にクエリすることができます。
term { "categorieskey" : "cd" }
そして、次のように、非排他的に検索することもできます。
term { "categories" : "c" }
両方が存在する必要がある2つのカテゴリをクエリするのは簡単ですが、他の潜在的なカテゴリが存在しないようにするのは少し難しいです。あなたはおそらくそれを行うことができます。おそらく、両方のレコードを検索するクエリを作成し、それにフィルタを適用して、指定されたカテゴリ以外のカテゴリのレコードを削除することをお勧めします。私の知る限り、Luceneが実際に処理するように設計されているのは実際には一種の検索ではありません。
正直なところ、ここで使用するのに適したフィルターを思い付くのに少し問題があります。スクリプトフィルターが必要な場合もあれば、取得後に結果をフィルターすることもできます。