<?xml version="1.0" ?>

<!--
 Licensed to the Apache Software Foundation (ASF) under one or more
 contributor license agreements.  See the NOTICE file distributed with
 this work for additional information regarding copyright ownership.
 The ASF licenses this file to You under the Apache License, Version 2.0
 (the "License"); you may not use this file except in compliance with
 the License.  You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
-->

<config>

  <jmx />
  <indexConfig>
    <useCompoundFile>${useCompoundFile:false}</useCompoundFile>
  </indexConfig>

  <!-- Used to specify an alternate directory to hold all index data.
       It defaults to "index" if not present, and should probably
       not be changed if replication is in use. -->
  <dataDir>${solr.data.dir:./solr/data}</dataDir>

  <!--  The DirectoryFactory to use for indexes.
        solr.StandardDirectoryFactory, the default, is filesystem based.
        solr.RAMDirectoryFactory is memory based and not persistent. -->
  <directoryFactory name="DirectoryFactory" class="${solr.directoryFactory:solr.RAMDirectoryFactory}"/>
  <schemaFactory class="ClassicIndexSchemaFactory"/>

  <luceneMatchVersion>${tests.luceneMatchVersion:LATEST}</luceneMatchVersion>

  <requestHandler name="search" class="solr.SearchHandler" default="true">
     <lst name="defaults">
       <str name="echoParams">explicit</str>
       <int name="rows">10</int>
     </lst>
  </requestHandler>

  <requestHandler name="/select" class="solr.SearchHandler">
    <bool name="httpCaching">true</bool>
  </requestHandler>

  <requestDispatcher>
    <requestParsers enableRemoteStreaming="false" multipartUploadLimitInKB="-1" />
    <httpCaching lastModifiedFrom="openTime" etagSeed="Solr" never304="false">
      <cacheControl>max-age=30, public</cacheControl>
    </httpCaching>
  </requestDispatcher>

  <requestHandler name="/update" class="solr.UpdateRequestHandler" >
    <lst name="defaults">
      <str name="update.chain">lang_id_tika</str>
    </lst>
  </requestHandler>  

  <updateRequestProcessorChain name="lang_id_tika">
    <processor class="org.apache.solr.update.processor.TikaLanguageIdentifierUpdateProcessorFactory">
      <!-- Can take defaults, invariants and appends just like req handlers-->
      <lst name="defaults">
        <bool name="langid">true</bool>
        <str name="langid.fl">name,subject</str>
        <bool name="langid.map">true</bool>
        <str name="langid.langField">language_s</str>
        <str name="langid.langsField">language_sm</str>
        <str name="langid.map.lcmap">th:thai</str>
        <float name="threshold">0.5</float>
        <str name="langid.fallback">fallback</str>
      </lst>
    </processor>
    <processor class="solr.RunUpdateProcessorFactory" />
  </updateRequestProcessorChain>
  
  <updateRequestProcessorChain name="lang_id_lang_detect">
    <processor class="org.apache.solr.update.processor.LangDetectLanguageIdentifierUpdateProcessorFactory">
      <!-- Can take defaults, invariants and appends just like req handlers-->
      <lst name="defaults">
        <bool name="langid">true</bool>
        <str name="langid.fl">name,subject</str>
        <bool name="langid.map">true</bool>
        <str name="langid.langField">language_s</str>
        <str name="langid.langsField">language_sm</str>
        <str name="langid.map.lcmap">th:thai</str>
        <float name="threshold">0.5</float>
        <str name="langid.fallback">fallback</str>
      </lst>
    </processor>
    <processor class="solr.RunUpdateProcessorFactory" />
  </updateRequestProcessorChain>

  <updateRequestProcessorChain name="lang_id_opennlp">
    <processor class="org.apache.solr.update.processor.OpenNLPLangDetectUpdateProcessorFactory">
      <!-- Can take defaults, invariants and appends just like req handlers-->
      <lst name="defaults">
        <bool name="langid">true</bool>
        <str name="langid.fl">name,subject</str>
        <bool name="langid.map">true</bool>
        <str name="langid.langField">language_s</str>
        <str name="langid.langsField">language_sm</str>
        <str name="langid.map.lcmap">th:thai</str>
        <float name="threshold">0.3</float>
        <str name="langid.model">opennlp-langdetect.eng-swe-spa-rus-deu.bin</str>
      </lst>
    </processor>
    <processor class="solr.RunUpdateProcessorFactory" />
  </updateRequestProcessorChain>

</config>
