7

私はエラスティックサーチが初めてです。コンソールを使用して正しい結果を得るフィルター処理されたクエリがあります。

GET _search
{
  "query": {
    "filtered": {
      "query": {
             "bool" : {
            "should" : [
              {
                "match" : { "name" : "necklace" }
              },
              {
                "match" : { "skuCode" : "necklace" }
              }
            ]
        }
          },
      "filter": {
            "bool" : {
              "must" : [
                {
                  "term" : { "enabled" : true }
                },
                {
                  "term" : { "type" : "SIMPLE" }
                },
                {
                  "term" : { "tenantCode" : "Triveni" }
                }
              ]
            }
          }
    }
  }
}

対応する spring-data バージョンを取得できません。これが私が試したものです:

SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(boolQuery().should(matchQuery("skuCode", keyword)).should(matchQuery("name", keyword))).withFilter(
                boolFilter().must(termFilter("enabled", true), termFilter("type", "SIMPLE"), termFilter("tenantCode", "Triveni"))).build();

このクエリでは結果が得られません。

誰かがこれで私を助けてくれますか?

4

1 に答える 1

5

NativeSearchQueryBuilder.withFilter はいわゆるpost_filterに変換されます。詳細については、投稿フィルターを参照してください。そのため、コンソールで実行したクエリは、spring-data elasticsearch によって生成されたクエリとは異なります。コンソールからのクエリを模倣するには、代わりにFilteredQueryを使用する必要があります。

クエリの構築を次のように変更します。

QueryBuilder boolQueryBuilder = boolQuery().should(matchQuery("skuCode", keyword)).should(matchQuery("name", keyword));
FilterBuilder filterBuilder = boolFilter().must(termFilter("enabled", true), termFilter("type", "SIMPLE"), termFilter("tenantCode", "Triveni"));
NativeSearchQueryBuilder().withQuery(QueryBuilders.filteredQuery(boolQueryBuilder, filterBuilder).build();

集計を使用しない限り、これが (ヒット) 結果に影響することはありません。

于 2015-08-03T14:32:33.337 に答える