web-dev-qa-db-ja.com

ORおよびElasticsearchクエリのAND演算子

次の形式の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をクエリする方法は?

15
Udit Bhatia

この場合、 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の部分はANDsであり、shouldの部分は多かれ少なかれORsですが、shouldsの最小数を指定できる点が異なります一致するには(minimum_should_matchを使用)、この最小値はデフォルトで1だと思います(ただし、0に設定できます。つまり、should条件に一致しないドキュメントも返されます)。

ネストされたANDsおよびORsを含むより複雑なクエリを実行する場合は、mustまたはshouldパーツ内に他のブールクエリをネストするだけです。

また、正確な値(IDなど)を探している場合、多分 一致クエリの代わりに用語クエリ を使用できます。これにより、分析フェーズが不要になります(これらのフィールドがまったく分析されている場合、これは必ずしもidに対して意味をなさない)。それらが分析された場合でも、それを行うことができますが、用語がどのように格納されているかが正確にわかっている場合のみです( 標準のアナライザーは、それらを小文字で格納します など)。

34
xlecoustillier

query_string query 、あなたのANDとORはLuceneライブラリーによってそのように解釈されます。

これにより、

(currentUserId OR currentCustomerId) AND currentComponent

例えば。デフォルトでは、値はすべてのフィールドで検索されます。

2
Alix Martin