2015-12-05 3 views
1

Почему для Solr для Windows требуется столько памяти?Почему для Solr для Windows требуется столько памяти?

Мои данные для Solr - это ключевые слова SEO (1-10 слов, длина до 120 символов, 800 миллионов строк) и некоторые другие данные. Схема является:

<?xml version="1.0" encoding="UTF-8" ?> 
<schema name="suggests" version="1.5"> 
<copyField source="suggest" dest="suggest_exact"/> 

<types> 
    <fieldType name="text_stem" class="solr.TextField" positionIncrementGap="100"> 
     <analyzer> 
      <tokenizer class="solr.StandardTokenizerFactory"/> 
      <filter class="solr.LowerCaseFilterFactory"/> 
      <filter class="solr.SnowballPorterFilterFactory" language="Russian" /> 
     </analyzer> 
    </fieldType> 
    <fieldType name="text_exact" class="solr.TextField" positionIncrementGap="100"> 
     <analyzer> 
      <tokenizer class="solr.StandardTokenizerFactory"/> 
      <filter class="solr.LowerCaseFilterFactory"/> 
     </analyzer> 
    </fieldType> 
    <fieldType name="int" class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0"/> 
    <fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/> 
    <fieldType name="boolean" class="solr.BoolField" sortMissingLast="true"/> 
</types> 
<fields> 
    <field name="suggest" type="text_stem" indexed="true" stored="true"/> 
    <field name="suggest_exact" type="text_exact" indexed="true" stored="false"/> 
    <field name="length" type="int" indexed="true" stored="true"/> 
    <field name="position" type="int" indexed="true" stored="true"/> 
    <field name="wordstat1" type="int" indexed="true" stored="true"/> 
    <field name="wordstat3" type="int" indexed="true" stored="true"/> 
    <field name="ln" type="int" indexed="true" stored="true"/> 
    <field name="wc" type="int" indexed="true" stored="true"/> 
</fields> 

Solr для Windows, ест ~ 10 Гб оперативной памяти, а иногда требуется больше (до 16 Гб). Теперь я сконфигурировал его для использования SOLR_JAVA_MEM=-Xms8192m -Xmx16384m, и он работает, но когда он был 4 ГБ и менее - Java разбилась с ошибкой OutOfMemory.

Итак, что я делаю неправильно? Как настроить Solr для уменьшения ОЗУ? Я могу предоставить любую часть solrconfig.xml.

solrconfig.xml

<query> 
    <maxBooleanClauses>1024</maxBooleanClauses> 
    <filterCache class="solr.FastLRUCache" 
       size="512" 
       initialSize="512" 
       autowarmCount="0"/> 
    <queryResultCache class="solr.LRUCache" 
        size="512" 
        initialSize="512" 
        autowarmCount="0"/> 
    <documentCache class="solr.LRUCache" 
        size="512" 
        initialSize="512" 
        autowarmCount="0"/> 
    <cache name="perSegFilter" 
     class="solr.search.LRUCache" 
     size="10" 
     initialSize="0" 
     autowarmCount="10" 
     regenerator="solr.NoOpRegenerator" /> 

    <enableLazyFieldLoading>true</enableLazyFieldLoading> 

    <queryResultWindowSize>20</queryResultWindowSize> 

    <queryResultMaxDocsCached>200</queryResultMaxDocsCached> 

    <useColdSearcher>false</useColdSearcher> 

    <maxWarmingSearchers>2</maxWarmingSearchers> 

</query> 

Итак, что я точно делать и хочу.

Я добавил 800 млн рядов в Солр. И это еще не все - у меня есть наборы данных с 3 миллиардами строк. Строки - это ключевые слова SEO, такие как «поиск работы», «найти работу в новом йорке» и т. Д. «Предлагаем» поле содержит много одинаковых обычно используемых слов, таких как «работа», «загрузка» и прочее. Я думаю, что слово «скачать» существует в 10% всех строк.

Я делаю услугу, где пользователи могут сделать запрос «загрузка» и получить все документы, содержащие слово «скачать».

Я создал настольное программное обеспечение (.NET) для связи между веб-интерфейсом службы (PHP + MySQL) и Solr. Это программное обеспечение получает задание от веб-службы, делает запрос к Solr, загружает результаты Solr и предоставляет их пользователю.

Чтобы получить все результаты, которые я отправить GET-запрос Solr нравится:

http://localhost:8983/solr/suggests2/select?q=suggest:(job%20AND%20new%20AND%20york)&fq=length:[1%20TO%2032]&fq=position:[1%20TO%2010]&fq=wc:[1%20TO%2032]&fq=ln:[1%20TO%20256]&fq=wordstat1:[0%20TO%20*]&fq=wordstat3:[1%20TO%20100000000]&sort=wordstat3%20desc&start=0&rows=100000&fl=suggest%2Clength%2Cposition%2Cwordstat1%2Cwordstat3&wt=csv&csv.separator=; 

Как вы можете видеть - я использую FQ и сортировки, а не использовать группировку. Возможно, кто-нибудь увидит мои ошибки в запросе или подходе Solr - пожалуйста, расскажите мне об этом. Спасибо.

+0

Можете ли вы также предоставить конфигурационную конфигурацию размера кэша 'solrconfig.xml'? – YoungHobbit

+0

Да, конечно. http://pastebin.com/MNhnHRBq – devspec

+0

На самом деле, я не нуждаюсь в кеше в Solr, потому что запросы от пользователей совершенно разные. – devspec

ответ

1

Вы работаете на TrieIntField, у которого нет DocValues. Это означает, что Solr сохранит копию значений в куче. С 800 М значениями, то есть 3,2 ГБ кучи только для этого. Установка docValues="true" для вашего wordstat3 - поле и повторная индексация должны значительно снизить это требование за счет некоторой производительности.

Обратите внимание, что Solr (Lucene действительно) не поддерживает более 2 миллиардов документов в одном осколке. Это жесткий предел. Если вы планируете индексировать 3 миллиарда документов в один и тот же логический индекс, вам придется использовать многооконный SolrCloud.

+0

Я попробую, спасибо! – devspec

+0

Итак, я пробовал, и все работает отлично. В Solr теперь используется менее 4 ГБ ОЗУ. Большое спасибо! – devspec