2014-10-14 4 views
1

У меня проблема с очень медленными фильтрами в Solr (версия 4.9.1), есть ~ 50k документов. Для первого запроса, который использует значение фильтра category_id, запрос занимает ~ 15 секунд, второй раз намного быстрее (требуется милисекунды). Но я хочу, чтобы иметь быстрые фильтры всегда :) Так что после того, как прибегая к помощи его я прочитал, что я должен иметь filterCache и кэш AutowarmingSolr очень медленные фильтры

ооочень что я сделал:

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> 

Это не работает/не знаю, почему ... Для первого входа в эту категорию требуется 15 секунд, чем его быстрое. Но я всегда должен иметь быстрый ответ, для категорий и для других фильтров.

Я делаю эксперимент, все работает лучше, если я использую mainquery вместо фильтров, но фильтры должны быть такими же быстрыми, как mainquery (я читаю его где-то).

Резюме:

  • Что я делаю неправильно, что autowarming не работают?
  • Как сделать автосогласование для каждого фильтра/каждого значения фильтра?

То, что я пытаюсь сделать: ИТАК, у меня есть магазин с ~ 50 000 продуктов и 1000 ~ категории и много других фильтров (тип, цена и т.д.), мой каталог основан на SOLR (фильтрация), теперь, если я использую фильтры первого входа в категорию принимает 15 секунд, то он должен быть быстрым каждый раз ....

Мой пример запроса:

<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> 

ответ

1

Таким образом, решение было простым , Я должен использовать * вместо из ** в моем запросе.

Часть отладки секции от ответа с *:

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

же часть отладки секции от ответа с **:

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

Первый раз, когда вы используете фильтр, каждый документ должен можно посмотреть, даже если основной запрос будет соответствовать только паре. Вы можете отключить кеширование для такого фильтра или переключиться на постфильтр (путем назначения стоимости фильтра). Более полное объяснение - here.

+0

Проблема была в том, что фильтры были на 50 (!) Раз медленнее обычного запроса, причина заключалась в использовании ** вместо * (посмотрите на мой ответ) :) теперь фильтрация очень быстрая –

+0

Я понятия не имею, что '** «поиск действительно будет в плане механики Солра. Но если это сработает для вас - отлично. Просто не забудьте вернуться и обновить ответ, если вдруг обнаружите, что вы сейчас не ищете вообще или что-то в этом роде. –