ElasticSearch Javaクエリあるフィールドがnullでも空でもないエントリ
5327 ワード
最近、あるフィールドがnullでも「」でもないことをクエリーする必要があるが、ネット上にはESクエリーの一部のフィールドがnullと「」であることに関するブログがたくさんあり、検討してみると、3つの案があることが分かった.
シナリオ1:existsQueryキーを使用して、nullの値を持つフィールドがあるエントリをクエリーしますが、「」の値を持つフィールドはフィルタできません.
シナリオ2:wildcardQueryキーワードの使用
シナリオ3:ASCIIコードを用いて比較すると、まずnullのASCIIは0、スペースのASCIIは32、空文字のASCIIも0(
補足:
1.シナリオ1は最良のシナリオです.ESでは、あるフィールドの値がnullで表示されません.「」であれば表示されます.問題はここにあります.シナリオは良いが、要求に合わないので、ESにデータを追加するときは、
2.シナリオ2はあいまいなクエリーで、
3.シナリオ3はASCIIコードを利用して範囲照会を行い、速度に問題はなく、高同時性の場合もテストはない.
シナリオ1:existsQueryキーを使用して、nullの値を持つフィールドがあるエントリをクエリーしますが、「」の値を持つフィールドはフィルタできません.
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
List<QueryBuilder> must = boolQueryBuilder.must();
must.add(QueryBuilders.boolQuery().must((QueryBuilders.existsQuery(" "))));
シナリオ2:wildcardQueryキーワードの使用
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
List<QueryBuilder> must = boolQueryBuilder.must();
// , :
must.add(QueryBuilders.wildcardQuery(" ", "*"));
シナリオ3:ASCIIコードを用いて比較すると、まずnullのASCIIは0、スペースのASCIIは32、空文字のASCIIも0(
)のようで、このとき範囲で比較することができます. BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
List<QueryBuilder> must = boolQueryBuilder.must();
RangeQueryBuilder range = QueryBuilders.rangeQuery(" ");
//ASCII 0( 0 , "" , "" ASCII 0 )
range.gt(0);
must.add(range);
補足:
1.シナリオ1は最良のシナリオです.ESでは、あるフィールドの値がnullで表示されません.「」であれば表示されます.問題はここにあります.シナリオは良いが、要求に合わないので、ESにデータを追加するときは、
に違いありません.疑いのないときは自分に迷惑をかけるからです.2.シナリオ2はあいまいなクエリーで、
の効率が最も低く、クエリーに最もリソースがかかります.私が今使っているのはこれです.私は5000万近くのデータの中でクエリーに問題がないので、戻る速度も50ミリ秒以上(ページをめくった)で、高い同時状況でどうなるか分からないので、後で問題が発生したらみんなに報告します.3.シナリオ3はASCIIコードを利用して範囲照会を行い、速度に問題はなく、高同時性の場合もテストはない.