次の形式のjsonドキュメントがいくつかあります:-
_source: {
userId: "A1A1",
customerId: "C1",
component: "comp_1",
timestamp: 1408986553,
}
以下に基づいてドキュメントを照会したい:-
(( userId == currentUserId) OR ( customerId== currentCustomerId) OR (currentRole ==ADMIN) ) AND component= currentComponent)
SearchSourceBuilderおよびQueryBuilders.matchQueryを使用してみましたが、ANDおよびOR演算子を使用して複数のサブクエリを配置できませんでした。
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchQuery("userId",userId)).sort("timestamp", SortOrder.DESC).size(count);
ORおよびAND演算子を使用してelasticsearchをクエリする方法は?
この場合、 Bool query がベストショットだと思います。
何かのようなもの :
{
"bool" : {
"must" : { "term" : { "component" : "comp_1" } },
"should" : [
{ "term" : { "userId" : "A1A1" } },
{ "term" : { "customerId" : "C1" } },
{ "term" : { "currentRole" : "ADMIN" } }
],
"minimum_should_match" : 1
}
}
これはJavaで与える:
QueryBuilder qb = QueryBuilders
.boolQuery()
.must(termQuery("component", currentComponent))
.should(termQuery("userId", currentUserId))
.should(termQuery("customerId", currentCustomerId))
.should(termQuery("currentRole", ADMIN))
.minimumNumberShouldMatch(1)
must
の部分はAND
sであり、should
の部分は多かれ少なかれOR
sですが、should
sの最小数を指定できる点が異なります一致するには(minimum_should_match
を使用)、この最小値はデフォルトで1だと思います(ただし、0に設定できます。つまり、should
条件に一致しないドキュメントも返されます)。
ネストされたAND
sおよびOR
sを含むより複雑なクエリを実行する場合は、must
またはshould
パーツ内に他のブールクエリをネストするだけです。
また、正確な値(IDなど)を探している場合、多分 一致クエリの代わりに用語クエリ を使用できます。これにより、分析フェーズが不要になります(これらのフィールドがまったく分析されている場合、これは必ずしもidに対して意味をなさない)。それらが分析された場合でも、それを行うことができますが、用語がどのように格納されているかが正確にわかっている場合のみです( 標準のアナライザーは、それらを小文字で格納します など)。
query_string
query 、あなたのANDとORはLuceneライブラリーによってそのように解釈されます。
これにより、
(currentUserId OR currentCustomerId) AND currentComponent
例えば。デフォルトでは、値はすべてのフィールドで検索されます。