nicer bench of terms facet

This commit is contained in:
kimchy 2011-04-07 14:16:21 +03:00
parent 7231e08f7c
commit 7decb701d9
1 changed files with 81 additions and 209 deletions

View File

@ -22,17 +22,22 @@ package org.elasticsearch.benchmark.search.facet;
import org.elasticsearch.action.admin.cluster.health.ClusterHealthResponse; import org.elasticsearch.action.admin.cluster.health.ClusterHealthResponse;
import org.elasticsearch.action.bulk.BulkResponse; import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.client.Client; import org.elasticsearch.client.Client;
import org.elasticsearch.client.Requests; import org.elasticsearch.client.Requests;
import org.elasticsearch.client.action.bulk.BulkRequestBuilder; import org.elasticsearch.client.action.bulk.BulkRequestBuilder;
import org.elasticsearch.common.RandomStringGenerator; import org.elasticsearch.common.RandomStringGenerator;
import org.elasticsearch.common.StopWatch; import org.elasticsearch.common.StopWatch;
import org.elasticsearch.common.collect.Lists;
import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.unit.SizeValue; import org.elasticsearch.common.unit.SizeValue;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.util.concurrent.jsr166y.ThreadLocalRandom; import org.elasticsearch.common.util.concurrent.jsr166y.ThreadLocalRandom;
import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.node.Node; import org.elasticsearch.node.Node;
import java.util.List;
import static org.elasticsearch.client.Requests.*; import static org.elasticsearch.client.Requests.*;
import static org.elasticsearch.cluster.metadata.IndexMetaData.*; import static org.elasticsearch.cluster.metadata.IndexMetaData.*;
import static org.elasticsearch.common.settings.ImmutableSettings.*; import static org.elasticsearch.common.settings.ImmutableSettings.*;
@ -46,6 +51,16 @@ import static org.elasticsearch.search.facet.FacetBuilders.*;
*/ */
public class TermsFacetSearchBenchmark { public class TermsFacetSearchBenchmark {
static long COUNT = SizeValue.parseSizeValue("100k").singles();
static int BATCH = 100;
static int QUERY_WARMUP = 20;
static int QUERY_COUNT = 200;
static int NUMBER_OF_TERMS = 200;
static int NUMBER_OF_MULTI_VALUE_TERMS = 10;
static int STRING_TERM_SIZE = 5;
static Client client;
public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {
Settings settings = settingsBuilder() Settings settings = settingsBuilder()
.put("index.refresh_interval", "-1") .put("index.refresh_interval", "-1")
@ -59,15 +74,7 @@ public class TermsFacetSearchBenchmark {
Node clientNode = nodeBuilder().settings(settingsBuilder().put(settings).put("name", "client")).client(true).node(); Node clientNode = nodeBuilder().settings(settingsBuilder().put(settings).put("name", "client")).client(true).node();
Client client = clientNode.client(); client = clientNode.client();
long COUNT = SizeValue.parseSizeValue("2m").singles();
int BATCH = 100;
int QUERY_WARMUP = 20;
int QUERY_COUNT = 200;
int NUMBER_OF_TERMS = 200;
int NUMBER_OF_MULTI_VALUE_TERMS = 10;
int STRING_TERM_SIZE = 5;
long[] lValues = new long[NUMBER_OF_TERMS]; long[] lValues = new long[NUMBER_OF_TERMS];
for (int i = 0; i < NUMBER_OF_TERMS; i++) { for (int i = 0; i < NUMBER_OF_TERMS; i++) {
@ -96,7 +103,7 @@ public class TermsFacetSearchBenchmark {
XContentBuilder builder = jsonBuilder().startObject(); XContentBuilder builder = jsonBuilder().startObject();
builder.field("id", Integer.toString(counter)); builder.field("id", Integer.toString(counter));
builder.field("s_value", sValues[counter % sValues.length]); builder.field("s_value", sValues[counter % sValues.length]);
builder.field("i_value", lValues[counter % lValues.length]); builder.field("l_value", lValues[counter % lValues.length]);
builder.startArray("sm_value"); builder.startArray("sm_value");
for (int k = 0; k < NUMBER_OF_MULTI_VALUE_TERMS; k++) { for (int k = 0; k < NUMBER_OF_MULTI_VALUE_TERMS; k++) {
@ -137,211 +144,76 @@ public class TermsFacetSearchBenchmark {
System.out.println("--> Number of docs in index: " + COUNT); System.out.println("--> Number of docs in index: " + COUNT);
long totalQueryTime = 0; List<StatsResult> stats = Lists.newArrayList();
stats.add(terms("terms_s", "s_value", null));
stats.add(terms("terms_map_s", "s_value", "map"));
stats.add(terms("terms_l", "l_value", null));
stats.add(terms("terms_map_l", "l_value", "map"));
stats.add(terms("terms_sm", "sm_value", null));
stats.add(terms("terms_map_sm", "sm_value", "map"));
stats.add(terms("terms_lm", "lm_value", null));
stats.add(terms("terms_map_lm", "lm_value", "map"));
// S_VALUE System.out.println("------------------ SUMMARY -------------------------------");
client.admin().indices().prepareClearCache().setFieldDataCache(true).execute().actionGet(); System.out.format("%25s%10s%10s\n", "name", "took", "millis");
for (StatsResult stat : stats) {
System.out.println("--> Warmup (s_value) ..."); System.out.format("%25s%10s%10d\n", stat.name, TimeValue.timeValueMillis(stat.took), (stat.took / QUERY_COUNT));
// run just the child query, warm up first
for (int j = 0; j < QUERY_WARMUP; j++) {
SearchResponse searchResponse = client.prepareSearch()
.setQuery(matchAllQuery())
.addFacet(termsFacet("s_value").field("s_value"))
.execute().actionGet();
if (j == 0) {
System.out.println("--> Loading (s_value) took: " + searchResponse.took());
}
if (searchResponse.hits().totalHits() != COUNT) {
System.err.println("--> mismatch on hits");
}
} }
System.out.println("--> Warmup (s_value) DONE"); System.out.println("------------------ SUMMARY -------------------------------");
totalQueryTime = 0;
for (int j = 0; j < QUERY_COUNT; j++) {
SearchResponse searchResponse = client.prepareSearch()
.setQuery(matchAllQuery())
.addFacet(termsFacet("s_value").field("s_value"))
.execute().actionGet();
if (searchResponse.hits().totalHits() != COUNT) {
System.err.println("--> mismatch on hits");
}
totalQueryTime += searchResponse.tookInMillis();
}
System.out.println("--> Terms Facet (s_value) " + (totalQueryTime / QUERY_COUNT) + "ms");
// S_VALUE (Map)
client.admin().indices().prepareClearCache().setFieldDataCache(true).execute().actionGet();
System.out.println("--> Warmup (s_value) ...");
// run just the child query, warm up first
for (int j = 0; j < QUERY_WARMUP; j++) {
SearchResponse searchResponse = client.prepareSearch()
.setQuery(matchAllQuery())
.addFacet(termsFacet("s_value").field("s_value").executionHint("map"))
.execute().actionGet();
if (j == 0) {
System.out.println("--> Loading (s_value) took: " + searchResponse.took());
}
if (searchResponse.hits().totalHits() != COUNT) {
System.err.println("--> mismatch on hits");
}
}
System.out.println("--> Warmup (s_value) DONE");
totalQueryTime = 0;
for (int j = 0; j < QUERY_COUNT; j++) {
SearchResponse searchResponse = client.prepareSearch()
.setQuery(matchAllQuery())
.addFacet(termsFacet("s_value").field("s_value").executionHint("map"))
.execute().actionGet();
if (searchResponse.hits().totalHits() != COUNT) {
System.err.println("--> mismatch on hits");
}
totalQueryTime += searchResponse.tookInMillis();
}
System.out.println("--> Terms Facet (map) (s_value) " + (totalQueryTime / QUERY_COUNT) + "ms");
// L VALUE
client.admin().indices().prepareClearCache().setFieldDataCache(true).execute().actionGet();
System.out.println("--> Warmup (l_value) ...");
// run just the child query, warm up first
for (int j = 0; j < QUERY_WARMUP; j++) {
SearchResponse searchResponse = client.prepareSearch()
.setQuery(matchAllQuery())
.addFacet(termsFacet("l_value").field("l_value"))
.execute().actionGet();
if (j == 0) {
System.out.println("--> Loading (l_value) took: " + searchResponse.took());
}
if (searchResponse.hits().totalHits() != COUNT) {
System.err.println("--> mismatch on hits");
}
}
System.out.println("--> Warmup (l_value) DONE");
totalQueryTime = 0;
for (int j = 0; j < QUERY_COUNT; j++) {
SearchResponse searchResponse = client.prepareSearch()
.setQuery(matchAllQuery())
.addFacet(termsFacet("l_value").field("l_value"))
.execute().actionGet();
if (searchResponse.hits().totalHits() != COUNT) {
System.err.println("--> mismatch on hits");
}
totalQueryTime += searchResponse.tookInMillis();
}
System.out.println("--> Terms Facet (l_value) " + (totalQueryTime / QUERY_COUNT) + "ms");
// SM VALUE
client.admin().indices().prepareClearCache().setFieldDataCache(true).execute().actionGet();
System.out.println("--> Warmup (sm_value) ...");
// run just the child query, warm up first
for (int j = 0; j < QUERY_WARMUP; j++) {
SearchResponse searchResponse = client.prepareSearch()
.setQuery(matchAllQuery())
.addFacet(termsFacet("sm_value").field("sm_value"))
.execute().actionGet();
if (j == 0) {
System.out.println("--> Loading (sm_value) took: " + searchResponse.took());
}
if (searchResponse.hits().totalHits() != COUNT) {
System.err.println("--> mismatch on hits");
}
}
System.out.println("--> Warmup (sm_value) DONE");
totalQueryTime = 0;
for (int j = 0; j < QUERY_COUNT; j++) {
SearchResponse searchResponse = client.prepareSearch()
.setQuery(matchAllQuery())
.addFacet(termsFacet("sm_value").field("sm_value"))
.execute().actionGet();
if (searchResponse.hits().totalHits() != COUNT) {
System.err.println("--> mismatch on hits");
}
totalQueryTime += searchResponse.tookInMillis();
}
System.out.println("--> Terms Facet (sm_value) " + (totalQueryTime / QUERY_COUNT) + "ms");
// SM VALUE (map)
client.admin().indices().prepareClearCache().setFieldDataCache(true).execute().actionGet();
System.out.println("--> Warmup (sm_value) ...");
// run just the child query, warm up first
for (int j = 0; j < QUERY_WARMUP; j++) {
SearchResponse searchResponse = client.prepareSearch()
.setQuery(matchAllQuery())
.addFacet(termsFacet("sm_value").field("sm_value").executionHint("map"))
.execute().actionGet();
if (j == 0) {
System.out.println("--> Loading (sm_value) took: " + searchResponse.took());
}
if (searchResponse.hits().totalHits() != COUNT) {
System.err.println("--> mismatch on hits");
}
}
System.out.println("--> Warmup (sm_value) DONE");
totalQueryTime = 0;
for (int j = 0; j < QUERY_COUNT; j++) {
SearchResponse searchResponse = client.prepareSearch()
.setQuery(matchAllQuery())
.addFacet(termsFacet("sm_value").field("sm_value").executionHint("map"))
.execute().actionGet();
if (searchResponse.hits().totalHits() != COUNT) {
System.err.println("--> mismatch on hits");
}
totalQueryTime += searchResponse.tookInMillis();
}
System.out.println("--> Terms Facet (map) (sm_value) " + (totalQueryTime / QUERY_COUNT) + "ms");
// LM VALUE
client.admin().indices().prepareClearCache().setFieldDataCache(true).execute().actionGet();
System.out.println("--> Warmup (lm_value) ...");
// run just the child query, warm up first
for (int j = 0; j < QUERY_WARMUP; j++) {
SearchResponse searchResponse = client.prepareSearch()
.setQuery(matchAllQuery())
.addFacet(termsFacet("lm_value").field("lm_value"))
.execute().actionGet();
if (j == 0) {
System.out.println("--> Loading (lm_value) took: " + searchResponse.took());
}
if (searchResponse.hits().totalHits() != COUNT) {
System.err.println("--> mismatch on hits");
}
}
System.out.println("--> Warmup (lm_value) DONE");
totalQueryTime = 0;
for (int j = 0; j < QUERY_COUNT; j++) {
SearchResponse searchResponse = client.prepareSearch()
.setQuery(matchAllQuery())
.addFacet(termsFacet("lm_value").field("lm_value"))
.execute().actionGet();
if (searchResponse.hits().totalHits() != COUNT) {
System.err.println("--> mismatch on hits");
}
totalQueryTime += searchResponse.tookInMillis();
}
System.out.println("--> Terms Facet (lm_value) " + (totalQueryTime / QUERY_COUNT) + "ms");
clientNode.close(); clientNode.close();
node1.close(); node1.close();
node2.close(); node2.close();
} }
static class StatsResult {
final String name;
final long took;
StatsResult(String name, long took) {
this.name = name;
this.took = took;
}
}
private static StatsResult terms(String name, String field, String executionHint) {
long totalQueryTime;// LM VALUE
client.admin().indices().prepareClearCache().setFieldDataCache(true).execute().actionGet();
System.out.println("--> Warmup (" + name + ")...");
// run just the child query, warm up first
for (int j = 0; j < QUERY_WARMUP; j++) {
SearchResponse searchResponse = client.prepareSearch()
.setSearchType(SearchType.COUNT)
.setQuery(matchAllQuery())
.addFacet(termsFacet(field).field(field).executionHint(executionHint))
.execute().actionGet();
if (j == 0) {
System.out.println("--> Loading (" + field + "): took: " + searchResponse.took());
}
if (searchResponse.hits().totalHits() != COUNT) {
System.err.println("--> mismatch on hits");
}
}
System.out.println("--> Warmup (" + name + ") DONE");
System.out.println("--> Running (" + name + ")...");
totalQueryTime = 0;
for (int j = 0; j < QUERY_COUNT; j++) {
SearchResponse searchResponse = client.prepareSearch()
.setSearchType(SearchType.COUNT)
.setQuery(matchAllQuery())
.addFacet(termsFacet(field).field(field).executionHint(executionHint))
.execute().actionGet();
if (searchResponse.hits().totalHits() != COUNT) {
System.err.println("--> mismatch on hits");
}
totalQueryTime += searchResponse.tookInMillis();
}
System.out.println("--> Terms Facet (" + field + "), hint(" + executionHint + "): " + (totalQueryTime / QUERY_COUNT) + "ms");
return new StatsResult(name, totalQueryTime);
}
} }