kuba_ceg
kuba_ceg

Reputation: 930

Solr very slow filters

I have problem with very slow filters in Solr (version 4.9.1), there is ~50k documents. For first query which use specific category_id filter value, query takes ~15 seconds, second time is much more faster (it takes miliseconds). But i want to have fast filters always :) So after googling it i read that I must have filterCache and cache Autowarming

Sooo what I've done:

filterCache:

   <filterCache
  class="solr.FastLRUCache"
  size="16384"
  initialSize="4096"
  autowarmCount="4096" />

firstSearcher:

<listener event="firstSearcher" class="solr.QuerySenderListener">
            <arr name="queries">
                <lst>
                    <str name="q">*</str>
                    <str name="fq">category_id:1043</str>
                </lst>
            </arr>
        </listener>

        <useColdSearcher>true</useColdSearcher>
        <useFilterForSortedQuery>true</useFilterForSortedQuery>
        <maxWarmingSearchers>2</maxWarmingSearchers>

It doesn't work ;/ no idea why... For first entry on this category it takes 15s, than its fast. But I always must have fast response, for categories and for other filters.

I make an experiment, everything works better if I use mainquery instead of filters, but filters should be as fast as mainquery (i read it somewhere).

Summary:

What I'm trying to do: Ok so, I have shop with ~50 000 products and ~1000 categories and a lot of other filters (type, price etc), my catalog is based on SOLR (filtering), now if I use filters first entry to category takes 15seconds, it must be fast every single time....

My example query:

    <lst name="responseHeader">
        <int name="status">0</int>
        <int name="QTime">0</int>
        <lst name="params">
            <str name="debugQuery">true</str>
            <str name="website_id:1"/>
            <str name="stats.field">PLN_0_price_decimal</str>
            <str name="product_status:1"/>
            <str name="q">**</str>
            <str name="store_id:1"/>
            <str name="fq">category_id:10561</str>
        </lst>
    </lst>

Upvotes: 1

Views: 641

Answers (2)

Alexandre Rafalovitch
Alexandre Rafalovitch

Reputation: 9789

The first time you use a filter, every document needs to be looked at, even if the main query will match only a couple. You could disable caching for such filter or switch to a post-filter (by assigning filter cost). The fuller explanation is here.

Upvotes: 0

kuba_ceg
kuba_ceg

Reputation: 930

So, solution was simple, I have to use * instead of ** in my query.

Part of debug section from response with *:

<str name="parsedquery">MatchAllDocsQuery(*:*)</str>
<str name="parsedquery_toString">*:*</str>

Same part of debug section from response with **:

<str name="parsedquery">textSearch:**</str>
<str name="parsedquery_toString">textSearch:**</str>

Upvotes: 1

Related Questions