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