Actually it seems it's more when i DESELECT a facet value that performance 
slows down (and load increases). Because i facet and search on all the docs 
(if i remove all filters).
The more facets and selections i make to restrict my table data, the more 
efficient queries become.

But i'm worried about the fact that on a local dev computer, one node with 
one shard and no replica, with only 265k docs, search/facetting is so 
slow...
Any clue about what i could be doing wrong to get cpu load to 100 % ?

I was doing like this :

        TermsFacetBuilder facet = FacetBuilders.termsFacet(facetName)
                .field(columnName)
                .size(1000);
        SearchRequestBuilder query = client.prepareSearch(datasetName)
                .setTypes(RECORD);
        if (filters != null && filters.size() > 0) {

            BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
            for (ColumnFilterConfiguration filter : filters) {
                if (filter instanceof TextFilterConfiguration) {
                    TextFilterConfiguration textFilter = 
(TextFilterConfiguration) filter;
                    final String textFilterValue = 
StringUtils.trimToNull(textFilter.getTextFilterValue());
                    
queryBuilder.must(QueryBuilders.termQuery(filter.getColumn().getNormalizedName(),
 
textFilterValue));
                } else {
                    throw new UnsupportedOperationException("Unsupporterd 
filter type.");
                }
            }
            query.setQuery(queryBuilder);
        } else {
            query.setQuery(QueryBuilders.matchAllQuery());
        }
        query.addFacet(facet);
        SearchResponse sr = query.execute().actionGet();
        TermsFacet f = (TermsFacet) 
sr.getFacets().facetsAsMap().get(facetName);

Now i switched to aggregations, but the result seems to be the same :

        TermsBuilder agg = 
AggregationBuilders.terms(facetName).field(columnName).size(1000);
        SearchRequestBuilder query = 
client.prepareSearch().setSize(0).addAggregation(agg);
        if (filters != null && filters.size() > 0) {
            BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
            for (ColumnFilterConfiguration filter : filters) {
                if (filter instanceof TextFilterConfiguration) {
                    TextFilterConfiguration textFilter = 
(TextFilterConfiguration) filter;
                    final String textFilterValue = 
StringUtils.trimToNull(textFilter.getTextFilterValue());
                    
queryBuilder.must(QueryBuilders.termQuery(filter.getColumn().getNormalizedName(),
 
textFilterValue));
                } else {
                    throw new UnsupportedOperationException("Unsupporterd 
filter type.");
                }
            }
            query.setQuery(queryBuilder);
        }
        SearchResponse sr = query.execute().actionGet();

In the last version, i tried not giving any query to avoid a matchAll (if 
no filters defined), and otherwise give it a boolean query matching all 
filters terms.
I also set the query result size to 0 to avoid fetching data for query 
result, only aggregation result.
No significative improvement...

Help would be appreciated :)

Le mercredi 25 juin 2014 13:32:56 UTC+2, Frederic Esnault a écrit :
>
> Hi all,
>
> I'm currently in a development phase, so i'm testing my devs  on my local 
> machine (a mac book pro with 16Gb ram, and a 512G SSD, 4 cores).
>
>   Processor Name: Intel Core i7
>
>   Processor Speed: 2,3 GHz
>
>   Number of Processors: 1
>
>   Total Number of Cores: 4
>
>   L2 Cache (per Core): 256 KB
>
>   L3 Cache: 6 MB
>
>   Memory: 16 GB
>
>
> I set up a one node / one shard / no replica ES node where i index approx 
> 264k documents in bulk mode (takes 16s including preparation time).
>
>
> Then on my application i see a table with my data, and i can create facets 
> on columns.
>
> When i have more than one facet, it begins to become difficult for ES.
>
> Checking one facet value updates the table data (filtering on the selected 
> facet value), and updates the other facet(s), to get facet values on 
> filtered data only.
>
>
> This is when i select one facet value that ES begins to use 100 % cpu (i 
> even saw 220% in top command result), and i don't really know why. 
> Basically i send 2 queries, one faceting query with filtering the other is 
> the table data query with filters.
>
>
> Do you have any idea what could cause the high cpu load on ES local node ? 
> (For info i gave ES node 5g of memory (Xmx and Xms)).
>

-- 
You received this message because you are subscribed to the Google Groups 
"elasticsearch" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/elasticsearch/96f082da-184c-45c8-a19b-735fa1032051%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to