0

シリーズの次のエピソードを見つけるためにelasticSearchを使用しています。これを行うには、最初に前のエピソードよりも高いseasonまたは高いエピソードをフィルタリングしてから、昇順で並べ替え、結果を 1 に制限します。episodeseasonepisode

    ...            
        FilterBuilder sameSeriesFilter = termsFilter("tvShowId", previousEpisode.getTvShowId());
        FilterBuilder greaterEpisodeFilter = rangeFilter("episode").gt(previousEpisode.getEpisode());
        FilterBuilder greaterSeasonFilter = rangeFilter("season").gt(previousEpisode.getSeason());
        List<Sort.Field> sortFields = Arrays.asList(new Sort.Field("season", Sort.Order.ASC),new Sort.Field("episode", Sort.Order.ASC));
        Sort episodeSort = new Sort(sortFields);


        AndFilterBuilder filter = FilterBuilders.andFilter(
                sameSeriesFilter,
                orFilter(
                        greaterEpisodeFilter,
                        greaterSeasonFilter
                )
        );

        String query = filter.toString(); //here for debugging purposes

        return client.getItems(GetItems
            .<Asset>newBuilder()
                .index(index)
                .filter(filter)
                .sort(episodeSort)
                .page(1,1)
                .type(ASSET)
                .tClass(Asset.class)
                .build()
        );
    }).map(assetHitList ->
            assetHitList.getHits().isEmpty() ? null : assetHitList.getHits().get(0)) ;
}

実行時にフィルターを文字列として抽出すると、次のクエリが得られます。

    {
  "and" : {
    "filters" : [ {
      "terms" : {
        "tvShowId" : [ "breaking-bad" ]
      }
    },{
      "or" : {
        "filters" : [ {
          "range" : {
            "episode" : {
              "from" : 1,
              "to" : null,
              "include_lower" : false,
              "include_upper" : true
            }
          }
        }, {
          "range" : {
            "season" : {
              "from" : 2,
              "to" : null,
              "include_lower" : false,
              "include_upper" : true
            }
          }
        } ]
      }
    } ]
  }
}

紛らわしいことに、次のようになります。

{
  "assetId" : "breaking-bad-s01-e1_foobar",
  "tvShowId" : "breaking-bad"
  "episode" : "1",
  "season" : "1",
  "originalTitle" : "Dummy breaking-bad-s01-e1_foobar",
}

(簡潔にするために一部のフィールドは削除されています)

episodeフィルターが指定していても (私は思っていました)、結果のとseasonは両方とも 1 であることに注意してください。

また、並べ替えを逆にして降順に並べ替えてみたところ、まったく別のシリーズのエピソードになったので、sameSeriesFilterどちらも適用されていないようですが、並べ替えは機能しているようです!

とにかく...ここで何が起こっているのですか?

更新: 言い忘れましたが、これは ES の v.1.7 です。

私はなんとかそれを機能させることができましたが、何か不思議なことが起こっています. 気まぐれで、空の matchAll クエリを追加しました。これは何もしないはずですが、何らかの理由ですべてが機能します。フィルタが正しく適用されるようになりました。ESはこのように動作するはずですか?もしそうなら、なぜですか?新しい作業コード:

     return client.getItems(GetItems
            .<Asset>newBuilder()
                .index(index)
                .matchAllQuery()  //<--this made it work!?!
                .filter(filter)
                .sort(episodeSort)
                .page(1,1)
                .type(ASSET)
                .tClass(Asset.class)
                .build()
        );
4

0 に答える 0