ElasticsearchクエリのTermsFilterBuilder
2181 ワード
Luceneは大量のterm値クエリーを行う場合、この値が多すぎて1024個を超えると、
TooManyClauses[maxClauseCount is set to 1024]の異常なので、termが多すぎる場合はqueryではなくfilterを採用することをお勧めします.
以下に、ESにおけるこのシナリオのテストを示す.
上記の結果、TermsQueryBuilderで問い合わせると、9999個のterm値が設定されているため、TooManyClausesの異常が発生することがわかります.したがって、termが多すぎる場合、queryではなくfilterを採用することを提案する.
TooManyClauses[maxClauseCount is set to 1024]の異常なので、termが多すぎる場合はqueryではなくfilterを採用することをお勧めします.
以下に、ESにおけるこのシナリオのテストを示す.
Settings defaultSettings = ImmutableSettings.settingsBuilder().put("client.transport.sniff", true).build();
Settings finalSettings = ImmutableSettings.settingsBuilder().put(defaultSettings)
.put("name", NetworkUtils.getLocalAddress().getHostName()).build();
TransportClient tmp = new TransportClient(finalSettings);
Client client = tmp.addTransportAddress(new InetSocketTransportAddress("127.0.0.1", 9300));
//demo 100
for (int i = 0; i < 1000000; i++)
{
client.prepareIndex("test2", "book",String.valueOf(i)).setSource("bookid", String.valueOf(i), "booktype", String.valueOf(i%10000)).execute()
.actionGet();
}
//demo 1 term
String[] values = new String[10000];
for (int i = 1; i < 10000; i++)
{
values[i] = String.valueOf(i);
}
//terms query
//TermsQueryBuilder termQueryBuilder = new TermsQueryBuilder("booktype", values);
TermsFilterBuilder termsFilterBuilder = new TermsFilterBuilder("booktype", values);
// SearchResponse searchResponse = client.prepareSearch().setIndices("test2").setQuery(termQueryBuilder)
// .setFrom(0).setSize(100).execute().actionGet();
//terms filter
SearchResponse searchResponse = client.prepareSearch().setIndices("test2").setQuery(QueryBuilders.matchAllQuery()).setFilter(termsFilterBuilder)
.setFrom(0).setSize(100).execute().actionGet();
SearchHits hits = searchResponse.getHits();
System.out.println(hits.totalHits());
for (SearchHit searchHit : hits)
{
System.out.println(searchHit.getId() + ":" + searchHit.getSource().get("booktype"));
}
上記の結果、TermsQueryBuilderで問い合わせると、9999個のterm値が設定されているため、TooManyClausesの異常が発生することがわかります.したがって、termが多すぎる場合、queryではなくfilterを採用することを提案する.