Index: modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/src/main/java/eu/dnetlib/functionality/index/SolrIndexCollection.java
===================================================================
--- modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/src/main/java/eu/dnetlib/functionality/index/SolrIndexCollection.java	(nonexistent)
+++ modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/src/main/java/eu/dnetlib/functionality/index/SolrIndexCollection.java	(revision 55805)
@@ -0,0 +1,183 @@
+package eu.dnetlib.functionality.index;
+
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Iterator;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.solr.client.solrj.impl.CloudSolrClient;
+import org.apache.solr.client.solrj.response.UpdateResponse;
+import org.apache.solr.common.SolrInputDocument;
+
+import com.google.common.base.Function;
+import com.google.common.collect.Iterators;
+import com.google.common.collect.Lists;
+
+import eu.dnetlib.data.provision.index.rmi.IndexServiceException;
+import eu.dnetlib.functionality.index.model.document.IndexDocument;
+import eu.dnetlib.functionality.index.model.util.SolrIndexDocument;
+import eu.dnetlib.functionality.index.utils.IndexFieldUtility;
+
+/**
+ * The Class SolrIndexCollection.
+ */
+public class SolrIndexCollection implements IndexCollection {
+
+	/**
+	 * The log.
+	 */
+	private static final Log log = LogFactory.getLog(SolrIndexCollection.class); // NOPMD by marko on 11/24/08 5:02 PM
+
+	/** The Constant STATUS_INDEX_OK. */
+	public static final int STATUS_INDEX_OK = 0;
+
+	/** The server. */
+	private CloudSolrClient client;
+
+	private boolean shutdown = false;
+
+	/**
+	 * The Constructor.
+	 *
+	 * @param client
+	 *            the client
+	 */
+	public SolrIndexCollection(final CloudSolrClient client) {
+		this.client = client;
+		client.connect();
+	}
+
+	/**
+	 * {@inheritDoc}
+	 *
+	 * @see eu.dnetlib.functionality.index.IndexCollection#add(eu.dnetlib.functionality.index.model.document.IndexDocument)
+	 */
+	@Override
+	public boolean add(final IndexDocument doc) throws IndexServiceException {
+		if (isShutdown()) throw new IndexServiceException("Please get another SolrIndexCollection: this has been shut down");
+		final SolrIndexDocument solrDocument = (SolrIndexDocument) doc;
+		try {
+			final UpdateResponse response = client.add(solrDocument.getSolrDocument());
+			return response.getStatus() == 0;
+		} catch (final Exception e) {
+			throw new IndexServiceException("Unable to add document", e);
+		}
+	}
+
+	/**
+	 * {@inheritDoc}
+	 *
+	 * @see eu.dnetlib.functionality.index.IndexCollection#addAll(java.util.Iterator)
+	 */
+	@Override
+	public boolean addAll(final Iterator<IndexDocument> docs) throws IndexServiceException {
+		if (isShutdown()) throw new IndexServiceException("Please get another SolrIndexCollection: this has been shut down");
+		final Iterator<SolrInputDocument> solrDocs = Iterators.transform(docs, new Function<IndexDocument, SolrInputDocument>() {
+
+			@Override
+			public SolrInputDocument apply(final IndexDocument doc) {
+				final SolrIndexDocument solrDocument = (SolrIndexDocument) doc;
+				return solrDocument.getSolrDocument();
+			}
+		});
+
+		try {
+			final UpdateResponse response = client.add(Lists.newArrayList(solrDocs));
+			return response.getStatus() == 0;
+		} catch (final Exception e) {
+			throw new IndexServiceException("Unable to add document", e);
+		}
+	}
+
+	/**
+	 * {@inheritDoc}
+	 *
+	 * @see eu.dnetlib.functionality.index.IndexCollection#addAll(java.util.Collection)
+	 */
+	@Override
+	public boolean addAll(final Collection<IndexDocument> docs) throws IndexServiceException {
+		if (isShutdown()) throw new IndexServiceException("Please get another SolrIndexCollection: this has been shut down");
+		return addAll(docs.iterator());
+	}
+
+	/**
+	 * {@inheritDoc}
+	 *
+	 * @see eu.dnetlib.functionality.index.IndexCollection#deleteIndex(java.lang.String)
+	 */
+	@Override
+	public boolean deleteIndex(final String dsId) throws IndexServiceException {
+		if (isShutdown()) throw new IndexServiceException("Please get another SolrIndexCollection: this has been shut down");
+		return doDelete(IndexFieldUtility.DS_ID + " : \"" + dsId + "\"");
+	}
+
+	/**
+	 * {@inheritDoc}
+	 *
+	 * @see eu.dnetlib.functionality.index.IndexCollection#deleteByQuery(java.lang.String, java.lang.String)
+	 */
+	@Override
+	public boolean deleteByQuery(final String query, final String dsId) throws IndexServiceException {
+		if (isShutdown()) throw new IndexServiceException("Please get another SolrIndexCollection: this has been shut down");
+		if (StringUtils.isBlank(dsId)) return doDelete(query);
+		return doDelete(query + " AND " + IndexFieldUtility.DS_ID + " : \"" + dsId + "\"");
+	}
+
+	/**
+	 * Do delete.
+	 *
+	 * @param query
+	 *            the query
+	 * @return true, if do delete
+	 * @throws IndexServiceException
+	 *             the index service exception
+	 */
+	protected boolean doDelete(final String query) throws IndexServiceException {
+		if (isShutdown()) throw new IndexServiceException("Please get another SolrIndexCollection: this has been shut down");
+		try {
+			log.debug("delete by query: " + query);
+			return client.deleteByQuery(query).getStatus() == STATUS_INDEX_OK;
+		} catch (final Exception e) {
+			throw new IndexServiceException("unable to run delete by query: " + query, e);
+		}
+	}
+
+	/**
+	 * {@inheritDoc}
+	 *
+	 * @see eu.dnetlib.functionality.index.IndexCollection#commit()
+	 */
+	@Override
+	public boolean commit() throws IndexServiceException {
+		if (isShutdown()) throw new IndexServiceException("Please get another SolrIndexCollection: this has been shut down");
+		try {
+			log.info("performing commit");
+			final UpdateResponse rsp = client.commit();
+			log.info(String.format("commit completed in %s, status %s", rsp.getElapsedTime(), rsp.getStatus()));
+			return rsp.getStatus() == STATUS_INDEX_OK;
+		} catch (final Throwable e) {
+			throw new IndexServiceException("unable to perform index commit", e);
+		}
+	}
+
+	@Override
+	public void shutdown() {
+		try {
+			client.close();
+		} catch (IOException e) {
+			throw new RuntimeException(e);
+		}
+		shutdown = true;
+	}
+
+	public boolean isShutdown() {
+		return shutdown;
+	}
+
+	public void setShutdown(final boolean shutdown) {
+		this.shutdown = shutdown;
+	}
+
+}
Index: modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/src/main/java/eu/dnetlib/functionality/index/utils/ZkUtils.java
===================================================================
--- modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/src/main/java/eu/dnetlib/functionality/index/utils/ZkUtils.java	(nonexistent)
+++ modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/src/main/java/eu/dnetlib/functionality/index/utils/ZkUtils.java	(revision 55805)
@@ -0,0 +1,203 @@
+package eu.dnetlib.functionality.index.utils;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.solr.common.cloud.SolrZkClient;
+import org.apache.zookeeper.CreateMode;
+import org.apache.zookeeper.KeeperException;
+import org.dom4j.Document;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Required;
+import org.springframework.core.io.Resource;
+import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
+
+import com.google.common.collect.Maps;
+
+import eu.dnetlib.data.provision.index.rmi.IndexServiceException;
+
+/**
+ * The Class ZkUtils.
+ */
+public class ZkUtils {
+
+	/**
+	 * The log.
+	 */
+	private static final Log log = LogFactory.getLog(ZkUtils.class); // NOPMD by marko on 11/24/08 5:02 PM
+
+	/** The Constant CONFIGS_PATH. */
+	private static final String CONFIGS_PATH = "/configs";
+
+	/** The schema factory. */
+	@Autowired
+	private IndexSchemaFactory schemaFactory;
+
+	/** The config factory. */
+	private IndexConfigFactory configFactory;
+
+	/** The static configuration classpath. */
+	private String staticConfigurationClasspath;
+
+	/**
+	 * Upload zookeper config.
+	 * 
+	 * @param zkClient
+	 *            the zk client
+	 * @param coreName
+	 *            the core name
+	 * @param fields
+	 *            the fields
+	 * @param params
+	 *            the params
+	 * @param overwrite
+	 *            the overwrite
+	 */
+	public void uploadZookeperConfig(final SolrZkClient zkClient,
+			final String coreName,
+			final Document fields,
+			final Map<String, String> params,
+			final boolean overwrite) {
+
+		final String basepath = CONFIGS_PATH + "/" + coreName;
+
+		log.info("uploading solr configuration to ZK for index collection: " + coreName);
+
+		try {
+			if (overwrite && zkClient.getSolrZooKeeper().exists(basepath, false) != null) {
+				log.info("cleanup ZK configuration: " + coreName);
+				for (String child : zkClient.getSolrZooKeeper().getChildren(basepath, false)) {
+					final String path = basepath + "/" + child;
+					log.debug("cleanup ZK file: " + path);
+					zkClient.delete(path, -1, true);
+				}
+				zkClient.delete(basepath, -1, true);
+			}
+			if (!zkClient.exists(basepath, true)) {
+				log.info("upload ZK configuration: " + coreName);
+				zkClient.makePath(basepath, true);
+				uploadConfiguration(zkClient, basepath, buildConfiguration(coreName, fields, params));
+			}
+			log.info("upload ZK configuration complete");
+		} catch (Exception e) {
+			log.error("unable to upload solr configuration", e);
+		}
+	}
+
+	/**
+	 * Builds the configuration.
+	 * 
+	 * @param indexName
+	 *            the index name
+	 * @param fields
+	 *            the fields
+	 * @param params
+	 *            the params
+	 * @return the map
+	 * @throws IndexServiceException
+	 *             the index service exception
+	 */
+	private Map<String, byte[]> buildConfiguration(final String indexName, final Document fields, final Map<String, String> params)
+			throws IndexServiceException {
+
+		Map<String, byte[]> res = Maps.newHashMap();
+
+		try {
+			log.debug("adding schema.xml to the resource map");
+			res.put("schema.xml", schemaFactory.getSchema(fields).getBytes());
+			
+			res.put("solrconfig.xml", configFactory.getConfig(params).getBytes());
+			log.debug("adding solrconfig.xml to the resource map");
+			PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
+			Resource[] resources = resolver.getResources(getStaticConfigurationClasspath());
+
+			for (Resource r : resources) {
+				InputStream is = r.getInputStream();
+				if ((r.getFilename() != null) && !r.getFilename().isEmpty()) {
+				    res.put(r.getFilename(), IOUtils.toByteArray(is));
+				    log.debug("adding " + r.getFilename() +" to the resource map");
+				    is.close();
+				}
+			}
+			return res;
+		} catch (Throwable e) {
+			throw new IndexServiceException("failed to build configuration", e);
+		}
+	}
+
+	/**
+	 * Upload configuration.
+	 * 
+	 * @param zkClient
+	 *            the zk client
+	 * @param basePath
+	 *            the base path
+	 * @param resources
+	 *            the resources
+	 * @throws KeeperException
+	 *             the keeper exception
+	 * @throws InterruptedException
+	 *             the interrupted exception
+	 * @throws IOException
+	 *             Signals that an I/O exception has occurred.
+	 */
+	private void uploadConfiguration(final SolrZkClient zkClient, final String basePath, final Map<String, byte[]> resources) throws KeeperException,
+			InterruptedException, IOException {
+
+		if (!zkClient.exists(basePath, true)) {
+			zkClient.makePath(basePath, true);
+		}
+
+		for (final Entry<String, byte[]> e : resources.entrySet()) {
+			String path = basePath + "/" + e.getKey();
+			log.debug("upload ZK configuration: " + path);
+			zkClient.create(path, e.getValue(), CreateMode.PERSISTENT, true);
+		}
+	}
+
+	/**
+	 * Gets the config factory.
+	 * 
+	 * @return the config factory
+	 */
+	public IndexConfigFactory getConfigFactory() {
+		return configFactory;
+	}
+
+	/**
+	 * Sets the config factory.
+	 * 
+	 * @param configFactory
+	 *            the new config factory
+	 */
+	@Required
+	public void setConfigFactory(final IndexConfigFactory configFactory) {
+		this.configFactory = configFactory;
+	}
+
+	/**
+	 * Gets the static configuration classpath.
+	 * 
+	 * @return the static configuration classpath
+	 */
+	public String getStaticConfigurationClasspath() {
+		return staticConfigurationClasspath;
+	}
+
+	/**
+	 * Sets the static configuration classpath.
+	 * 
+	 * @param staticConfigurationClasspath
+	 *            the new static configuration classpath
+	 */
+	@Required
+	public void setStaticConfigurationClasspath(final String staticConfigurationClasspath) {
+		this.staticConfigurationClasspath = staticConfigurationClasspath;
+	}
+
+}
Index: modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/src/main/java/eu/dnetlib/functionality/index/utils/IndexConfigFactory.java
===================================================================
--- modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/src/main/java/eu/dnetlib/functionality/index/utils/IndexConfigFactory.java	(nonexistent)
+++ modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/src/main/java/eu/dnetlib/functionality/index/utils/IndexConfigFactory.java	(revision 55805)
@@ -0,0 +1,74 @@
+package eu.dnetlib.functionality.index.utils;
+
+import java.util.Map;
+import java.util.Map.Entry;
+
+import com.google.common.collect.Maps;
+import eu.dnetlib.data.provision.index.rmi.IndexServiceException;
+import org.antlr.stringtemplate.StringTemplate;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.springframework.beans.factory.annotation.Required;
+
+public class IndexConfigFactory {
+
+	private static final Log log = LogFactory.getLog(IndexConfigFactory.class); // NOPMD
+																				// by
+																				// marko
+																				// on
+																				// 11/24/08
+																				// 5:02
+																				// PM
+
+	public enum CONFIG_PARAMS {
+		// TODO replace with actual values
+		luceneMatchVersion;
+
+		static boolean isValid(final String v) {
+			try {
+				CONFIG_PARAMS.valueOf(v);
+				return true;
+			} catch (Throwable e) {
+				return false;
+			}
+		}
+	};
+
+	/**
+	 * Index configuration template.
+	 */
+	private StringTemplate solrConfig;
+
+	/**
+	 * @param params
+	 *            input document
+	 * @return the application of the schemaXslt transformation to the docIn
+	 *         document
+	 * @throws IndexServiceException
+	 */
+	public String getConfig(final Map<String, String> params)
+			throws IndexServiceException {
+		final StringTemplate conf = new StringTemplate(getSolrConfig()
+				.getTemplate());
+		for (Entry<String, String> e : filter(params).entrySet()) {
+			log.debug("setting conf property [" + e.getKey() + ":"
+					+ e.getValue() + "]");
+			conf.setAttribute(e.getKey(), e.getValue());
+		}
+		return conf.toString();
+	}
+
+	private Map<String, String> filter(final Map<String, String> params) {
+		return Maps.filterKeys(params, input -> CONFIG_PARAMS.isValid(input));
+	}
+
+	public StringTemplate getSolrConfig() {
+		return solrConfig;
+	}
+
+	@Required
+	public void setSolrConfig(final StringTemplate solrConfig) {
+		this.solrConfig = solrConfig;
+	}
+
+}
Index: modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/src/main/java/eu/dnetlib/functionality/index/utils/RemoteSolrAdministrator.java
===================================================================
--- modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/src/main/java/eu/dnetlib/functionality/index/utils/RemoteSolrAdministrator.java	(nonexistent)
+++ modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/src/main/java/eu/dnetlib/functionality/index/utils/RemoteSolrAdministrator.java	(revision 55805)
@@ -0,0 +1,193 @@
+package eu.dnetlib.functionality.index.utils;
+
+import java.io.IOException;
+import java.util.Map;
+
+import com.google.common.collect.Maps;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import eu.dnetlib.data.provision.index.rmi.IndexServiceException;
+import eu.dnetlib.functionality.index.model.Any.ValueType;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.solr.client.solrj.SolrClient;
+import org.apache.solr.client.solrj.SolrServerException;
+import org.apache.solr.client.solrj.impl.CloudSolrClient;
+import org.apache.solr.client.solrj.request.LukeRequest;
+import org.apache.solr.client.solrj.response.LukeResponse;
+import org.apache.solr.client.solrj.response.LukeResponse.FieldInfo;
+import org.apache.solr.client.solrj.response.SolrPingResponse;
+import org.apache.solr.common.cloud.SolrZkClient;
+import org.apache.zookeeper.Watcher;
+import org.apache.zookeeper.data.Stat;
+import org.springframework.beans.factory.annotation.Required;
+
+public class RemoteSolrAdministrator {
+
+	/**
+	 * The log.
+	 */
+	private static final Log log = LogFactory.getLog(RemoteSolrAdministrator.class);
+
+	/** The create url request. */
+	private static String createURLRequest = "http://%s:%s/solr/admin/collections?action=CREATE&name=%s&numShards=%s&replicationFactor=%s&maxShardsPerNode=%s&collection.configName=%s";
+
+	/** The create url request. */
+	private static String reloadURLRequest = "http://%s:%s/solr/admin/collections?action=RELOAD&name=%s";
+
+	/** The http client. */
+	private HttpClient httpClient;
+
+	protected Map<String, Map<String, ValueType>> cachedSchema;
+
+	public RemoteSolrAdministrator() {
+		this.cachedSchema = Maps.newHashMap();
+	}
+
+	public boolean createSolrIndex(final String host,
+			final String port,
+			final String collectionName,
+			final String numShard,
+			final String replicationFactor,
+			final String maxShardsPerNode,
+		final String collectionConfigName) throws IndexServiceException {
+
+		final String uri = generateCreateIndexRequest(host, port, collectionName, numShard, replicationFactor, maxShardsPerNode, collectionConfigName);
+		log.info(uri);
+		HttpGet request = new HttpGet(uri);
+		HttpResponse response;
+		try {
+			response = getHttpClient().execute(request);
+
+		} catch (Exception e) {
+			throw new IndexServiceException("Unable to send request to solr server", e);
+		} finally {
+			request.releaseConnection();
+		}
+		if (response.getStatusLine().getStatusCode() != 200)
+			throw new IndexServiceException("Error on creating index the error code from solr is" + response.toString());
+		return false;
+	}
+
+	public boolean indexCollectionExists(final String indexCollectionId, final CloudSolrClient client) {
+
+		Watcher watcher = arg0 -> {};
+		try {
+			// server.connect();
+			SolrZkClient zkClient = client.getZkStateReader().getZkClient();
+			if (!zkClient.isConnected()) {
+				client.connect();
+			}
+
+			byte[] data = zkClient.getData("/clusterstate.json", watcher, new Stat(), true);
+			if (data == null) return false;
+			String jsonLine = new String(data);
+			JsonElement jelement = new JsonParser().parse(jsonLine);
+			JsonObject jobject = jelement.getAsJsonObject();
+			if (jobject.has(indexCollectionId)) {
+				client.setDefaultCollection(indexCollectionId);
+				client.connect();
+				SolrPingResponse status = client.ping();
+				return (Integer) status.getResponseHeader().get("status") == 0;
+			} else return false;
+
+		} catch (Exception e) {
+			log.error(e);
+			return false;
+		}
+	}
+
+	private ValueType resolveSolrTypeClassName(final String solrTypeName) {
+		if (solrTypeName.contains("LongField")) return ValueType.LONG;
+		else if (solrTypeName.contains("IntField")) return ValueType.LONG;
+		else if (solrTypeName.contains("short")) return ValueType.LONG;
+		else if (solrTypeName.contains("float")) return ValueType.DOUBLE;
+		else if (solrTypeName.contains("double")) return ValueType.DOUBLE;
+		else if (solrTypeName.contains("date")) return ValueType.DATETIME;
+		else return ValueType.STRING;
+	}
+
+	public Map<String, ValueType> getFieldNamesAndTypes(final String coreName, final SolrClient client) throws IndexServiceException {
+		try {
+			if (cachedSchema.get(coreName) == null) {
+				synchronized (cachedSchema) {
+					Map<String, ValueType> schema = readFieldNamesAndTypes(coreName, client);
+					log.info("setting cache for schema of collection: " + coreName);
+					cachedSchema.put(coreName, schema);
+				}
+			}
+			return cachedSchema.get(coreName);
+		} catch (Exception e) {
+			throw new IndexServiceException("Unable to get Schema for " + coreName + " exception", e);
+		}
+	}
+
+	private Map<String, ValueType> readFieldNamesAndTypes(final String coreName, final SolrClient client) throws SolrServerException, IOException {
+		final LukeRequest request = new LukeRequest();
+		request.setShowSchema(true);
+		request.setNumTerms(0);
+		final LukeResponse response = request.process(client);
+		final Map<String, FieldInfo> fieldInfos = response.getFieldInfo();
+		final Map<String, LukeResponse.FieldTypeInfo> fieldTypeInfos = response.getFieldTypeInfo();
+		final Map<String, ValueType> result = Maps.newHashMap();
+		for (FieldInfo fieldInfo : fieldInfos.values()) {
+			LukeResponse.FieldTypeInfo fieldTypeInfo = fieldTypeInfos.get(fieldInfo.getType());
+			final String fieldName = fieldTypeInfo.getName().toLowerCase();
+			final ValueType fieldType = resolveSolrTypeClassName(fieldName);
+			result.put(fieldInfo.getName(), fieldType);
+		}
+		return result;
+	}
+
+	private String generateCreateIndexRequest(final String host,
+			final String port,
+			final String collectionName,
+			final String numShard,
+			final String replicationFactor,
+			final String collectionConfigName,
+			final String maxShardsPerNode) {
+		return String.format(createURLRequest, host, port, collectionName, numShard, replicationFactor, maxShardsPerNode, collectionConfigName);
+	}
+
+	private String generateUpdateIndexRequest(final String host, final String port, final String collectionName) {
+		return String.format(reloadURLRequest, host, port, collectionName);
+	}
+
+	/**
+	 * @return the httpClient
+	 */
+	public HttpClient getHttpClient() {
+		return httpClient;
+	}
+
+	/**
+	 * @param httpClient
+	 *            the httpClient to set
+	 */
+	@Required
+	public void setHttpClient(final HttpClient httpClient) {
+		log.info("setting http client " + httpClient.getClass());
+		this.httpClient = httpClient;
+	}
+
+	public void reloadCollection(final String host, final String port, final String collectionName) throws IndexServiceException {
+		log.info("creating the request of reload index " + generateUpdateIndexRequest(host, port, collectionName));
+		HttpGet request = new HttpGet(generateUpdateIndexRequest(host, port, collectionName));
+		HttpResponse response;
+		try {
+			response = httpClient.execute(request);
+		} catch (Exception e) {
+			throw new IndexServiceException("Unable to send request to solr server", e);
+		} finally {
+			request.releaseConnection();
+		}
+		if (response.getStatusLine().getStatusCode() != 200)
+			throw new IndexServiceException("Error on reloading index the error code from solr is" + response.toString());
+
+	}
+
+}
Index: modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/src/main/java/eu/dnetlib/functionality/index/utils/IndexSchemaFactory.java
===================================================================
--- modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/src/main/java/eu/dnetlib/functionality/index/utils/IndexSchemaFactory.java	(nonexistent)
+++ modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/src/main/java/eu/dnetlib/functionality/index/utils/IndexSchemaFactory.java	(revision 55805)
@@ -0,0 +1,86 @@
+package eu.dnetlib.functionality.index.utils;
+
+import java.io.IOException;
+
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerConfigurationException;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.TransformerFactoryConfigurationError;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.io.DocumentResult;
+import org.dom4j.io.DocumentSource;
+import org.dom4j.io.SAXReader;
+import org.springframework.beans.factory.annotation.Required;
+import org.springframework.core.io.Resource;
+
+import eu.dnetlib.data.provision.index.rmi.IndexServiceException;
+
+public class IndexSchemaFactory {
+
+	private static final Log log = LogFactory.getLog(IndexSchemaFactory.class); // NOPMD by marko on 11/24/08 5:02 PM
+
+	private final static String TEXT_FIELD_TYPE = "textFieldType";
+
+	private Resource schemaTemplate;
+
+	private String textFieldType;
+
+	/**
+	 * Transformer used to get the index schema.
+	 */
+	private Transformer transformer;
+
+	public void init() throws TransformerConfigurationException, TransformerFactoryConfigurationError, DocumentException, IOException {
+
+		transformer = TransformerFactory.newInstance().newTransformer(new DocumentSource(new SAXReader().read(getSchemaTemplate().getInputStream())));
+		transformer.setParameter(TEXT_FIELD_TYPE, getTextFieldType());
+	}
+
+	/**
+	 * @param docIn
+	 *            input document
+	 * @return the application of the schemaXslt transformation to the docIn document
+	 * @throws IndexServiceException
+	 */
+	public String getSchema(final Document fields) throws IndexServiceException {
+
+		log.debug("default field type: " + getTextFieldType());
+		log.debug("building schema from fields: \n" + fields.asXML() + "\n");
+
+		final DocumentResult result = new DocumentResult();
+		try {
+			transformer.transform(new DocumentSource(fields), result);
+			String xml = result.getDocument().asXML();
+
+			log.debug("new index schema:\n" + xml);
+
+			return xml;
+		} catch (TransformerException e) {
+			throw new IndexServiceException(e);
+		}
+	}
+
+	@Required
+	public void setSchemaTemplate(final Resource schemaTemplate) {
+		this.schemaTemplate = schemaTemplate;
+	}
+
+	public Resource getSchemaTemplate() {
+		return schemaTemplate;
+	}
+
+	@Required
+	public void setTextFieldType(final String textFieldType) {
+		this.textFieldType = textFieldType;
+	}
+
+	public String getTextFieldType() {
+		return textFieldType;
+	}
+
+}
Index: modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/src/main/java/eu/dnetlib/functionality/index/SolrIndexServerDAO.java
===================================================================
--- modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/src/main/java/eu/dnetlib/functionality/index/SolrIndexServerDAO.java	(nonexistent)
+++ modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/src/main/java/eu/dnetlib/functionality/index/SolrIndexServerDAO.java	(revision 55805)
@@ -0,0 +1,264 @@
+package eu.dnetlib.functionality.index;
+
+import java.io.IOException;
+import java.io.StringReader;
+import java.util.Map;
+
+import eu.dnetlib.functionality.cql.CqlValueTransformerMap;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import org.apache.solr.client.solrj.impl.CloudSolrClient;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.io.SAXReader;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Required;
+
+import com.google.common.collect.Maps;
+
+import eu.dnetlib.data.provision.index.rmi.IndexServiceException;
+
+import eu.dnetlib.functionality.index.feed.DocumentMapperFactory;
+import eu.dnetlib.functionality.index.model.Any.ValueType;
+import eu.dnetlib.functionality.index.query.IndexQueryFactory;
+import eu.dnetlib.functionality.index.query.SolrIndexQueryFactory;
+import eu.dnetlib.functionality.index.query.SolrIndexQueryResponseFactory;
+import eu.dnetlib.functionality.index.solr.cql.SolrTypeBasedCqlValueTransformerMapFactory;
+import eu.dnetlib.functionality.index.solr.feed.SolrDocumentMapperFactory;
+import eu.dnetlib.functionality.index.utils.IndexConfigFactory;
+import eu.dnetlib.functionality.index.utils.MetadataReference;
+import eu.dnetlib.functionality.index.utils.RemoteSolrAdministrator;
+import eu.dnetlib.functionality.index.utils.ZkUtils;
+
+/**
+ * The Class SolrIndexServerDAO.
+ */
+public class SolrIndexServerDAO extends AbstractBackendDescriptor implements IndexServerDAO {
+
+	/**
+	 * The log.
+	 */
+	private static final Log log = LogFactory.getLog(SolrIndexServerDAO.class); // NOPMD by marko on 11/24/08 5:02 PM
+
+	/** The zk utils. */
+	@Autowired
+	private ZkUtils zkUtils;
+
+	/** The query response factory. */
+	@Autowired
+	private SolrIndexQueryResponseFactory queryResponseFactory;
+
+	@Autowired
+	private SolrIndexQueryFactory solrIndexQueryFactory;
+
+	/** The solr document mapper factory. */
+	@Autowired
+	private SolrDocumentMapperFactory solrDocumentMapperFactory;
+
+	/** The solr administrator. */
+	private RemoteSolrAdministrator solrAdministrator;
+
+	/** The solr type based cql value transformer map. */
+	@Autowired
+	private SolrTypeBasedCqlValueTransformerMapFactory tMapFactory;
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see eu.dnetlib.functionality.index.IndexServerDAO#createIndexCollection(eu.dnetlib.functionality.index.utils.MetadataReference,
+	 *      java.lang.String)
+	 */
+	@Override
+	public void createIndexCollection(final MetadataReference mdref, final String fields) throws IndexServiceException {
+		CloudSolrClient client = null;
+		try {
+			client = getClient();
+			client.connect();
+
+			if (!solrAdministrator.indexCollectionExists(mdref.toString(), client)) {
+				Map<String, String> params = Maps.newHashMap();
+
+				final Map<String, String> p = getServiceProperties();
+				params.put("numShards", p.get("numShards"));
+				params.put("replicationFactor", p.get("replicationFactor"));
+
+				for (IndexConfigFactory.CONFIG_PARAMS param_Name : IndexConfigFactory.CONFIG_PARAMS.values()) {
+					params.put(param_Name.toString(), p.get(param_Name.toString()));
+				}
+
+				zkUtils.uploadZookeperConfig(client.getZkStateReader().getZkClient(), mdref.toString(), parse(fields), params, true);
+				solrAdministrator.createSolrIndex(p.get("host"), p.get("port"), mdref.toString(), p.get("numShards"), p.get("replicationFactor"),
+						mdref.toString(), p.get("maxShardsPerNode"));
+			}
+			client.getZkStateReader().close();
+
+		} catch (Exception e) {
+			log.error("Error on creating IndexCollection", e);
+			throw new IndexServiceException("Error on creating IndexCollection", e);
+		} finally {
+			if (client != null) {
+				shutdown(mdref);
+			}
+		}
+	}
+
+	@Override
+	public void updateIndexCollection(final MetadataReference mdRef, final Document fields) throws IndexServiceException {
+		CloudSolrClient client = null;
+		try {
+			client = getClient();
+			client.connect();
+			Map<String, String> params = Maps.newHashMap();
+
+			params.put("numShards", getServiceProperties().get("numShards"));
+			params.put("replicationFactor", getServiceProperties().get("replicationFactor"));
+
+			for (IndexConfigFactory.CONFIG_PARAMS param_Name : IndexConfigFactory.CONFIG_PARAMS.values()) {
+				params.put(param_Name.toString(), getServiceProperties().get(param_Name.toString()));
+			}
+
+			zkUtils.uploadZookeperConfig(client.getZkStateReader().getZkClient(), mdRef.toString(), fields, params, true);
+			client.getZkStateReader().close();
+			shutdown(mdRef);
+			solrAdministrator.reloadCollection(getServiceProperties().get("host"), getServiceProperties().get("port"), mdRef.toString());
+
+		} catch (Exception e) {
+			log.error("Error on updating IndexCollection", e);
+			throw new IndexServiceException("Error on updating IndexCollection", e);
+		} finally {
+			if (client != null) {
+				shutdown(mdRef);
+			}
+		}
+	}
+
+	/**
+	 * Parses the fields parameter.
+	 * 
+	 * @param fields
+	 *            the fields
+	 * @return the document
+	 * @throws IndexServiceException
+	 *             the index service exception
+	 */
+	private Document parse(final String fields) throws IndexServiceException {
+		try {
+			return new SAXReader().read(new StringReader(fields));
+		} catch (DocumentException e) {
+			throw new IndexServiceException("unable to parse fields: " + fields, e);
+		}
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see eu.dnetlib.functionality.index.IndexServerDAO#getIndexCollection(eu.dnetlib.functionality.index.utils.MetadataReference)
+	 */
+	@Override
+	public IndexCollection getIndexCollection(final MetadataReference mdref) throws IndexServiceException {
+		final CloudSolrClient client = getClient(mdref);
+		return new SolrIndexCollection(client);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see eu.dnetlib.functionality.index.IndexServerDAO#getSchema(MetadataReference)
+	 */
+	@Override
+	public Map<String, ValueType> getSchema(final MetadataReference mdRef) throws IndexServiceException {
+		CloudSolrClient client = getClient(mdRef);
+		Map<String, ValueType> fields = solrAdministrator.getFieldNamesAndTypes(mdRef.toString(), client);
+		shutdown(mdRef);
+		return fields;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see eu.dnetlib.functionality.index.IndexServerDAO#getCqlValueTransformerMap(MetadataReference)
+	 */
+	@Override
+	public CqlValueTransformerMap getCqlValueTransformerMap(final MetadataReference mdRef) throws IndexServiceException {
+		return tMapFactory.getIt(getSchema(mdRef));
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see eu.dnetlib.functionality.index.IndexServerDAO#getDocumentMapperFactory()
+	 */
+	@Override
+	public DocumentMapperFactory getDocumentMapperFactory() throws IndexServiceException {
+		return solrDocumentMapperFactory;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see eu.dnetlib.functionality.index.IndexServerDAO#shutdown(MetadataReference)
+	 */
+	@Override
+	public void shutdown(final MetadataReference mdRef) throws IndexServiceException {
+		try {
+			getClient(mdRef).close();
+		} catch (IOException e) {
+			throw new IndexServiceException(e);
+		}
+	}
+
+	/**
+	 * Gets a server with the default collection set according to the given mdRef.
+	 * 
+	 * @param mdRef
+	 *            the md ref
+	 * @return a server instance
+	 * @throws IndexServiceException
+	 *             the index service exception
+	 */
+	private CloudSolrClient getClient(final MetadataReference mdRef) throws IndexServiceException {
+		CloudSolrClient server = getClient();
+		server.setDefaultCollection(mdRef.toString());
+		return server;
+	}
+
+	/**
+	 * Gets the server.
+	 * 
+	 * @return a server instance
+	 */
+	private CloudSolrClient getClient() {
+		final String address = getEndpoint().get(ADDRESS);
+		log.info("connecting to address: " + address);
+		return new CloudSolrClient.Builder()
+				.withZkHost(address)
+				.build();
+	}
+
+	/**
+	 * Gets the solr administrator.
+	 * 
+	 * @return the solrAdministrator
+	 */
+	public RemoteSolrAdministrator getSolrAdministrator() {
+		return solrAdministrator;
+	}
+
+	/**
+	 * Sets the solr administrator.
+	 * 
+	 * @param solrAdministrator
+	 *            the solrAdministrator to set
+	 */
+	@Required
+	public void setSolrAdministrator(final RemoteSolrAdministrator solrAdministrator) {
+		this.solrAdministrator = solrAdministrator;
+	}
+
+	@Override
+	public IndexQueryFactory getIndexQueryFactory() {
+		return solrIndexQueryFactory;
+	}
+
+}
Index: modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/src/main/java/eu/dnetlib/functionality/index/solr/feed/SolrDocumentMapperFactory.java
===================================================================
--- modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/src/main/java/eu/dnetlib/functionality/index/solr/feed/SolrDocumentMapperFactory.java	(nonexistent)
+++ modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/src/main/java/eu/dnetlib/functionality/index/solr/feed/SolrDocumentMapperFactory.java	(revision 55805)
@@ -0,0 +1,94 @@
+package eu.dnetlib.functionality.index.solr.feed;
+
+import com.google.common.base.Function;
+import eu.dnetlib.functionality.index.feed.DocumentMapperFactory;
+import eu.dnetlib.functionality.index.model.Any.ValueType;
+import eu.dnetlib.functionality.index.model.document.IndexDocument;
+import eu.dnetlib.functionality.index.model.document.Status;
+import eu.dnetlib.functionality.index.model.util.SolrIndexDocument;
+import eu.dnetlib.functionality.index.utils.MetadataReference;
+import org.springframework.beans.factory.annotation.Required;
+
+import javax.xml.stream.XMLStreamException;
+import java.util.Map;
+
+/**
+ * A factory for creating SolrDocumentMapper objects.
+ */
+public class SolrDocumentMapperFactory implements DocumentMapperFactory {
+
+    protected static final String DNETRESULT = "result";
+    /**
+     * document factory used for the feed process.
+     */
+    private InputDocumentFactory documentFactory;
+
+
+    private Function<String, IndexDocument> getRecordMapper(final Map<String, ValueType> schema,
+                                                            final String dsId,
+                                                            final String version) {
+
+        return new Function<String, IndexDocument>() {
+
+            @Override
+            public IndexDocument apply(final String doc) {
+                SolrIndexDocument indexDocument = new SolrIndexDocument(schema, dsId);
+                try {
+                    indexDocument.setContent(documentFactory.parseDocument(version, doc, dsId, DNETRESULT));
+                } catch (XMLStreamException e) {
+                    return indexDocument.setMarked();
+                }
+                indexDocument.setStatus(Status.OK);
+                return indexDocument;
+            }
+        };
+    }
+
+    @Override
+    public Function<String, IndexDocument> getRecordMapper(final Map<String, ValueType> schema, final MetadataReference mdRef, final String dsId, final String version, final boolean emptyResult) {
+        if (emptyResult == false) return getRecordMapper(schema, dsId, version);
+        else {
+            return new Function<String, IndexDocument>() {
+
+                @Override
+                public IndexDocument apply(final String doc) {
+                    SolrIndexDocument indexDocument = new SolrIndexDocument(schema, dsId);
+                    try {
+
+                        ResultTransformer transformer = new ResultTransformer(ResultTransformer.Mode.empty) {
+                            @Override
+                            public String apply(String input) {
+                                return input;
+                            }
+                        };
+                        indexDocument.setContent(documentFactory.parseDocument(version, doc, dsId, DNETRESULT, transformer));
+                    } catch (XMLStreamException e) {
+                        return indexDocument.setMarked();
+                    }
+                    indexDocument.setStatus(Status.OK);
+                    return indexDocument;
+                }
+            };
+        }
+    }
+
+    /**
+     * Gets the document factory.
+     *
+     * @return the documentFactory
+     */
+    public InputDocumentFactory getDocumentFactory() {
+        return documentFactory;
+    }
+
+    /**
+     * Sets the document factory.
+     *
+     * @param documentFactory the documentFactory to set
+     */
+    @Required
+    public void setDocumentFactory(final InputDocumentFactory documentFactory) {
+        this.documentFactory = documentFactory;
+    }
+
+}
Index: modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/src/main/java/eu/dnetlib/functionality/index/solr/browsing/BrowsingRow.java
===================================================================
--- modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/src/main/java/eu/dnetlib/functionality/index/solr/browsing/BrowsingRow.java	(nonexistent)
+++ modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/src/main/java/eu/dnetlib/functionality/index/solr/browsing/BrowsingRow.java	(revision 55805)
@@ -0,0 +1,70 @@
+package eu.dnetlib.functionality.index.solr.browsing;
+
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+
+import org.springframework.beans.factory.annotation.Required;
+
+import eu.dnetlib.data.provision.index.rmi.GroupResult;
+
+/**
+ *
+ * serialization of the browsing result.
+ *
+ * <row> <groupresult field="facetFieldName1"> <value>facetFieldValue</value> <count>1</count> </groupresult>
+ * 
+ * <groupresult field="facetFieldName2"> <value>facetFieldValue</value> <count>1</count> </groupresult>
+ * 
+ * </row>
+ *
+ * @author claudio
+ *
+ */
+@XmlRootElement(namespace = "", name = "row")
+@XmlAccessorType(XmlAccessType.FIELD)
+public class BrowsingRow {
+
+	@XmlElement(name = "groupresult", required = true)
+	private List<GroupResult> groupresult;
+
+	public BrowsingRow() {}
+
+	public BrowsingRow(final List<GroupResult> groupresult) {
+		this.groupresult = groupresult;
+	}
+
+	/**
+	 * adds a GroupResult.
+	 *
+	 * @param fieldName
+	 * @param fieldValue
+	 * @param count
+	 */
+	public void addBrowsingRow(final String fieldName, final String fieldValue, final int count) {
+		groupresult.add(new GroupResult(fieldName, fieldValue, count));
+	}
+
+	@Override
+	public boolean equals(final Object obj) {
+
+		if (!(obj instanceof BrowsingRow)) return false;
+
+		final BrowsingRow brws = (BrowsingRow) obj;
+
+		return groupresult.equals(brws.getGroupResult());
+	}
+
+	public List<GroupResult> getGroupResult() {
+		return groupresult;
+	}
+
+	@Required
+	public void setGroupResult(final List<GroupResult> groupresult) {
+		this.groupresult = groupresult;
+	}
+
+}
Index: modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/src/main/java/eu/dnetlib/functionality/index/solr/browsing/GroupResult.java
===================================================================
--- modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/src/main/java/eu/dnetlib/functionality/index/solr/browsing/GroupResult.java	(nonexistent)
+++ modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/src/main/java/eu/dnetlib/functionality/index/solr/browsing/GroupResult.java	(revision 55805)
@@ -0,0 +1,81 @@
+package eu.dnetlib.functionality.index.solr.browsing;
+
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlRootElement;
+
+import org.springframework.beans.factory.annotation.Required;
+
+/**
+ * <pre>
+ * {@code
+ * <groupresult field="facetFieldName">
+ * 	<value>facetFieldValue</value>
+ * 	<count>1</count>
+ * </groupresult>
+ * }
+ * </pre>
+ *
+ * @author claudio
+ *
+ */
+@XmlRootElement(namespace = "", name = "groupresult")
+public class GroupResult {
+
+	private String name;
+
+	private String value;
+
+	private int count;
+
+	public GroupResult() {}
+
+	/**
+	 * Builds a groupResult.
+	 *
+	 * @param fieldName
+	 * @param fieldValue
+	 * @param count
+	 */
+	public GroupResult(final String name, final String value, final int count) {
+		this.name = name;
+		this.value = value;
+		this.count = count;
+	}
+
+	@Override
+	public boolean equals(final Object obj) {
+		if (!(obj instanceof GroupResult)) return false;
+		final GroupResult g = (GroupResult) obj;
+		if ((this.getCount() == g.getCount()) && this.getName().equals(g.getName()) && this.getValue().equals(g.getValue())) return true;
+		return false;
+	}
+
+	@XmlAttribute(name = "field", required = true)
+	public String getName() {
+		return name;
+	}
+
+	public String getValue() {
+		return value;
+	}
+
+	public int getCount() {
+		return count;
+	}
+
+	@Required
+	public void setName(final String name) {
+		this.name = name;
+	}
+
+	@Required
+	public void setValue(final String value) {
+		this.value = value;
+	}
+
+	@Required
+	public void setCount(final int count) {
+		this.count = count;
+	}
+
+}
Index: modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/src/main/resources/eu/dnetlib/functionality/index/conf/schemaTemplate.xslt
===================================================================
--- modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/src/main/resources/eu/dnetlib/functionality/index/conf/schemaTemplate.xslt	(nonexistent)
+++ modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/src/main/resources/eu/dnetlib/functionality/index/conf/schemaTemplate.xslt	(revision 55805)
@@ -0,0 +1,582 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+	<xsl:output omit-xml-declaration="yes" indent="yes"/>
+
+	<xsl:template match="/FIELDS">
+
+		<xsl:param name="textFieldType" select="string('text_common')"/>
+		<xsl:variable name="smallcase" select="'abcdefghijklmnopqrstuvwxyz'"/>
+		<xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/>
+
+		<!--
+		D-Net index schema template
+
+		CHANGELOG
+
+		0.1 : first release
+		0.2 : added preserveOriginal="1" for text field type in the index analyzer and catenateWords="1" for the query analyzer
+		0.3 : changed language for SnowballPorterFilterFactory to language="German2" (index/query) in the text field type
+		0.4 : added solr.ASCIIFoldingFilterFactory filter (index/query) in the text field type
+		0.5 : added long_keyword field type, to be used for objIdentifiers
+		0.6 : added field types for spellchecking
+		0.7 : added parameter for text field type
+		0.8 : added field _version_, needed by Solr 4.0.0 for the transaction log
+		0.9   : added type: text_en_splitting
+		0.91  : added type: ngramtext
+		0.92  : added schema optimizations, removing unnecessary stored fields
+		0.93  : added attribute preserveOriginal="1" to fieldtype ngramtext (query analysis) to improve matches
+		0.94  : updated and simplified ngramtext fieldtype
+		0.95  : update to solr 4.4, removed attribute "compress" from field definition, ngramfield doesn't support NGramFilterFactory anymore
+		0.96  : update to solr 4.9
+		0.97  : introduced field type string_ci supporting case insensitivity.
+		1.0   : updated to solr 6.6.0
+		 -->
+		<schema name="dnet" version="1.0">
+
+			<!-- Valid attributes for fields:
+			 name: mandatory - the name for the field
+			 type: mandatory - the name of a field type from the
+			   fieldTypes section
+			 indexed: true if this field should be indexed (searchable or sortable)
+			 stored: true if this field should be retrievable
+			 docValues: true if this field should have doc values. Doc values are
+			   useful (required, if you are using *Point fields) for faceting,
+			   grouping, sorting and function queries. Doc values will make the index
+			   faster to load, more NRT-friendly and more memory-efficient.
+			   They however come with some limitations: they are currently only
+			   supported by StrField, UUIDField, all Trie*Fields and *PointFields,
+			   and depending on the field type, they might require the field to be
+			   single-valued, be required or have a default value (check the
+			   documentation of the field type you're interested in for more information)
+			 multiValued: true if this field may contain multiple values per document
+			 omitNorms: (expert) set to true to omit the norms associated with
+			   this field (this disables length normalization and index-time
+			   boosting for the field, and saves some memory).  Only full-text
+			   fields or fields that need an index-time boost need norms.
+			   Norms are omitted for primitive (non-analyzed) types by default.
+			 termVectors: [false] set to true to store the term vector for a
+			   given field.
+			   When using MoreLikeThis, fields used for similarity should be
+			   stored for best performance.
+			 termPositions: Store position information with the term vector.
+			   This will increase storage costs.
+			 termOffsets: Store offset information with the term vector. This
+			   will increase storage costs.
+			 required: The field is required.  It will throw an error if the
+			   value does not exist
+			 default: a value that should be used if no value is specified
+			   when adding a document.
+			-->
+
+			<!-- field names should consist of alphanumeric or underscore characters only and
+			  not start with a digit.  This is not currently strictly enforced,
+			  but other field names will not have first class support from all components
+			  and back compatibility is not guaranteed.  Names with both leading and
+			  trailing underscores (e.g. _version_) are reserved.
+			-->
+
+			<xsl:for-each select="./FIELD">
+				<xsl:variable name="fieldname" select="translate(@name, $uppercase, $smallcase)"/>
+				<xsl:variable name="fieldtype">
+					<xsl:choose>
+						<xsl:when test="@type"><xsl:value-of select="@type"/></xsl:when>
+						<!-- this comment is here as a reference,
+							once the MDFormat profile will be updated, remove the old type mappings
+
+						<xsl:when test="@type='int'">pint</xsl:when>
+						<xsl:when test="@type='date'">pdate</xsl:when>
+						<xsl:when test="@type='ngramtext'">ngramtext</xsl:when>
+						<xsl:when test="@type='string_ci'">string_ci</xsl:when>
+						-->
+						<xsl:when test="@tokenizable='false'">string</xsl:when>
+						<xsl:otherwise>
+							<xsl:value-of select="$textFieldType"/>
+						</xsl:otherwise>
+					</xsl:choose>
+				</xsl:variable>
+				<xsl:variable name="isMultivalued">
+					<xsl:choose>
+						<xsl:when test="@multivalued='false'">false</xsl:when>
+						<xsl:otherwise>true</xsl:otherwise>
+					</xsl:choose>
+				</xsl:variable>
+				<xsl:variable name="isStored">
+					<xsl:choose>
+						<xsl:when test="@stored='true'">true</xsl:when>
+						<xsl:otherwise>false</xsl:otherwise>
+					</xsl:choose>
+				</xsl:variable>
+
+				<field name="{$fieldname}" type="{$fieldtype}" indexed="{@indexable}" stored="{normalize-space($isStored)}" multiValued="{normalize-space($isMultivalued)}"/>
+			</xsl:for-each>
+
+			<field name="__indexrecordidentifier" type="string" indexed="true" stored="true" multiValued="false" required="true"/>
+
+			<field name="__deleted" type="boolean" indexed="true" stored="false" default="false" omitNorms="true" omitTermFreqAndPositions="true"/>
+
+			<field name="__dsid" type="string" indexed="true" stored="true" omitNorms="true" omitTermFreqAndPositions="true"/>
+
+			<field name="__dsversion" type="pdate" indexed="true" stored="true" omitNorms="true" omitTermFreqAndPositions="true"/>
+
+			<field name="__result" type="string" indexed="false" stored="true" multiValued="false" docValues="false"/>
+
+			<field name="__all" type="{$textFieldType}" indexed="true" stored="false" multiValued="true"/>
+
+			<field name="_version_" type="long" indexed="true" stored="true" multiValued="false" />
+
+			<field name="_root_" type="string" indexed="true" stored="false" docValues="false" />
+
+			<!-- field for ping -->
+			<field name="text" type="{$textFieldType}" indexed="false" stored="false"/>
+
+			<!-- Field to use to determine and enforce document uniqueness.
+				 Unless this field is marked with required="false", it will be a required field
+			  -->
+			<uniqueKey>__indexrecordidentifier</uniqueKey>
+
+			<xsl:for-each select="./FIELD[(@type = 'ngramtext' or not(@type)) and not(@tokenizable = 'false')]">
+				<xsl:variable name="fieldname" select="translate(@name, $uppercase, $smallcase)"/>
+				<copyField source="{$fieldname}" dest="__all"/>
+			</xsl:for-each>
+
+			<!-- copyField commands copy one field to another at the time a document
+			   is added to the index.  It's used either to index the same field differently,
+			   or to add multiple fields to the same field for easier/faster searching.
+
+			<copyField source="sourceFieldName" dest="destinationFieldName"/>
+			-->
+
+			<!-- field type definitions. The "name" attribute is
+			   just a label to be used by field definitions.  The "class"
+			   attribute and any other attributes determine the real
+			   behavior of the fieldType.
+				 Class names starting with "solr" refer to java classes in a
+			   standard package such as org.apache.solr.analysis
+			-->
+
+			<!-- The StrField type is not analyzed, but indexed/stored verbatim.
+			   It supports doc values but in that case the field needs to be
+			   single-valued and either required or have a default value.
+			  -->
+			<fieldType name="string" class="solr.StrField" sortMissingLast="true" docValues="true" />
+			<fieldType name="strings" class="solr.StrField" sortMissingLast="true" multiValued="true" docValues="true" />
+
+			<!-- boolean type: "true" or "false" -->
+			<fieldType name="boolean" class="solr.BoolField" sortMissingLast="true"/>
+
+			<fieldType name="booleans" class="solr.BoolField" sortMissingLast="true" multiValued="true"/>
+
+			<!-- sortMissingLast and sortMissingFirst attributes are optional attributes are
+				 currently supported on types that are sorted internally as strings
+				 and on numeric types.
+				 This includes "string","boolean", "int", "float", "long", "date", "double",
+				 including the "Trie" and "Point" variants.
+			   - If sortMissingLast="true", then a sort on this field will cause documents
+				 without the field to come after documents with the field,
+				 regardless of the requested sort order (asc or desc).
+			   - If sortMissingFirst="true", then a sort on this field will cause documents
+				 without the field to come before documents with the field,
+				 regardless of the requested sort order.
+			   - If sortMissingLast="false" and sortMissingFirst="false" (the default),
+				 then default lucene sorting will be used which places docs without the
+				 field first in an ascending sort and last in a descending sort.
+			-->
+
+			<!--
+			  Numeric field types that index values using KD-trees. *Point fields are faster and more efficient than Trie* fields both, at
+			  search time and at index time, but some features are still not supported.
+			  Point fields don't support FieldCache, so they must have docValues="true" if needed for sorting, faceting, functions, etc.
+			-->
+			<fieldType name="pint" class="solr.IntPointField" docValues="true"/>
+			<fieldType name="pfloat" class="solr.FloatPointField" docValues="true"/>
+			<fieldType name="plong" class="solr.LongPointField" docValues="true"/>
+			<fieldType name="pdouble" class="solr.DoublePointField" docValues="true"/>
+
+			<fieldType name="pints" class="solr.IntPointField" docValues="true" multiValued="true"/>
+			<fieldType name="pfloats" class="solr.FloatPointField" docValues="true" multiValued="true"/>
+			<fieldType name="plongs" class="solr.LongPointField" docValues="true" multiValued="true"/>
+			<fieldType name="pdoubles" class="solr.DoublePointField" docValues="true" multiValued="true"/>
+
+			<!--
+			  Default numeric field types. For faster range queries, consider *PointFields (pint/pfloat/plong/pdouble), or the
+			  tint/tfloat/tlong/tdouble types.
+			-->
+			<fieldType name="int" class="solr.TrieIntField" docValues="true" precisionStep="0" positionIncrementGap="0"/>
+			<fieldType name="float" class="solr.TrieFloatField" docValues="true" precisionStep="0" positionIncrementGap="0"/>
+			<fieldType name="long" class="solr.TrieLongField" docValues="true" precisionStep="0" positionIncrementGap="0"/>
+			<fieldType name="double" class="solr.TrieDoubleField" docValues="true" precisionStep="0" positionIncrementGap="0"/>
+
+			<fieldType name="ints" class="solr.TrieIntField" docValues="true" precisionStep="0" positionIncrementGap="0" multiValued="true"/>
+			<fieldType name="floats" class="solr.TrieFloatField" docValues="true" precisionStep="0" positionIncrementGap="0" multiValued="true"/>
+			<fieldType name="longs" class="solr.TrieLongField" docValues="true" precisionStep="0" positionIncrementGap="0" multiValued="true"/>
+			<fieldType name="doubles" class="solr.TrieDoubleField" docValues="true" precisionStep="0" positionIncrementGap="0" multiValued="true"/>
+
+			<!--
+			 Numeric field types that index each value at various levels of precision
+			 to accelerate range queries when the number of values between the range
+			 endpoints is large. See the javadoc for NumericRangeQuery for internal
+			 implementation details.
+
+			 Smaller precisionStep values (specified in bits) will lead to more tokens
+			 indexed per value, slightly larger index size, and faster range queries.
+			 A precisionStep of 0 disables indexing at different precision levels.
+
+			 Consider using pint/pfloat/plong/pdouble instead of Trie* fields if possible
+			-->
+			<fieldType name="tint" class="solr.TrieIntField" docValues="true" precisionStep="8" positionIncrementGap="0"/>
+			<fieldType name="tfloat" class="solr.TrieFloatField" docValues="true" precisionStep="8" positionIncrementGap="0"/>
+			<fieldType name="tlong" class="solr.TrieLongField" docValues="true" precisionStep="8" positionIncrementGap="0"/>
+			<fieldType name="tdouble" class="solr.TrieDoubleField" docValues="true" precisionStep="8" positionIncrementGap="0"/>
+
+			<fieldType name="tints" class="solr.TrieIntField" docValues="true" precisionStep="8" positionIncrementGap="0" multiValued="true"/>
+			<fieldType name="tfloats" class="solr.TrieFloatField" docValues="true" precisionStep="8" positionIncrementGap="0" multiValued="true"/>
+			<fieldType name="tlongs" class="solr.TrieLongField" docValues="true" precisionStep="8" positionIncrementGap="0" multiValued="true"/>
+			<fieldType name="tdoubles" class="solr.TrieDoubleField" docValues="true" precisionStep="8" positionIncrementGap="0" multiValued="true"/>
+
+			<!-- The format for this date field is of the form 1995-12-31T23:59:59Z, and
+				 is a more restricted form of the canonical representation of dateTime
+				 http://www.w3.org/TR/xmlschema-2/#dateTime
+				 The trailing "Z" designates UTC time and is mandatory.
+				 Optional fractional seconds are allowed: 1995-12-31T23:59:59.999Z
+				 All other components are mandatory.
+
+				 Expressions can also be used to denote calculations that should be
+				 performed relative to "NOW" to determine the value, ie...
+
+					   NOW/HOUR
+						  ... Round to the start of the current hour
+					   NOW-1DAY
+						  ... Exactly 1 day prior to now
+					   NOW/DAY+6MONTHS+3DAYS
+						  ... 6 months and 3 days in the future from the start of
+							  the current day
+
+				 Consult the TrieDateField javadocs for more information.
+			  -->
+			<!-- KD-tree versions of date fields -->
+			<fieldType name="pdate" class="solr.DatePointField" docValues="true"/>
+			<fieldType name="pdates" class="solr.DatePointField" docValues="true" multiValued="true"/>
+
+			<fieldType name="date" class="solr.TrieDateField" docValues="true" precisionStep="0" positionIncrementGap="0"/>
+			<fieldType name="dates" class="solr.TrieDateField" docValues="true" precisionStep="0" positionIncrementGap="0" multiValued="true"/>
+
+			<fieldType name="tdate" class="solr.TrieDateField" docValues="true" precisionStep="6" positionIncrementGap="0"/>
+			<fieldType name="tdates" class="solr.TrieDateField" docValues="true" precisionStep="6" positionIncrementGap="0" multiValued="true"/>
+
+
+			<!--Binary data type. The data should be sent/retrieved in as Base64 encoded Strings -->
+			<fieldType name="binary" class="solr.BinaryField"/>
+
+			<!-- The "RandomSortField" is not used to store or search any
+				 data.  You can declare fields of this type it in your schema
+				 to generate pseudo-random orderings of your docs for sorting
+				 or function purposes.  The ordering is generated based on the field
+				 name and the version of the index. As long as the index version
+				 remains unchanged, and the same field name is reused,
+				 the ordering of the docs will be consistent.
+				 If you want different psuedo-random orderings of documents,
+				 for the same version of the index, use a dynamicField and
+				 change the field name in the request.
+			 -->
+			<fieldType name="random" class="solr.RandomSortField" indexed="true" />
+
+			<!-- solr.TextField allows the specification of custom text analyzers
+				 specified as a tokenizer and a list of token filters. Different
+				 analyzers may be specified for indexing and querying.
+
+				 The optional positionIncrementGap puts space between multiple fields of
+				 this type on the same document, with the purpose of preventing false phrase
+				 matching across fields.
+
+				 For more info on customizing your analyzer chain, please see
+				 http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters
+			 -->
+
+			<!-- One can also specify an existing Analyzer class that has a
+				 default constructor via the class attribute on the analyzer element.
+				 Example:
+			<fieldType name="text_greek" class="solr.TextField">
+			  <analyzer class="org.apache.lucene.analysis.el.GreekAnalyzer"/>
+			</fieldType>
+			-->
+
+			<!-- A text field that only splits on whitespace for exact matching of words -->
+			<!-- <dynamicField name="*_ws" type="text_ws"  indexed="true"  stored="true"/> -->
+
+			<fieldType name="text_ws" class="solr.TextField" positionIncrementGap="100">
+				<analyzer>
+					<tokenizer class="solr.WhitespaceTokenizerFactory"/>
+				</analyzer>
+			</fieldType>
+
+			<fieldType name="ngramtext" class="solr.TextField">
+				<analyzer type="index">
+					<tokenizer class="solr.KeywordTokenizerFactory"/>
+					<filter class="solr.LowerCaseFilterFactory"/>
+					<filter class="solr.NGramFilterFactory" minGramSize="3" maxGramSize="25"/>
+					<filter class="solr.TrimFilterFactory"/>
+					<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
+				</analyzer>
+				<analyzer type="query">
+					<tokenizer class="solr.KeywordTokenizerFactory"/>
+					<filter class="solr.LowerCaseFilterFactory"/>
+				</analyzer>
+			</fieldType>
+
+
+			<fieldType name="personName" class="solr.TextField"  positionIncrementGap="100">
+				<analyzer>
+					<tokenizer class="solr.StandardTokenizerFactory" />
+					<filter class="solr.LowerCaseFilterFactory" />
+				</analyzer>
+			</fieldType>
+
+			<fieldType name="personNamePrefix" class="solr.TextField"  positionIncrementGap="100">
+				<analyzer type="index">
+					<tokenizer class="solr.StandardTokenizerFactory"/>
+					<filter class="solr.LowerCaseFilterFactory" />
+					<filter class="solr.NGramFilterFactory" minGramSize="1" maxGramSize="30" />
+				</analyzer>
+				<analyzer type="query">
+					<tokenizer class="solr.StandardTokenizerFactory"/>
+					<filter class="solr.LowerCaseFilterFactory" />
+				</analyzer>
+			</fieldType>
+
+
+			<!-- A general text field that has reasonable, generic
+				 cross-language defaults: it tokenizes with StandardTokenizer,
+				   removes stop words from case-insensitive "stopwords.txt"
+				   (empty by default), and down cases.  At query time only, it
+				   also applies synonyms.
+			  -->
+			<fieldType name="text_common" class="solr.TextField" positionIncrementGap="100" multiValued="true">
+				<analyzer type="index">
+					<tokenizer class="solr.StandardTokenizerFactory"/>
+					<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
+					<!-- in this example, we will only use synonyms at query time
+					<filter class="solr.SynonymGraphFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
+					<filter class="solr.FlattenGraphFilterFactory"/>
+					-->
+					<filter class="solr.LowerCaseFilterFactory"/>
+				</analyzer>
+				<analyzer type="query">
+					<tokenizer class="solr.StandardTokenizerFactory"/>
+					<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
+					<filter class="solr.SynonymGraphFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
+					<filter class="solr.LowerCaseFilterFactory"/>
+				</analyzer>
+			</fieldType>
+
+			<!-- A text field with defaults appropriate for English: it
+				 tokenizes with StandardTokenizer, removes English stop words
+				 (stopwords_en.txt), down cases, protects words from protwords.txt, and
+				 finally applies Porter's stemming.  The query time analyzer
+				 also applies synonyms from synonyms.txt. -->
+			<!-- <dynamicField name="*_txt_en" type="text_en"  indexed="true"  stored="true"/> -->
+
+			<fieldType name="text_en" class="solr.TextField" positionIncrementGap="100">
+				<analyzer type="index">
+					<tokenizer class="solr.StandardTokenizerFactory"/>
+					<!-- in this example, we will only use synonyms at query time
+					<filter class="solr.SynonymGraphFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
+					<filter class="solr.FlattenGraphFilterFactory"/>
+					-->
+					<!-- Case insensitive stop word removal.
+					-->
+					<filter class="solr.StopFilterFactory"
+					        ignoreCase="true"
+					        words="stopwords.txt"
+					/>
+					<filter class="solr.LowerCaseFilterFactory"/>
+					<filter class="solr.EnglishPossessiveFilterFactory"/>
+					<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
+					<!-- Optionally you may want to use this less aggressive stemmer instead of PorterStemFilterFactory:
+					<filter class="solr.EnglishMinimalStemFilterFactory"/>
+					  -->
+					<filter class="solr.PorterStemFilterFactory"/>
+				</analyzer>
+				<analyzer type="query">
+					<tokenizer class="solr.StandardTokenizerFactory"/>
+					<filter class="solr.SynonymGraphFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
+					<filter class="solr.StopFilterFactory"
+					        ignoreCase="true"
+					        words="stopwords.txt"
+					/>
+					<filter class="solr.LowerCaseFilterFactory"/>
+					<filter class="solr.EnglishPossessiveFilterFactory"/>
+					<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
+					<!-- Optionally you may want to use this less aggressive stemmer instead of PorterStemFilterFactory:
+					<filter class="solr.EnglishMinimalStemFilterFactory"/>
+					  -->
+					<filter class="solr.PorterStemFilterFactory"/>
+				</analyzer>
+			</fieldType>
+
+			<!-- A text field with defaults appropriate for English, plus
+				 aggressive word-splitting and autophrase features enabled.
+				 This field is just like text_en, except it adds
+				 WordDelimiterGraphFilter to enable splitting and matching of
+				 words on case-change, alpha numeric boundaries, and
+				 non-alphanumeric chars.  This means certain compound word
+				 cases will work, for example query "wi fi" will match
+				 document "WiFi" or "wi-fi".
+			-->
+			<!-- <dynamicField name="*_txt_en_split" type="text_en_splitting"  indexed="true"  stored="true"/> -->
+			<fieldType name="text_en_splitting" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="true">
+				<analyzer type="index">
+					<tokenizer class="solr.WhitespaceTokenizerFactory"/>
+					<!-- in this example, we will only use synonyms at query time
+					<filter class="solr.SynonymGraphFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
+					-->
+					<!-- Case insensitive stop word removal.
+					-->
+					<filter class="solr.StopFilterFactory"
+					        ignoreCase="true"
+					        words="stopwords.txt"
+					/>
+					<filter class="solr.WordDelimiterGraphFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>
+					<filter class="solr.LowerCaseFilterFactory"/>
+					<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
+					<filter class="solr.PorterStemFilterFactory"/>
+					<filter class="solr.FlattenGraphFilterFactory" />
+				</analyzer>
+				<analyzer type="query">
+					<tokenizer class="solr.WhitespaceTokenizerFactory"/>
+					<filter class="solr.SynonymGraphFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
+					<filter class="solr.StopFilterFactory"
+					        ignoreCase="true"
+					        words="stopwords.txt"
+					/>
+					<filter class="solr.WordDelimiterGraphFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
+					<filter class="solr.LowerCaseFilterFactory"/>
+					<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
+					<filter class="solr.PorterStemFilterFactory"/>
+				</analyzer>
+			</fieldType>
+
+			<!-- Less flexible matching, but less false matches.  Probably not ideal for product names,
+				 but may be good for SKUs.  Can insert dashes in the wrong place and still match. -->
+			<!-- <dynamicField name="*_txt_en_split_tight" type="text_en_splitting_tight"  indexed="true"  stored="true"/> -->
+			<fieldType name="text_en_splitting_tight" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="true">
+				<analyzer type="index">
+					<tokenizer class="solr.WhitespaceTokenizerFactory"/>
+					<filter class="solr.SynonymGraphFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="false"/>
+					<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
+					<filter class="solr.WordDelimiterGraphFilterFactory" generateWordParts="0" generateNumberParts="0" catenateWords="1" catenateNumbers="1" catenateAll="0"/>
+					<filter class="solr.LowerCaseFilterFactory"/>
+					<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
+					<filter class="solr.EnglishMinimalStemFilterFactory"/>
+					<!-- this filter can remove any duplicate tokens that appear at the same position - sometimes
+						 possible with WordDelimiterGraphFilter in conjuncton with stemming. -->
+					<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
+					<filter class="solr.FlattenGraphFilterFactory" />
+				</analyzer>
+				<analyzer type="query">
+					<tokenizer class="solr.WhitespaceTokenizerFactory"/>
+					<filter class="solr.SynonymGraphFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="false"/>
+					<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
+					<filter class="solr.WordDelimiterGraphFilterFactory" generateWordParts="0" generateNumberParts="0" catenateWords="1" catenateNumbers="1" catenateAll="0"/>
+					<filter class="solr.LowerCaseFilterFactory"/>
+					<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
+					<filter class="solr.EnglishMinimalStemFilterFactory"/>
+					<!-- this filter can remove any duplicate tokens that appear at the same position - sometimes
+						 possible with WordDelimiterGraphFilter in conjuncton with stemming. -->
+					<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
+				</analyzer>
+			</fieldType>
+
+			<!-- Just like text_common except it reverses the characters of
+				   each token, to enable more efficient leading wildcard queries.
+			-->
+			<!-- <dynamicField name="*_txt_rev" type="text_common_rev"  indexed="true"  stored="true"/> -->
+			<fieldType name="text_rev" class="solr.TextField" positionIncrementGap="100">
+				<analyzer type="index">
+					<tokenizer class="solr.StandardTokenizerFactory"/>
+					<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
+					<filter class="solr.LowerCaseFilterFactory"/>
+					<filter class="solr.ReversedWildcardFilterFactory" withOriginal="true"
+					        maxPosAsterisk="3" maxPosQuestion="2" maxFractionAsterisk="0.33"/>
+				</analyzer>
+				<analyzer type="query">
+					<tokenizer class="solr.StandardTokenizerFactory"/>
+					<filter class="solr.SynonymGraphFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
+					<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
+					<filter class="solr.LowerCaseFilterFactory"/>
+				</analyzer>
+			</fieldType>
+
+			<!-- <dynamicField name="*_phon_en" type="phonetic_en"  indexed="true"  stored="true"/> -->
+			<fieldType name="phonetic_en" stored="false" indexed="true" class="solr.TextField" >
+				<analyzer>
+					<tokenizer class="solr.StandardTokenizerFactory"/>
+					<filter class="solr.DoubleMetaphoneFilterFactory" inject="false"/>
+				</analyzer>
+			</fieldType>
+
+			<fieldType name="string_ci" class="solr.TextField" sortMissingLast="true" omitNorms="true">
+				<analyzer type="query">
+					<tokenizer class="solr.KeywordTokenizerFactory"/>
+					<filter class="solr.LowerCaseFilterFactory"/>
+				</analyzer>
+			</fieldType>
+
+			<!--
+			  Example of using PathHierarchyTokenizerFactory at index time, so
+			  queries for paths match documents at that path, or in descendent paths
+			-->
+			<!-- <dynamicField name="*_descendent_path" type="descendent_path"  indexed="true"  stored="true"/> -->
+			<fieldType name="descendent_path" class="solr.TextField">
+				<analyzer type="index">
+					<tokenizer class="solr.PathHierarchyTokenizerFactory" delimiter="/" />
+				</analyzer>
+				<analyzer type="query">
+					<tokenizer class="solr.KeywordTokenizerFactory" />
+				</analyzer>
+			</fieldType>
+
+			<!--
+			  Example of using PathHierarchyTokenizerFactory at query time, so
+			  queries for paths match documents at that path, or in ancestor paths
+			-->
+			<!-- <dynamicField name="*_ancestor_path" type="ancestor_path"  indexed="true"  stored="true"/> -->
+			<fieldType name="ancestor_path" class="solr.TextField">
+				<analyzer type="index">
+					<tokenizer class="solr.KeywordTokenizerFactory" />
+				</analyzer>
+				<analyzer type="query">
+					<tokenizer class="solr.PathHierarchyTokenizerFactory" delimiter="/" />
+				</analyzer>
+			</fieldType>
+
+			<!-- since fields of this type are by default not stored or indexed,
+				 any data added to them will be ignored outright.  -->
+			<fieldType name="ignored" stored="false" indexed="false" docValues="false" multiValued="true" class="solr.StrField" />
+
+			<!-- This point type indexes the coordinates as separate fields (subFields)
+			  If subFieldType is defined, it references a type, and a dynamic field
+			  definition is created matching *___<typename>.  Alternately, if
+			  subFieldSuffix is defined, that is used to create the subFields.
+			  Example: if subFieldType="double", then the coordinates would be
+				indexed in fields myloc_0___double,myloc_1___double.
+			  Example: if subFieldSuffix="_d" then the coordinates would be indexed
+				in fields myloc_0_d,myloc_1_d
+			  The subFields are an implementation detail of the fieldType, and end
+			  users normally should not need to know about them.
+			 -->
+			<!-- <dynamicField name="*_point" type="point"  indexed="true"  stored="true"/> -->
+			<fieldType name="point" class="solr.PointType" dimension="2" subFieldSuffix="_d"/>
+
+			<!-- A specialized field for geospatial search filters and distance sorting. -->
+			<fieldType name="location" class="solr.LatLonPointSpatialField" docValues="true"/>
+
+			<!-- An alternative geospatial field type new to Solr 4.  It supports multiValued and polygon shapes.
+			  For more information about this and other Spatial fields new to Solr 4, see:
+			  http://wiki.apache.org/solr/SolrAdaptersForLuceneSpatial4
+			-->
+			<fieldType name="location_rpt" class="solr.SpatialRecursivePrefixTreeFieldType"
+			           geo="true" distErrPct="0.025" maxDistErr="0.001" distanceUnits="kilometers" />
+
+		</schema>
+	</xsl:template>
+</xsl:stylesheet>
Index: modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/src/main/resources/eu/dnetlib/functionality/index/conf/files/protwords.txt
===================================================================
--- modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/src/main/resources/eu/dnetlib/functionality/index/conf/files/protwords.txt	(nonexistent)
+++ modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/src/main/resources/eu/dnetlib/functionality/index/conf/files/protwords.txt	(revision 55805)
@@ -0,0 +1,21 @@
+# 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.
+
+#-----------------------------------------------------------------------
+# Use a protected word file to protect against the stemmer reducing two
+# unrelated words to the same base word.
+
+# Some non-words that normally won't be encountered,
+# just to test that they won't be stemmed.
+dontstems
+zwhacky
+
Index: modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/src/main/resources/eu/dnetlib/functionality/index/conf/files/stopwords.txt
===================================================================
--- modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/src/main/resources/eu/dnetlib/functionality/index/conf/files/stopwords.txt	(nonexistent)
+++ modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/src/main/resources/eu/dnetlib/functionality/index/conf/files/stopwords.txt	(revision 55805)
@@ -0,0 +1,49 @@
+# 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.
+a
+an
+and
+are
+as
+at
+be
+but
+by
+for
+if
+in
+into
+is
+it
+no
+not
+of
+on
+or
+s
+such
+t
+that
+the
+their
+then
+there
+these
+they
+this
+to
+was
+will
+with
Index: modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/src/main/resources/eu/dnetlib/functionality/index/conf/files/elevate.xml
===================================================================
--- modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/src/main/resources/eu/dnetlib/functionality/index/conf/files/elevate.xml	(nonexistent)
+++ modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/src/main/resources/eu/dnetlib/functionality/index/conf/files/elevate.xml	(revision 55805)
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+ 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.
+-->
+
+<!-- If this file is found in the config directory, it will only be
+     loaded once at startup.  If it is found in Solr's data
+     directory, it will be re-loaded every commit.
+
+   See http://wiki.apache.org/solr/QueryElevationComponent for more info
+
+-->
+<elevate>
+ <!-- Query elevation examples
+  <query text="foo bar">
+    <doc id="1" />
+    <doc id="2" />
+    <doc id="3" />
+  </query>
+
+for use with techproducts example
+ 
+  <query text="ipod">
+    <doc id="MA147LL/A" />  put the actual ipod at the top 
+    <doc id="IW-02" exclude="true" /> exclude this cable
+  </query>
+-->
+
+</elevate>
Index: modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/src/main/resources/eu/dnetlib/functionality/index/conf/files/currency.xml
===================================================================
--- modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/src/main/resources/eu/dnetlib/functionality/index/conf/files/currency.xml	(nonexistent)
+++ modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/src/main/resources/eu/dnetlib/functionality/index/conf/files/currency.xml	(revision 55805)
@@ -0,0 +1,67 @@
+<?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.
+-->
+
+<!-- Example exchange rates file for CurrencyField type named "currency" in example schema -->
+
+<currencyConfig version="1.0">
+  <rates>
+    <!-- Updated from http://www.exchangerate.com/ at 2011-09-27 -->
+    <rate from="USD" to="ARS" rate="4.333871" comment="ARGENTINA Peso" />
+    <rate from="USD" to="AUD" rate="1.025768" comment="AUSTRALIA Dollar" />
+    <rate from="USD" to="EUR" rate="0.743676" comment="European Euro" />
+    <rate from="USD" to="BRL" rate="1.881093" comment="BRAZIL Real" />
+    <rate from="USD" to="CAD" rate="1.030815" comment="CANADA Dollar" />
+    <rate from="USD" to="CLP" rate="519.0996" comment="CHILE Peso" />
+    <rate from="USD" to="CNY" rate="6.387310" comment="CHINA Yuan" />
+    <rate from="USD" to="CZK" rate="18.47134" comment="CZECH REP. Koruna" />
+    <rate from="USD" to="DKK" rate="5.515436" comment="DENMARK Krone" />
+    <rate from="USD" to="HKD" rate="7.801922" comment="HONG KONG Dollar" />
+    <rate from="USD" to="HUF" rate="215.6169" comment="HUNGARY Forint" />
+    <rate from="USD" to="ISK" rate="118.1280" comment="ICELAND Krona" />
+    <rate from="USD" to="INR" rate="49.49088" comment="INDIA Rupee" />
+    <rate from="USD" to="XDR" rate="0.641358" comment="INTNL MON. FUND SDR" />
+    <rate from="USD" to="ILS" rate="3.709739" comment="ISRAEL Sheqel" />
+    <rate from="USD" to="JPY" rate="76.32419" comment="JAPAN Yen" />
+    <rate from="USD" to="KRW" rate="1169.173" comment="KOREA (SOUTH) Won" />
+    <rate from="USD" to="KWD" rate="0.275142" comment="KUWAIT Dinar" />
+    <rate from="USD" to="MXN" rate="13.85895" comment="MEXICO Peso" />
+    <rate from="USD" to="NZD" rate="1.285159" comment="NEW ZEALAND Dollar" />
+    <rate from="USD" to="NOK" rate="5.859035" comment="NORWAY Krone" />
+    <rate from="USD" to="PKR" rate="87.57007" comment="PAKISTAN Rupee" />
+    <rate from="USD" to="PEN" rate="2.730683" comment="PERU Sol" />
+    <rate from="USD" to="PHP" rate="43.62039" comment="PHILIPPINES Peso" />
+    <rate from="USD" to="PLN" rate="3.310139" comment="POLAND Zloty" />
+    <rate from="USD" to="RON" rate="3.100932" comment="ROMANIA Leu" />
+    <rate from="USD" to="RUB" rate="32.14663" comment="RUSSIA Ruble" />
+    <rate from="USD" to="SAR" rate="3.750465" comment="SAUDI ARABIA Riyal" />
+    <rate from="USD" to="SGD" rate="1.299352" comment="SINGAPORE Dollar" />
+    <rate from="USD" to="ZAR" rate="8.329761" comment="SOUTH AFRICA Rand" />
+    <rate from="USD" to="SEK" rate="6.883442" comment="SWEDEN Krona" />
+    <rate from="USD" to="CHF" rate="0.906035" comment="SWITZERLAND Franc" />
+    <rate from="USD" to="TWD" rate="30.40283" comment="TAIWAN Dollar" />
+    <rate from="USD" to="THB" rate="30.89487" comment="THAILAND Baht" />
+    <rate from="USD" to="AED" rate="3.672955" comment="U.A.E. Dirham" />
+    <rate from="USD" to="UAH" rate="7.988582" comment="UKRAINE Hryvnia" />
+    <rate from="USD" to="GBP" rate="0.647910" comment="UNITED KINGDOM Pound" />
+    
+    <!-- Cross-rates for some common currencies -->
+    <rate from="EUR" to="GBP" rate="0.869914" />  
+    <rate from="EUR" to="NOK" rate="7.800095" />  
+    <rate from="GBP" to="NOK" rate="8.966508" />  
+  </rates>
+</currencyConfig>
Index: modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/src/main/resources/eu/dnetlib/functionality/index/conf/files/params.json
===================================================================
--- modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/src/main/resources/eu/dnetlib/functionality/index/conf/files/params.json	(nonexistent)
+++ modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/src/main/resources/eu/dnetlib/functionality/index/conf/files/params.json	(revision 55805)
@@ -0,0 +1,20 @@
+{"params":{
+  "query":{
+    "defType":"edismax",
+    "q.alt":"*:*",
+    "rows":"10",
+    "fl":"*,score",
+    "":{"v":0}
+  },
+  "facets":{
+    "facet":"on",
+    "facet.mincount": "1",
+    "":{"v":0}
+  },
+ "velocity":{
+   "wt": "velocity",
+   "v.template":"browse",
+   "v.layout": "layout",
+   "":{"v":0}
+ }
+}}
\ No newline at end of file
Index: modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/src/main/resources/eu/dnetlib/functionality/index/conf/files/synonyms.txt
===================================================================
--- modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/src/main/resources/eu/dnetlib/functionality/index/conf/files/synonyms.txt	(nonexistent)
+++ modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/src/main/resources/eu/dnetlib/functionality/index/conf/files/synonyms.txt	(revision 55805)
@@ -0,0 +1,29 @@
+# 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.
+
+#-----------------------------------------------------------------------
+#some test synonym mappings unlikely to appear in real input text
+aaafoo => aaabar
+bbbfoo => bbbfoo bbbbar
+cccfoo => cccbar cccbaz
+fooaaa,baraaa,bazaaa
+
+# Some synonym groups specific to this example
+GB,gib,gigabyte,gigabytes
+MB,mib,megabyte,megabytes
+Television, Televisions, TV, TVs
+#notice we use "gib" instead of "GiB" so any WordDelimiterGraphFilter coming
+#after us won't split it into two words.
+
+# Synonym mappings can be used for spelling correction too
+pixima => pixma
+
Index: modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/src/main/resources/eu/dnetlib/functionality/index/conf/solrconfig.xml.st
===================================================================
--- modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/src/main/resources/eu/dnetlib/functionality/index/conf/solrconfig.xml.st	(nonexistent)
+++ modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/src/main/resources/eu/dnetlib/functionality/index/conf/solrconfig.xml.st	(revision 55805)
@@ -0,0 +1,1412 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+ 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.
+-->
+
+<!--
+     For more details about configurations options that may appear in
+     this file, see http://wiki.apache.org/solr/SolrConfigXml.
+-->
+<config>
+	<!-- In all configuration below, a prefix of "solr." for class names
+		 is an alias that causes solr to search appropriate packages,
+		 including org.apache.solr.(search|update|request|core|analysis)
+
+		 You may also specify a fully qualified Java classname if you
+		 have your own custom plugins.
+	  -->
+
+	<!-- Controls what version of Lucene various components of Solr
+		 adhere to.  Generally, you want to use the latest version to
+		 get all bug fixes and improvements. It is highly recommended
+		 that you fully re-index after changing this setting as it can
+		 affect both how text is indexed and queried.
+	-->
+	<luceneMatchVersion>$luceneMatchVersion$</luceneMatchVersion>
+
+	<!-- <lib/> directives can be used to instruct Solr to load any Jars
+		 identified and use them to resolve any "plugins" specified in
+		 your solrconfig.xml or schema.xml (ie: Analyzers, Request
+		 Handlers, etc...).
+
+		 All directories and paths are resolved relative to the
+		 instanceDir.
+
+		 Please note that <lib/> directives are processed in the order
+		 that they appear in your solrconfig.xml file, and are "stacked"
+		 on top of each other when building a ClassLoader - so if you have
+		 plugin jars with dependencies on other jars, the "lower level"
+		 dependency jars should be loaded first.
+
+		 If a "./lib" directory exists in your instanceDir, all files
+		 found in it are included as if you had used the following
+		 syntax...
+
+				<lib dir="./lib" />
+	  -->
+
+	<!-- A 'dir' option by itself adds any files found in the directory
+		 to the classpath, this is useful for including all jars in a
+		 directory.
+
+		 When a 'regex' is specified in addition to a 'dir', only the
+		 files in that directory which completely match the regex
+		 (anchored on both ends) will be included.
+
+		 If a 'dir' option (with or without a regex) is used and nothing
+		 is found that matches, a warning will be logged.
+
+		 The examples below can be used to load some solr-contribs along
+		 with their external dependencies.
+	  -->
+	<lib dir="\${solr.install.dir:../../../..}/contrib/extraction/lib" regex=".*\.jar" />
+	<lib dir="\${solr.install.dir:../../../..}/dist/" regex="solr-cell-\d.*\.jar" />
+
+	<lib dir="\${solr.install.dir:../../../..}/contrib/clustering/lib/" regex=".*\.jar" />
+	<lib dir="\${solr.install.dir:../../../..}/dist/" regex="solr-clustering-\d.*\.jar" />
+
+	<lib dir="\${solr.install.dir:../../../..}/contrib/langid/lib/" regex=".*\.jar" />
+	<lib dir="\${solr.install.dir:../../../..}/dist/" regex="solr-langid-\d.*\.jar" />
+
+	<lib dir="\${solr.install.dir:../../../..}/contrib/velocity/lib" regex=".*\.jar" />
+	<lib dir="\${solr.install.dir:../../../..}/dist/" regex="solr-velocity-\d.*\.jar" />
+
+	<!-- an exact 'path' can be used instead of a 'dir' to specify a
+		 specific jar file.  This will cause a serious error to be logged
+		 if it can't be loaded.
+	  -->
+	<!--
+	   <lib path="../a-jar-that-does-not-exist.jar" />
+	-->
+
+	<!-- Data Directory
+
+		 Used to specify an alternate directory to hold all index data
+		 other than the default ./data under the Solr home.  If
+		 replication is in use, this should match the replication
+		 configuration.
+	  -->
+	<dataDir>\${solr.data.dir:}</dataDir>
+
+
+	<!-- The DirectoryFactory to use for indexes.
+
+		 solr.StandardDirectoryFactory is filesystem
+		 based and tries to pick the best implementation for the current
+		 JVM and platform.  solr.NRTCachingDirectoryFactory, the default,
+		 wraps solr.StandardDirectoryFactory and caches small files in memory
+		 for better NRT performance.
+
+		 One can force a particular implementation via solr.MMapDirectoryFactory,
+		 solr.NIOFSDirectoryFactory, or solr.SimpleFSDirectoryFactory.
+
+		 solr.RAMDirectoryFactory is memory based, not
+		 persistent, and doesn't work with replication.
+	  -->
+	<directoryFactory name="DirectoryFactory"
+	                  class="\${solr.directoryFactory:solr.NRTCachingDirectoryFactory}"/>
+
+	<!-- The CodecFactory for defining the format of the inverted index.
+		 The default implementation is SchemaCodecFactory, which is the official Lucene
+		 index format, but hooks into the schema to provide per-field customization of
+		 the postings lists and per-document values in the fieldType element
+		 (postingsFormat/docValuesFormat). Note that most of the alternative implementations
+		 are experimental, so if you choose to customize the index format, it's a good
+		 idea to convert back to the official format e.g. via IndexWriter.addIndexes(IndexReader)
+		 before upgrading to a newer version to avoid unnecessary reindexing.
+		 A "compressionMode" string element can be added to <codecFactory> to choose
+		 between the existing compression modes in the default codec: "BEST_SPEED" (default)
+		 or "BEST_COMPRESSION".
+	-->
+	<codecFactory class="solr.SchemaCodecFactory"/>
+
+	<!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+		 Index Config - These settings control low-level behavior of indexing
+		 Most example settings here show the default value, but are commented
+		 out, to more easily see where customizations have been made.
+
+		 Note: This replaces <indexDefaults> and <mainIndex> from older versions
+		 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+	<indexConfig>
+		<!-- maxFieldLength was removed in 4.0. To get similar behavior, include a
+			 LimitTokenCountFilterFactory in your fieldType definition. E.g.
+		 <filter class="solr.LimitTokenCountFilterFactory" maxTokenCount="10000"/>
+		-->
+		<!-- Maximum time to wait for a write lock (ms) for an IndexWriter. Default: 1000 -->
+		<!-- <writeLockTimeout>1000</writeLockTimeout>  -->
+
+		<!-- Expert: Enabling compound file will use less files for the index,
+			 using fewer file descriptors on the expense of performance decrease.
+			 Default in Lucene is "true". Default in Solr is "false" (since 3.6) -->
+		<!-- <useCompoundFile>false</useCompoundFile> -->
+
+		<!-- ramBufferSizeMB sets the amount of RAM that may be used by Lucene
+			 indexing for buffering added documents and deletions before they are
+			 flushed to the Directory.
+			 maxBufferedDocs sets a limit on the number of documents buffered
+			 before flushing.
+			 If both ramBufferSizeMB and maxBufferedDocs is set, then
+			 Lucene will flush based on whichever limit is hit first.  -->
+		<!-- <ramBufferSizeMB>100</ramBufferSizeMB> -->
+		<!-- <maxBufferedDocs>1000</maxBufferedDocs> -->
+
+		<!-- Expert: Merge Policy
+			 The Merge Policy in Lucene controls how merging of segments is done.
+			 The default since Solr/Lucene 3.3 is TieredMergePolicy.
+			 The default since Lucene 2.3 was the LogByteSizeMergePolicy,
+			 Even older versions of Lucene used LogDocMergePolicy.
+		  -->
+		<!--
+			<mergePolicyFactory class="org.apache.solr.index.TieredMergePolicyFactory">
+			  <int name="maxMergeAtOnce">10</int>
+			  <int name="segmentsPerTier">10</int>
+			  <double name="noCFSRatio">0.1</double>
+			</mergePolicyFactory>
+		  -->
+
+		<!-- Expert: Merge Scheduler
+			 The Merge Scheduler in Lucene controls how merges are
+			 performed.  The ConcurrentMergeScheduler (Lucene 2.3 default)
+			 can perform merges in the background using separate threads.
+			 The SerialMergeScheduler (Lucene 2.2 default) does not.
+		 -->
+		<!--
+		   <mergeScheduler class="org.apache.lucene.index.ConcurrentMergeScheduler"/>
+		   -->
+
+		<!-- LockFactory
+
+			 This option specifies which Lucene LockFactory implementation
+			 to use.
+
+			 single = SingleInstanceLockFactory - suggested for a
+					  read-only index or when there is no possibility of
+					  another process trying to modify the index.
+			 native = NativeFSLockFactory - uses OS native file locking.
+					  Do not use when multiple solr webapps in the same
+					  JVM are attempting to share a single index.
+			 simple = SimpleFSLockFactory  - uses a plain file for locking
+
+			 Defaults: 'native' is default for Solr3.6 and later, otherwise
+					   'simple' is the default
+
+			 More details on the nuances of each LockFactory...
+			 http://wiki.apache.org/lucene-java/AvailableLockFactories
+		-->
+		<lockType>\${solr.lock.type:native}</lockType>
+
+		<!-- Commit Deletion Policy
+			 Custom deletion policies can be specified here. The class must
+			 implement org.apache.lucene.index.IndexDeletionPolicy.
+
+			 The default Solr IndexDeletionPolicy implementation supports
+			 deleting index commit points on number of commits, age of
+			 commit point and optimized status.
+
+			 The latest commit point should always be preserved regardless
+			 of the criteria.
+		-->
+		<!--
+		<deletionPolicy class="solr.SolrDeletionPolicy">
+		-->
+		<!-- The number of commit points to be kept -->
+		<!-- <str name="maxCommitsToKeep">1</str> -->
+		<!-- The number of optimized commit points to be kept -->
+		<!-- <str name="maxOptimizedCommitsToKeep">0</str> -->
+		<!--
+			Delete all commit points once they have reached the given age.
+			Supports DateMathParser syntax e.g.
+		  -->
+		<!--
+		   <str name="maxCommitAge">30MINUTES</str>
+		   <str name="maxCommitAge">1DAY</str>
+		-->
+		<!--
+		</deletionPolicy>
+		-->
+
+		<!-- Lucene Infostream
+
+			 To aid in advanced debugging, Lucene provides an "InfoStream"
+			 of detailed information when indexing.
+
+			 Setting The value to true will instruct the underlying Lucene
+			 IndexWriter to write its debugging info the specified file
+		  -->
+		<!-- <infoStream file="INFOSTREAM.txt">false</infoStream> -->
+	</indexConfig>
+
+
+	<!-- JMX
+
+		 This example enables JMX if and only if an existing MBeanServer
+		 is found, use this if you want to configure JMX through JVM
+		 parameters. Remove this to disable exposing Solr configuration
+		 and statistics to JMX.
+
+		 For more details see http://wiki.apache.org/solr/SolrJmx
+	  -->
+	<jmx />
+	<!-- If you want to connect to a particular server, specify the
+		 agentId
+	  -->
+	<!-- <jmx agentId="myAgent" /> -->
+	<!-- If you want to start a new MBeanServer, specify the serviceUrl -->
+	<!-- <jmx serviceUrl="service:jmx:rmi:///jndi/rmi://localhost:9999/solr"/>
+	  -->
+
+	<!-- The default high-performance update handler -->
+	<updateHandler class="solr.DirectUpdateHandler2">
+
+		<!-- Enables a transaction log, used for real-time get, durability, and
+			 and solr cloud replica recovery.  The log can grow as big as
+			 uncommitted changes to the index, so use of a hard autoCommit
+			 is recommended (see below).
+			 "dir" - the target directory for transaction logs, defaults to the
+					solr data directory.
+			 "numVersionBuckets" - sets the number of buckets used to keep
+					track of max version values when checking for re-ordered
+					updates; increase this value to reduce the cost of
+					synchronizing access to version buckets during high-volume
+					indexing, this requires 8 bytes (long) * numVersionBuckets
+					of heap space per Solr core.
+		-->
+		<updateLog>
+			<str name="dir">\${solr.ulog.dir:}</str>
+			<int name="numVersionBuckets">\${solr.ulog.numVersionBuckets:65536}</int>
+		</updateLog>
+
+		<!-- AutoCommit
+
+			 Perform a hard commit automatically under certain conditions.
+			 Instead of enabling autoCommit, consider using "commitWithin"
+			 when adding documents.
+
+			 http://wiki.apache.org/solr/UpdateXmlMessages
+
+			 maxDocs - Maximum number of documents to add since the last
+					   commit before automatically triggering a new commit.
+
+			 maxTime - Maximum amount of time in ms that is allowed to pass
+					   since a document was added before automatically
+					   triggering a new commit.
+			 openSearcher - if false, the commit causes recent index changes
+			   to be flushed to stable storage, but does not cause a new
+			   searcher to be opened to make those changes visible.
+
+			 If the updateLog is enabled, then it's highly recommended to
+			 have some sort of hard autoCommit to limit the log size.
+		  -->
+		<autoCommit>
+			<maxTime>\${solr.autoCommit.maxTime:15000}</maxTime>
+			<openSearcher>false</openSearcher>
+		</autoCommit>
+
+		<!-- softAutoCommit is like autoCommit except it causes a
+			 'soft' commit which only ensures that changes are visible
+			 but does not ensure that data is synced to disk.  This is
+			 faster and more near-realtime friendly than a hard commit.
+		  -->
+
+		<autoSoftCommit>
+			<maxTime>\${solr.autoSoftCommit.maxTime:-1}</maxTime>
+		</autoSoftCommit>
+
+		<!-- Update Related Event Listeners
+
+			 Various IndexWriter related events can trigger Listeners to
+			 take actions.
+
+			 postCommit - fired after every commit or optimize command
+			 postOptimize - fired after every optimize command
+		  -->
+		<!-- The RunExecutableListener executes an external command from a
+			 hook such as postCommit or postOptimize.
+
+			 exe - the name of the executable to run
+			 dir - dir to use as the current working directory. (default=".")
+			 wait - the calling thread waits until the executable returns.
+					(default="true")
+			 args - the arguments to pass to the program.  (default is none)
+			 env - environment variables to set.  (default is none)
+		  -->
+		<!-- This example shows how RunExecutableListener could be used
+			 with the script based replication...
+			 http://wiki.apache.org/solr/CollectionDistribution
+		  -->
+		<!--
+		   <listener event="postCommit" class="solr.RunExecutableListener">
+			 <str name="exe">solr/bin/snapshooter</str>
+			 <str name="dir">.</str>
+			 <bool name="wait">true</bool>
+			 <arr name="args"> <str>arg1</str> <str>arg2</str> </arr>
+			 <arr name="env"> <str>MYVAR=val1</str> </arr>
+		   </listener>
+		  -->
+
+	</updateHandler>
+
+	<!-- IndexReaderFactory
+
+		 Use the following format to specify a custom IndexReaderFactory,
+		 which allows for alternate IndexReader implementations.
+
+		 ** Experimental Feature **
+
+		 Please note - Using a custom IndexReaderFactory may prevent
+		 certain other features from working. The API to
+		 IndexReaderFactory may change without warning or may even be
+		 removed from future releases if the problems cannot be
+		 resolved.
+
+
+		 ** Features that may not work with custom IndexReaderFactory **
+
+		 The ReplicationHandler assumes a disk-resident index. Using a
+		 custom IndexReader implementation may cause incompatibility
+		 with ReplicationHandler and may cause replication to not work
+		 correctly. See SOLR-1366 for details.
+
+	  -->
+	<!--
+	<indexReaderFactory name="IndexReaderFactory" class="package.class">
+	  <str name="someArg">Some Value</str>
+	</indexReaderFactory >
+	-->
+
+	<!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+		 Query section - these settings control query time things like caches
+		 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
+	<query>
+		<!-- Max Boolean Clauses
+
+			 Maximum number of clauses in each BooleanQuery,  an exception
+			 is thrown if exceeded.
+
+			 ** WARNING **
+
+			 This option actually modifies a global Lucene property that
+			 will affect all SolrCores.  If multiple solrconfig.xml files
+			 disagree on this property, the value at any given moment will
+			 be based on the last SolrCore to be initialized.
+
+		  -->
+		<maxBooleanClauses>1024</maxBooleanClauses>
+
+
+		<!-- Solr Internal Query Caches
+
+			 There are two implementations of cache available for Solr,
+			 LRUCache, based on a synchronized LinkedHashMap, and
+			 FastLRUCache, based on a ConcurrentHashMap.
+
+			 FastLRUCache has faster gets and slower puts in single
+			 threaded operation and thus is generally faster than LRUCache
+			 when the hit ratio of the cache is high (> 75%), and may be
+			 faster under other scenarios on multi-cpu systems.
+		-->
+
+		<!-- Filter Cache
+
+			 Cache used by SolrIndexSearcher for filters (DocSets),
+			 unordered sets of *all* documents that match a query.  When a
+			 new searcher is opened, its caches may be prepopulated or
+			 "autowarmed" using data from caches in the old searcher.
+			 autowarmCount is the number of items to prepopulate.  For
+			 LRUCache, the autowarmed items will be the most recently
+			 accessed items.
+
+			 Parameters:
+			   class - the SolrCache implementation LRUCache or
+				   (LRUCache or FastLRUCache)
+			   size - the maximum number of entries in the cache
+			   initialSize - the initial capacity (number of entries) of
+				   the cache.  (see java.util.HashMap)
+			   autowarmCount - the number of entries to prepopulate from
+				   and old cache.
+			   maxRamMB - the maximum amount of RAM (in MB) that this cache is allowed
+						  to occupy. Note that when this option is specified, the size
+						  and initialSize parameters are ignored.
+		  -->
+		<filterCache class="solr.FastLRUCache"
+		             size="512"
+		             initialSize="512"
+		             autowarmCount="0"/>
+
+		<!-- Query Result Cache
+
+			 Caches results of searches - ordered lists of document ids
+			 (DocList) based on a query, a sort, and the range of documents requested.
+			 Additional supported parameter by LRUCache:
+				maxRamMB - the maximum amount of RAM (in MB) that this cache is allowed
+						   to occupy
+		  -->
+		<queryResultCache class="solr.LRUCache"
+		                  size="512"
+		                  initialSize="512"
+		                  autowarmCount="0"/>
+
+		<!-- Document Cache
+
+			 Caches Lucene Document objects (the stored fields for each
+			 document).  Since Lucene internal document ids are transient,
+			 this cache will not be autowarmed.
+		  -->
+		<documentCache class="solr.LRUCache"
+		               size="512"
+		               initialSize="512"
+		               autowarmCount="0"/>
+
+		<!-- custom cache currently used by block join -->
+		<cache name="perSegFilter"
+		       class="solr.search.LRUCache"
+		       size="10"
+		       initialSize="0"
+		       autowarmCount="10"
+		       regenerator="solr.NoOpRegenerator" />
+
+		<!-- Field Value Cache
+
+			 Cache used to hold field values that are quickly accessible
+			 by document id.  The fieldValueCache is created by default
+			 even if not configured here.
+		  -->
+		<!--
+		   <fieldValueCache class="solr.FastLRUCache"
+							size="512"
+							autowarmCount="128"
+							showItems="32" />
+		  -->
+
+		<!-- Custom Cache
+
+			 Example of a generic cache.  These caches may be accessed by
+			 name through SolrIndexSearcher.getCache(),cacheLookup(), and
+			 cacheInsert().  The purpose is to enable easy caching of
+			 user/application level data.  The regenerator argument should
+			 be specified as an implementation of solr.CacheRegenerator
+			 if autowarming is desired.
+		  -->
+		<!--
+		   <cache name="myUserCache"
+				  class="solr.LRUCache"
+				  size="4096"
+				  initialSize="1024"
+				  autowarmCount="1024"
+				  regenerator="com.mycompany.MyRegenerator"
+				  />
+		  -->
+
+
+		<!-- Lazy Field Loading
+
+			 If true, stored fields that are not requested will be loaded
+			 lazily.  This can result in a significant speed improvement
+			 if the usual case is to not load all stored fields,
+			 especially if the skipped fields are large compressed text
+			 fields.
+		-->
+		<enableLazyFieldLoading>true</enableLazyFieldLoading>
+
+		<!-- Use Filter For Sorted Query
+
+			 A possible optimization that attempts to use a filter to
+			 satisfy a search.  If the requested sort does not include
+			 score, then the filterCache will be checked for a filter
+			 matching the query. If found, the filter will be used as the
+			 source of document ids, and then the sort will be applied to
+			 that.
+
+			 For most situations, this will not be useful unless you
+			 frequently get the same search repeatedly with different sort
+			 options, and none of them ever use "score"
+		  -->
+		<!--
+		   <useFilterForSortedQuery>true</useFilterForSortedQuery>
+		  -->
+
+		<!-- Result Window Size
+
+			 An optimization for use with the queryResultCache.  When a search
+			 is requested, a superset of the requested number of document ids
+			 are collected.  For example, if a search for a particular query
+			 requests matching documents 10 through 19, and queryWindowSize is 50,
+			 then documents 0 through 49 will be collected and cached.  Any further
+			 requests in that range can be satisfied via the cache.
+		  -->
+		<queryResultWindowSize>20</queryResultWindowSize>
+
+		<!-- Maximum number of documents to cache for any entry in the
+			 queryResultCache.
+		  -->
+		<queryResultMaxDocsCached>200</queryResultMaxDocsCached>
+
+		<!-- Query Related Event Listeners
+
+			 Various IndexSearcher related events can trigger Listeners to
+			 take actions.
+
+			 newSearcher - fired whenever a new searcher is being prepared
+			 and there is a current searcher handling requests (aka
+			 registered).  It can be used to prime certain caches to
+			 prevent long request times for certain requests.
+
+			 firstSearcher - fired whenever a new searcher is being
+			 prepared but there is no current registered searcher to handle
+			 requests or to gain autowarming data from.
+
+
+		  -->
+		<!-- QuerySenderListener takes an array of NamedList and executes a
+			 local query request for each NamedList in sequence.
+		  -->
+		<listener event="newSearcher" class="solr.QuerySenderListener">
+			<arr name="queries">
+				<!--
+				   <lst><str name="q">solr</str><str name="sort">price asc</str></lst>
+				   <lst><str name="q">rocks</str><str name="sort">weight asc</str></lst>
+				  -->
+			</arr>
+		</listener>
+		<listener event="firstSearcher" class="solr.QuerySenderListener">
+			<arr name="queries">
+				<!--
+				<lst>
+				  <str name="q">static firstSearcher warming in solrconfig.xml</str>
+				</lst>
+				-->
+			</arr>
+		</listener>
+
+		<!-- Use Cold Searcher
+
+			 If a search request comes in and there is no current
+			 registered searcher, then immediately register the still
+			 warming searcher and use it.  If "false" then all requests
+			 will block until the first searcher is done warming.
+		  -->
+		<useColdSearcher>false</useColdSearcher>
+
+	</query>
+
+
+	<!-- Request Dispatcher
+
+		 This section contains instructions for how the SolrDispatchFilter
+		 should behave when processing requests for this SolrCore.
+
+		 handleSelect is a legacy option that affects the behavior of requests
+		 such as /select?qt=XXX
+
+		 handleSelect="true" will cause the SolrDispatchFilter to process
+		 the request and dispatch the query to a handler specified by the
+		 "qt" param, assuming "/select" isn't already registered.
+
+		 handleSelect="false" will cause the SolrDispatchFilter to
+		 ignore "/select" requests, resulting in a 404 unless a handler
+		 is explicitly registered with the name "/select"
+
+		 handleSelect="true" is not recommended for new users, but is the default
+		 for backwards compatibility
+	  -->
+	<requestDispatcher handleSelect="false" >
+		<!-- Request Parsing
+
+			 These settings indicate how Solr Requests may be parsed, and
+			 what restrictions may be placed on the ContentStreams from
+			 those requests
+
+			 enableRemoteStreaming - enables use of the stream.file
+			 and stream.url parameters for specifying remote streams.
+
+			 multipartUploadLimitInKB - specifies the max size (in KiB) of
+			 Multipart File Uploads that Solr will allow in a Request.
+
+			 formdataUploadLimitInKB - specifies the max size (in KiB) of
+			 form data (application/x-www-form-urlencoded) sent via
+			 POST. You can use POST to pass request parameters not
+			 fitting into the URL.
+
+			 addHttpRequestToContext - if set to true, it will instruct
+			 the requestParsers to include the original HttpServletRequest
+			 object in the context map of the SolrQueryRequest under the
+			 key "httpRequest". It will not be used by any of the existing
+			 Solr components, but may be useful when developing custom
+			 plugins.
+
+			 *** WARNING ***
+			 The settings below authorize Solr to fetch remote files, You
+			 should make sure your system has some authentication before
+			 using enableRemoteStreaming="true"
+
+		  -->
+		<requestParsers enableRemoteStreaming="true"
+		                multipartUploadLimitInKB="2048000"
+		                formdataUploadLimitInKB="2048"
+		                addHttpRequestToContext="false"/>
+
+		<!-- HTTP Caching
+
+			 Set HTTP caching related parameters (for proxy caches and clients).
+
+			 The options below instruct Solr not to output any HTTP Caching
+			 related headers
+		  -->
+		<httpCaching never304="true" />
+		<!-- If you include a <cacheControl> directive, it will be used to
+			 generate a Cache-Control header (as well as an Expires header
+			 if the value contains "max-age=")
+
+			 By default, no Cache-Control header is generated.
+
+			 You can use the <cacheControl> option even if you have set
+			 never304="true"
+		  -->
+		<!--
+		   <httpCaching never304="true" >
+			 <cacheControl>max-age=30, public</cacheControl>
+		   </httpCaching>
+		  -->
+		<!-- To enable Solr to respond with automatically generated HTTP
+			 Caching headers, and to response to Cache Validation requests
+			 correctly, set the value of never304="false"
+
+			 This will cause Solr to generate Last-Modified and ETag
+			 headers based on the properties of the Index.
+
+			 The following options can also be specified to affect the
+			 values of these headers...
+
+			 lastModFrom - the default value is "openTime" which means the
+			 Last-Modified value (and validation against If-Modified-Since
+			 requests) will all be relative to when the current Searcher
+			 was opened.  You can change it to lastModFrom="dirLastMod" if
+			 you want the value to exactly correspond to when the physical
+			 index was last modified.
+
+			 etagSeed="..." is an option you can change to force the ETag
+			 header (and validation against If-None-Match requests) to be
+			 different even if the index has not changed (ie: when making
+			 significant changes to your config file)
+
+			 (lastModifiedFrom and etagSeed are both ignored if you use
+			 the never304="true" option)
+		  -->
+		<!--
+		   <httpCaching lastModifiedFrom="openTime"
+						etagSeed="Solr">
+			 <cacheControl>max-age=30, public</cacheControl>
+		   </httpCaching>
+		  -->
+	</requestDispatcher>
+
+	<!-- Request Handlers
+
+		 http://wiki.apache.org/solr/SolrRequestHandler
+
+		 Incoming queries will be dispatched to a specific handler by name
+		 based on the path specified in the request.
+
+		 Legacy behavior: If the request path uses "/select" but no Request
+		 Handler has that name, and if handleSelect="true" has been specified in
+		 the requestDispatcher, then the Request Handler is dispatched based on
+		 the qt parameter.  Handlers without a leading '/' are accessed this way
+		 like so: http://host/app/[core/]select?qt=name  If no qt is
+		 given, then the requestHandler that declares default="true" will be
+		 used or the one named "standard".
+
+		 If a Request Handler is declared with startup="lazy", then it will
+		 not be initialized until the first request that uses it.
+
+	  -->
+	<!-- SearchHandler
+
+		 http://wiki.apache.org/solr/SearchHandler
+
+		 For processing Search Queries, the primary Request Handler
+		 provided with Solr is "SearchHandler" It delegates to a sequent
+		 of SearchComponents (see below) and supports distributed
+		 queries across multiple shards
+	  -->
+	<requestHandler name="/select" class="solr.SearchHandler">
+		<!-- default values for query parameters can be specified, these
+			 will be overridden by parameters in the request
+		  -->
+		<lst name="defaults">
+			<str name="echoParams">explicit</str>
+			<str name="q.op">AND</str>
+			<int name="rows">10</int>
+			<!-- <str name="df">text</str> -->
+		</lst>
+		<!-- In addition to defaults, "appends" params can be specified
+			 to identify values which should be appended to the list of
+			 multi-val params from the query (or the existing "defaults").
+		  -->
+		<!-- In this example, the param "fq=instock:true" would be appended to
+			 any query time fq params the user may specify, as a mechanism for
+			 partitioning the index, independent of any user selected filtering
+			 that may also be desired (perhaps as a result of faceted searching).
+
+			 NOTE: there is *absolutely* nothing a client can do to prevent these
+			 "appends" values from being used, so don't use this mechanism
+			 unless you are sure you always want it.
+		  -->
+		<!--
+		   <lst name="appends">
+			 <str name="fq">inStock:true</str>
+		   </lst>
+		  -->
+		<!-- "invariants" are a way of letting the Solr maintainer lock down
+			 the options available to Solr clients.  Any params values
+			 specified here are used regardless of what values may be specified
+			 in either the query, the "defaults", or the "appends" params.
+
+			 In this example, the facet.field and facet.query params would
+			 be fixed, limiting the facets clients can use.  Faceting is
+			 not turned on by default - but if the client does specify
+			 facet=true in the request, these are the only facets they
+			 will be able to see counts for; regardless of what other
+			 facet.field or facet.query params they may specify.
+
+			 NOTE: there is *absolutely* nothing a client can do to prevent these
+			 "invariants" values from being used, so don't use this mechanism
+			 unless you are sure you always want it.
+		  -->
+		<!--
+		   <lst name="invariants">
+			 <str name="facet.field">cat</str>
+			 <str name="facet.field">manu_exact</str>
+			 <str name="facet.query">price:[* TO 500]</str>
+			 <str name="facet.query">price:[500 TO *]</str>
+		   </lst>
+		  -->
+		<!-- If the default list of SearchComponents is not desired, that
+			 list can either be overridden completely, or components can be
+			 prepended or appended to the default list.  (see below)
+		  -->
+		<!--
+		   <arr name="components">
+			 <str>nameOfCustomComponent1</str>
+			 <str>nameOfCustomComponent2</str>
+		   </arr>
+		  -->
+	</requestHandler>
+
+	<!-- A request handler that returns indented JSON by default -->
+	<requestHandler name="/query" class="solr.SearchHandler">
+		<lst name="defaults">
+			<str name="echoParams">explicit</str>
+			<str name="wt">json</str>
+			<str name="indent">true</str>
+		</lst>
+	</requestHandler>
+
+
+	<!-- A Robust Example
+
+		 This example SearchHandler declaration shows off usage of the
+		 SearchHandler with many defaults declared
+
+		 Note that multiple instances of the same Request Handler
+		 (SearchHandler) can be registered multiple times with different
+		 names (and different init parameters)
+	  -->
+	<requestHandler name="/browse" class="solr.SearchHandler" useParams="query,facets,velocity,browse">
+		<lst name="defaults">
+			<str name="echoParams">explicit</str>
+		</lst>
+	</requestHandler>
+
+	<initParams path="/update/**,/query,/select,/tvrh,/elevate,/spell,/browse">
+		<lst name="defaults">
+			<str name="df">__all</str>
+		</lst>
+	</initParams>
+
+	<!-- This enabled schemaless mode
+	<initParams path="/update/**">
+	  <lst name="defaults">
+		<str name="update.chain">add-unknown-fields-to-the-schema</str>
+	  </lst>
+	</initParams>
+	-->
+
+	<!-- Solr Cell Update Request Handler
+
+		 http://wiki.apache.org/solr/ExtractingRequestHandler
+
+	  -->
+	<requestHandler name="/update/extract"
+	                startup="lazy"
+	                class="solr.extraction.ExtractingRequestHandler" >
+		<lst name="defaults">
+			<str name="lowernames">true</str>
+			<str name="fmap.meta">ignored_</str>
+			<str name="fmap.content">__all</str>
+		</lst>
+	</requestHandler>
+	<!-- Search Components
+
+		 Search components are registered to SolrCore and used by
+		 instances of SearchHandler (which can access them by name)
+
+		 By default, the following components are available:
+
+		 <searchComponent name="query"     class="solr.QueryComponent" />
+		 <searchComponent name="facet"     class="solr.FacetComponent" />
+		 <searchComponent name="mlt"       class="solr.MoreLikeThisComponent" />
+		 <searchComponent name="highlight" class="solr.HighlightComponent" />
+		 <searchComponent name="stats"     class="solr.StatsComponent" />
+		 <searchComponent name="debug"     class="solr.DebugComponent" />
+
+		 Default configuration in a requestHandler would look like:
+
+		 <arr name="components">
+		   <str>query</str>
+		   <str>facet</str>
+		   <str>mlt</str>
+		   <str>highlight</str>
+		   <str>stats</str>
+		   <str>debug</str>
+		 </arr>
+
+		 If you register a searchComponent to one of the standard names,
+		 that will be used instead of the default.
+
+		 To insert components before or after the 'standard' components, use:
+
+		 <arr name="first-components">
+		   <str>myFirstComponentName</str>
+		 </arr>
+
+		 <arr name="last-components">
+		   <str>myLastComponentName</str>
+		 </arr>
+
+		 NOTE: The component registered with the name "debug" will
+		 always be executed after the "last-components"
+
+	   -->
+
+	<!-- Spell Check
+
+		 The spell check component can return a list of alternative spelling
+		 suggestions.
+
+		 http://wiki.apache.org/solr/SpellCheckComponent
+	  -->
+	<searchComponent name="spellcheck" class="solr.SpellCheckComponent">
+
+		<str name="queryAnalyzerFieldType">text_general</str>
+
+		<!-- Multiple "Spell Checkers" can be declared and used by this
+			 component
+		  -->
+
+		<!-- a spellchecker built from a field of the main index -->
+		<lst name="spellchecker">
+			<str name="name">default</str>
+			<str name="field">__all</str>
+			<str name="classname">solr.DirectSolrSpellChecker</str>
+			<!-- the spellcheck distance measure used, the default is the internal levenshtein -->
+			<str name="distanceMeasure">internal</str>
+			<!-- minimum accuracy needed to be considered a valid spellcheck suggestion -->
+			<float name="accuracy">0.5</float>
+			<!-- the maximum #edits we consider when enumerating terms: can be 1 or 2 -->
+			<int name="maxEdits">2</int>
+			<!-- the minimum shared prefix when enumerating terms -->
+			<int name="minPrefix">1</int>
+			<!-- maximum number of inspections per result. -->
+			<int name="maxInspections">5</int>
+			<!-- minimum length of a query term to be considered for correction -->
+			<int name="minQueryLength">4</int>
+			<!-- maximum threshold of documents a query term can appear to be considered for correction -->
+			<float name="maxQueryFrequency">0.01</float>
+			<!-- uncomment this to require suggestions to occur in 1% of the documents
+			  <float name="thresholdTokenFrequency">.01</float>
+			-->
+		</lst>
+
+		<!-- a spellchecker that can break or combine words.  See "/spell" handler below for usage -->
+		<!--
+		<lst name="spellchecker">
+		  <str name="name">wordbreak</str>
+		  <str name="classname">solr.WordBreakSolrSpellChecker</str>
+		  <str name="field">name</str>
+		  <str name="combineWords">true</str>
+		  <str name="breakWords">true</str>
+		  <int name="maxChanges">10</int>
+		</lst>
+		-->
+	</searchComponent>
+
+	<!-- A request handler for demonstrating the spellcheck component.
+
+		 NOTE: This is purely as an example.  The whole purpose of the
+		 SpellCheckComponent is to hook it into the request handler that
+		 handles your normal user queries so that a separate request is
+		 not needed to get suggestions.
+
+		 IN OTHER WORDS, THERE IS REALLY GOOD CHANCE THE SETUP BELOW IS
+		 NOT WHAT YOU WANT FOR YOUR PRODUCTION SYSTEM!
+
+		 See http://wiki.apache.org/solr/SpellCheckComponent for details
+		 on the request parameters.
+	  -->
+	<requestHandler name="/spell" class="solr.SearchHandler" startup="lazy">
+		<lst name="defaults">
+			<!-- Solr will use suggestions from both the 'default' spellchecker
+				 and from the 'wordbreak' spellchecker and combine them.
+				 collations (re-written queries) can include a combination of
+				 corrections from both spellcheckers -->
+			<str name="spellcheck.dictionary">default</str>
+			<str name="spellcheck">on</str>
+			<str name="spellcheck.extendedResults">true</str>
+			<str name="spellcheck.count">10</str>
+			<str name="spellcheck.alternativeTermCount">5</str>
+			<str name="spellcheck.maxResultsForSuggest">5</str>
+			<str name="spellcheck.collate">true</str>
+			<str name="spellcheck.collateExtendedResults">true</str>
+			<str name="spellcheck.maxCollationTries">10</str>
+			<str name="spellcheck.maxCollations">5</str>
+		</lst>
+		<arr name="last-components">
+			<str>spellcheck</str>
+		</arr>
+	</requestHandler>
+
+	<!-- Term Vector Component
+
+		 http://wiki.apache.org/solr/TermVectorComponent
+	  -->
+	<searchComponent name="tvComponent" class="solr.TermVectorComponent"/>
+
+	<!-- A request handler for demonstrating the term vector component
+
+		 This is purely as an example.
+
+		 In reality you will likely want to add the component to your
+		 already specified request handlers.
+	  -->
+	<requestHandler name="/tvrh" class="solr.SearchHandler" startup="lazy">
+		<lst name="defaults">
+			<bool name="tv">true</bool>
+		</lst>
+		<arr name="last-components">
+			<str>tvComponent</str>
+		</arr>
+	</requestHandler>
+
+	<!-- Clustering Component. (Omitted here. See the default Solr example for a typical configuration.) -->
+
+	<!-- Terms Component
+
+		 http://wiki.apache.org/solr/TermsComponent
+
+		 A component to return terms and document frequency of those
+		 terms
+	  -->
+	<searchComponent name="terms" class="solr.TermsComponent"/>
+
+	<!-- A request handler for demonstrating the terms component -->
+	<requestHandler name="/terms" class="solr.SearchHandler" startup="lazy">
+		<lst name="defaults">
+			<bool name="terms">true</bool>
+			<bool name="distrib">false</bool>
+		</lst>
+		<arr name="components">
+			<str>terms</str>
+		</arr>
+	</requestHandler>
+
+
+	<!-- Query Elevation Component
+
+		 http://wiki.apache.org/solr/QueryElevationComponent
+
+		 a search component that enables you to configure the top
+		 results for a given query regardless of the normal lucene
+		 scoring.
+	  -->
+	<searchComponent name="elevator" class="solr.QueryElevationComponent" >
+		<!-- pick a fieldType to analyze queries -->
+		<str name="queryFieldType">string</str>
+		<str name="config-file">elevate.xml</str>
+	</searchComponent>
+
+	<!-- A request handler for demonstrating the elevator component -->
+	<requestHandler name="/elevate" class="solr.SearchHandler" startup="lazy">
+		<lst name="defaults">
+			<str name="echoParams">explicit</str>
+		</lst>
+		<arr name="last-components">
+			<str>elevator</str>
+		</arr>
+	</requestHandler>
+
+	<!-- Highlighting Component
+
+		 http://wiki.apache.org/solr/HighlightingParameters
+	  -->
+	<searchComponent class="solr.HighlightComponent" name="highlight">
+		<highlighting>
+			<!-- Configure the standard fragmenter -->
+			<!-- This could most likely be commented out in the "default" case -->
+			<fragmenter name="gap"
+			            default="true"
+			            class="solr.highlight.GapFragmenter">
+				<lst name="defaults">
+					<int name="hl.fragsize">100</int>
+				</lst>
+			</fragmenter>
+
+			<!-- A regular-expression-based fragmenter
+				 (for sentence extraction)
+			  -->
+			<fragmenter name="regex"
+			            class="solr.highlight.RegexFragmenter">
+				<lst name="defaults">
+					<!-- slightly smaller fragsizes work better because of slop -->
+					<int name="hl.fragsize">70</int>
+					<!-- allow 50% slop on fragment sizes -->
+					<float name="hl.regex.slop">0.5</float>
+					<!-- a basic sentence pattern -->
+					<str name="hl.regex.pattern">[-\w ,/\n\&quot;&apos;]{20,200}</str>
+				</lst>
+			</fragmenter>
+
+			<!-- Configure the standard formatter -->
+			<formatter name="html"
+			           default="true"
+			           class="solr.highlight.HtmlFormatter">
+				<lst name="defaults">
+					<str name="hl.simple.pre"><![CDATA[<em>]]></str>
+					<str name="hl.simple.post"><![CDATA[</em>]]></str>
+				</lst>
+			</formatter>
+
+			<!-- Configure the standard encoder -->
+			<encoder name="html"
+			         class="solr.highlight.HtmlEncoder" />
+
+			<!-- Configure the standard fragListBuilder -->
+			<fragListBuilder name="simple"
+			                 class="solr.highlight.SimpleFragListBuilder"/>
+
+			<!-- Configure the single fragListBuilder -->
+			<fragListBuilder name="single"
+			                 class="solr.highlight.SingleFragListBuilder"/>
+
+			<!-- Configure the weighted fragListBuilder -->
+			<fragListBuilder name="weighted"
+			                 default="true"
+			                 class="solr.highlight.WeightedFragListBuilder"/>
+
+			<!-- default tag FragmentsBuilder -->
+			<fragmentsBuilder name="default"
+			                  default="true"
+			                  class="solr.highlight.ScoreOrderFragmentsBuilder">
+				<!--
+				<lst name="defaults">
+				  <str name="hl.multiValuedSeparatorChar">/</str>
+				</lst>
+				-->
+			</fragmentsBuilder>
+
+			<!-- multi-colored tag FragmentsBuilder -->
+			<fragmentsBuilder name="colored"
+			                  class="solr.highlight.ScoreOrderFragmentsBuilder">
+				<lst name="defaults">
+					<str name="hl.tag.pre"><![CDATA[
+               <b style="background:yellow">,<b style="background:lawgreen">,
+               <b style="background:aquamarine">,<b style="background:magenta">,
+               <b style="background:palegreen">,<b style="background:coral">,
+               <b style="background:wheat">,<b style="background:khaki">,
+               <b style="background:lime">,<b style="background:deepskyblue">]]></str>
+					<str name="hl.tag.post"><![CDATA[</b>]]></str>
+				</lst>
+			</fragmentsBuilder>
+
+			<boundaryScanner name="default"
+			                 default="true"
+			                 class="solr.highlight.SimpleBoundaryScanner">
+				<lst name="defaults">
+					<str name="hl.bs.maxScan">10</str>
+					<str name="hl.bs.chars">.,!? &#9;&#10;&#13;</str>
+				</lst>
+			</boundaryScanner>
+
+			<boundaryScanner name="breakIterator"
+			                 class="solr.highlight.BreakIteratorBoundaryScanner">
+				<lst name="defaults">
+					<!-- type should be one of CHARACTER, WORD(default), LINE and SENTENCE -->
+					<str name="hl.bs.type">WORD</str>
+					<!-- language and country are used when constructing Locale object.  -->
+					<!-- And the Locale object will be used when getting instance of BreakIterator -->
+					<str name="hl.bs.language">en</str>
+					<str name="hl.bs.country">US</str>
+				</lst>
+			</boundaryScanner>
+		</highlighting>
+	</searchComponent>
+
+	<!-- Update Processors
+
+		 Chains of Update Processor Factories for dealing with Update
+		 Requests can be declared, and then used by name in Update
+		 Request Processors
+
+		 http://wiki.apache.org/solr/UpdateRequestProcessor
+
+	  -->
+
+	<!-- Add unknown fields to the schema
+
+		 An example field type guessing update processor that will
+		 attempt to parse string-typed field values as Booleans, Longs,
+		 Doubles, or Dates, and then add schema fields with the guessed
+		 field types.
+
+		 This requires that the schema is both managed and mutable, by
+		 declaring schemaFactory as ManagedIndexSchemaFactory, with
+		 mutable specified as true.
+
+		 See http://wiki.apache.org/solr/GuessingFieldTypes
+	  -->
+	<updateRequestProcessorChain name="add-unknown-fields-to-the-schema">
+		<!-- UUIDUpdateProcessorFactory will generate an id if none is present in the incoming document -->
+		<processor class="solr.UUIDUpdateProcessorFactory" />
+		<processor class="solr.RemoveBlankFieldUpdateProcessorFactory"/>
+		<processor class="solr.FieldNameMutatingUpdateProcessorFactory">
+			<str name="pattern">[^\w-\.]</str>
+			<str name="replacement">_</str>
+		</processor>
+		<processor class="solr.ParseBooleanFieldUpdateProcessorFactory"/>
+		<processor class="solr.ParseLongFieldUpdateProcessorFactory"/>
+		<processor class="solr.ParseDoubleFieldUpdateProcessorFactory"/>
+		<processor class="solr.ParseDateFieldUpdateProcessorFactory">
+			<arr name="format">
+				<str>yyyy-MM-dd'T'HH:mm:ss.SSSZ</str>
+				<str>yyyy-MM-dd'T'HH:mm:ss,SSSZ</str>
+				<str>yyyy-MM-dd'T'HH:mm:ss.SSS</str>
+				<str>yyyy-MM-dd'T'HH:mm:ss,SSS</str>
+				<str>yyyy-MM-dd'T'HH:mm:ssZ</str>
+				<str>yyyy-MM-dd'T'HH:mm:ss</str>
+				<str>yyyy-MM-dd'T'HH:mmZ</str>
+				<str>yyyy-MM-dd'T'HH:mm</str>
+				<str>yyyy-MM-dd HH:mm:ss.SSSZ</str>
+				<str>yyyy-MM-dd HH:mm:ss,SSSZ</str>
+				<str>yyyy-MM-dd HH:mm:ss.SSS</str>
+				<str>yyyy-MM-dd HH:mm:ss,SSS</str>
+				<str>yyyy-MM-dd HH:mm:ssZ</str>
+				<str>yyyy-MM-dd HH:mm:ss</str>
+				<str>yyyy-MM-dd HH:mmZ</str>
+				<str>yyyy-MM-dd HH:mm</str>
+				<str>yyyy-MM-dd</str>
+			</arr>
+		</processor>
+		<processor class="solr.AddSchemaFieldsUpdateProcessorFactory">
+			<str name="defaultFieldType">strings</str>
+			<lst name="typeMapping">
+				<str name="valueClass">java.lang.Boolean</str>
+				<str name="fieldType">booleans</str>
+			</lst>
+			<lst name="typeMapping">
+				<str name="valueClass">java.util.Date</str>
+				<str name="fieldType">tdates</str>
+			</lst>
+			<lst name="typeMapping">
+				<str name="valueClass">java.lang.Long</str>
+				<str name="valueClass">java.lang.Integer</str>
+				<str name="fieldType">tlongs</str>
+			</lst>
+			<lst name="typeMapping">
+				<str name="valueClass">java.lang.Number</str>
+				<str name="fieldType">tdoubles</str>
+			</lst>
+		</processor>
+
+		<processor class="solr.LogUpdateProcessorFactory"/>
+		<processor class="solr.DistributedUpdateProcessorFactory"/>
+		<processor class="solr.RunUpdateProcessorFactory"/>
+	</updateRequestProcessorChain>
+
+	<!-- Deduplication
+
+		 An example dedup update processor that creates the "id" field
+		 on the fly based on the hash code of some other fields.  This
+		 example has overwriteDupes set to false since we are using the
+		 id field as the signatureField and Solr will maintain
+		 uniqueness based on that anyway.
+
+	  -->
+	<!--
+	   <updateRequestProcessorChain name="dedupe">
+		 <processor class="solr.processor.SignatureUpdateProcessorFactory">
+		   <bool name="enabled">true</bool>
+		   <str name="signatureField">id</str>
+		   <bool name="overwriteDupes">false</bool>
+		   <str name="fields">name,features,cat</str>
+		   <str name="signatureClass">solr.processor.Lookup3Signature</str>
+		 </processor>
+		 <processor class="solr.LogUpdateProcessorFactory" />
+		 <processor class="solr.RunUpdateProcessorFactory" />
+	   </updateRequestProcessorChain>
+	  -->
+
+	<!-- Language identification
+
+		 This example update chain identifies the language of the incoming
+		 documents using the langid contrib. The detected language is
+		 written to field language_s. No field name mapping is done.
+		 The fields used for detection are text, title, subject and description,
+		 making this example suitable for detecting languages form full-text
+		 rich documents injected via ExtractingRequestHandler.
+		 See more about langId at http://wiki.apache.org/solr/LanguageDetection
+	  -->
+	<!--
+	 <updateRequestProcessorChain name="langid">
+	   <processor class="org.apache.solr.update.processor.TikaLanguageIdentifierUpdateProcessorFactory">
+		 <str name="langid.fl">text,title,subject,description</str>
+		 <str name="langid.langField">language_s</str>
+		 <str name="langid.fallback">en</str>
+	   </processor>
+	   <processor class="solr.LogUpdateProcessorFactory" />
+	   <processor class="solr.RunUpdateProcessorFactory" />
+	 </updateRequestProcessorChain>
+	-->
+
+	<!-- Script update processor
+
+	  This example hooks in an update processor implemented using JavaScript.
+
+	  See more about the script update processor at http://wiki.apache.org/solr/ScriptUpdateProcessor
+	-->
+	<!--
+	  <updateRequestProcessorChain name="script">
+		<processor class="solr.StatelessScriptUpdateProcessorFactory">
+		  <str name="script">update-script.js</str>
+		  <lst name="params">
+			<str name="config_param">example config parameter</str>
+		  </lst>
+		</processor>
+		<processor class="solr.RunUpdateProcessorFactory" />
+	  </updateRequestProcessorChain>
+	-->
+
+	<!-- Response Writers
+
+		 http://wiki.apache.org/solr/QueryResponseWriter
+
+		 Request responses will be written using the writer specified by
+		 the 'wt' request parameter matching the name of a registered
+		 writer.
+
+		 The "default" writer is the default and will be used if 'wt' is
+		 not specified in the request.
+	  -->
+	<!-- The following response writers are implicitly configured unless
+		 overridden...
+	  -->
+	<!--
+	   <queryResponseWriter name="xml"
+							default="true"
+							class="solr.XMLResponseWriter" />
+	   <queryResponseWriter name="json" class="solr.JSONResponseWriter"/>
+	   <queryResponseWriter name="python" class="solr.PythonResponseWriter"/>
+	   <queryResponseWriter name="ruby" class="solr.RubyResponseWriter"/>
+	   <queryResponseWriter name="php" class="solr.PHPResponseWriter"/>
+	   <queryResponseWriter name="phps" class="solr.PHPSerializedResponseWriter"/>
+	   <queryResponseWriter name="csv" class="solr.CSVResponseWriter"/>
+	   <queryResponseWriter name="schema.xml" class="solr.SchemaXmlResponseWriter"/>
+	  -->
+
+	<queryResponseWriter name="json" class="solr.JSONResponseWriter">
+		<!-- For the purposes of the tutorial, JSON responses are written as
+		 plain text so that they are easy to read in *any* browser.
+		 If you expect a MIME type of "application/json" just remove this override.
+		-->
+		<str name="content-type">text/plain; charset=UTF-8</str>
+	</queryResponseWriter>
+
+	<!--
+	   Custom response writers can be declared as needed...
+	  -->
+	<queryResponseWriter name="velocity" class="solr.VelocityResponseWriter" startup="lazy">
+		<str name="template.base.dir">\${velocity.template.base.dir:}</str>
+		<str name="solr.resource.loader.enabled">\${velocity.solr.resource.loader.enabled:true}</str>
+		<str name="params.resource.loader.enabled">\${velocity.params.resource.loader.enabled:false}</str>
+	</queryResponseWriter>
+
+	<!-- XSLT response writer transforms the XML output by any xslt file found
+		 in Solr's conf/xslt directory.  Changes to xslt files are checked for
+		 every xsltCacheLifetimeSeconds.
+	  -->
+	<queryResponseWriter name="xslt" class="solr.XSLTResponseWriter">
+		<int name="xsltCacheLifetimeSeconds">5</int>
+	</queryResponseWriter>
+
+	<!-- Query Parsers
+
+		 https://cwiki.apache.org/confluence/display/solr/Query+Syntax+and+Parsing
+
+		 Multiple QParserPlugins can be registered by name, and then
+		 used in either the "defType" param for the QueryComponent (used
+		 by SearchHandler) or in LocalParams
+	  -->
+	<!-- example of registering a query parser -->
+	<!--
+	   <queryParser name="myparser" class="com.mycompany.MyQParserPlugin"/>
+	  -->
+
+	<!-- Function Parsers
+
+		 http://wiki.apache.org/solr/FunctionQuery
+
+		 Multiple ValueSourceParsers can be registered by name, and then
+		 used as function names when using the "func" QParser.
+	  -->
+	<!-- example of registering a custom function parser  -->
+	<!--
+	   <valueSourceParser name="myfunc"
+						  class="com.mycompany.MyValueSourceParser" />
+	  -->
+
+
+	<!-- Document Transformers
+		 http://wiki.apache.org/solr/DocTransformers
+	  -->
+	<!--
+	   Could be something like:
+	   <transformer name="db" class="com.mycompany.LoadFromDatabaseTransformer" >
+		 <int name="connection">jdbc://....</int>
+	   </transformer>
+
+	   To add a constant value to all docs, use:
+	   <transformer name="mytrans2" class="org.apache.solr.response.transform.ValueAugmenterFactory" >
+		 <int name="value">5</int>
+	   </transformer>
+
+	   If you want the user to still be able to change it with _value:something_ use this:
+	   <transformer name="mytrans3" class="org.apache.solr.response.transform.ValueAugmenterFactory" >
+		 <double name="defaultValue">5</double>
+	   </transformer>
+
+		If you are using the QueryElevationComponent, you may wish to mark documents that get boosted.  The
+		EditorialMarkerFactory will do exactly that:
+	   <transformer name="qecBooster" class="org.apache.solr.response.transform.EditorialMarkerFactory" />
+	  -->
+</config>
Index: modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/src/main/resources/eu/dnetlib/functionality/index/applicationContext-index-solr-service.properties
===================================================================
--- modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/src/main/resources/eu/dnetlib/functionality/index/applicationContext-index-solr-service.properties	(nonexistent)
+++ modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/src/main/resources/eu/dnetlib/functionality/index/applicationContext-index-solr-service.properties	(revision 55805)
@@ -0,0 +1,24 @@
+service.solr.index.staticConfigurationClasspath= eu/dnetlib/functionality/index/conf/files/**
+service.solr.index.jsonConfiguration= \
+        {"id":"solr",\
+        "address":"localhost:9983",\
+        "port":"8983",\
+        "webContext":"solr",\
+        "numShards":"4",\
+        "replicationFactor":"1",\
+	    "maxShardsPerNode":"4",\
+        "host":"localhost",\
+        "luceneMatchVersion":"6.6.0",\
+        "feedingShutdownTolerance":"30000",\
+        "feedingBufferFlushThreshold":"1000",\
+        "feedingSimulationMode":"false" }
+
+service.index.solr.returnEmptyFields		= true
+service.index.solr.schema.textfieldtype		= text_common
+service.index.solr.nh.mdformat.enable		= true
+service.index.solr.highlight.enable			= true
+service.index.solr.rank.enable				= true
+service.index.feed.repeatDelay				= 20000
+services.mapreduce.index.solr.feed.sim.mode	= false
+service.index.solr.document.factory			= eu.dnetlib.functionality.index.solr.feed.StreamingInputDocumentFactory
+service.index.solr.schema.template			= classpath:/eu/dnetlib/functionality/index/conf/schemaTemplate.xslt
Index: modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/src/main/resources/eu/dnetlib/functionality/index/applicationContext-index-solr-service.xml
===================================================================
--- modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/src/main/resources/eu/dnetlib/functionality/index/applicationContext-index-solr-service.xml	(nonexistent)
+++ modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/src/main/resources/eu/dnetlib/functionality/index/applicationContext-index-solr-service.xml	(revision 55805)
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	   xmlns:p="http://www.springframework.org/schema/p"
+	   xmlns:http="http://cxf.apache.org/transports/http/configuration"
+	   xmlns="http://www.springframework.org/schema/beans"
+	   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+
+
+						http://cxf.apache.org/transports/http/configuration http://cxf.apache.org/schemas/configuration/http-conf.xsd">
+
+	<bean id="solrAdministrator"
+		class="eu.dnetlib.functionality.index.utils.RemoteSolrAdministrator"
+		p:httpClient-ref="solrHTTPClient" />
+
+	<bean id="solrHTTPClient" factory-bean="httpClientBuilder" factory-method="build" />
+	
+	<bean id="httpClientBuilder" class="org.apache.http.impl.client.HttpClientBuilder"
+		factory-method="create" />
+
+	<bean id="solrIndexServerDAO" class="eu.dnetlib.functionality.index.SolrIndexServerDAO"
+		p:jsonConfiguration="${service.solr.index.jsonConfiguration}"
+		p:solrAdministrator-ref="solrAdministrator" init-method="init" />
+
+	<bean id="zkUtils" class="eu.dnetlib.functionality.index.utils.ZkUtils"
+		p:staticConfigurationClasspath="${service.solr.index.staticConfigurationClasspath}"
+		p:configFactory-ref="solrIndexConfigFactory" />
+
+	<bean id="solrConfigTemplate"
+		class="eu.dnetlib.springutils.stringtemplate.StringTemplateFactory"
+		p:template="classpath:/eu/dnetlib/functionality/index/conf/solrconfig.xml.st"
+		scope="prototype" />
+
+	<bean id="solrIndexConfigFactory" class="eu.dnetlib.functionality.index.utils.IndexConfigFactory"
+		p:solrConfig-ref="solrConfigTemplate" />
+
+	<bean id="solrIndexSchemaFactory" class="eu.dnetlib.functionality.index.utils.IndexSchemaFactory"
+		  p:schemaTemplate="${service.index.solr.schema.template}"
+		  p:textFieldType="${service.index.solr.schema.textfieldtype}"
+		  init-method="init"/>
+
+	<bean id="solrdocumentFactory" class="${service.index.solr.document.factory}" />
+
+	<bean id="solrDocumentMapperFactory"
+		class="eu.dnetlib.functionality.index.solr.feed.SolrDocumentMapperFactory"
+		p:documentFactory-ref="solrdocumentFactory" />
+
+</beans>
\ No newline at end of file
Index: modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/pom.xml
===================================================================
--- modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/pom.xml	(nonexistent)
+++ modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/pom.xml	(revision 55805)
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+	<parent>
+		<groupId>eu.dnetlib</groupId>
+		<artifactId>dnet45-parent</artifactId>
+		<version>1.0.0-SNAPSHOT</version>
+		<relativePath />
+	</parent>
+	<modelVersion>4.0.0</modelVersion>
+	<groupId>eu.dnetlib</groupId>
+	<artifactId>dnet-index-solr-service</artifactId>
+	<version>3.0.0-SNAPSHOT</version>
+	<scm>
+		<developerConnection>scm:svn:https://svn.driver.research-infrastructures.eu/driver/dnet45/modules/dnet-index-solr-service/trunk</developerConnection>
+	</scm>
+	<dependencies>
+		<dependency>
+			<groupId>eu.dnetlib</groupId>
+			<artifactId>dnet-modular-index-service</artifactId>
+			<version>[2.0.0,2.9.9)</version>
+		</dependency>
+		<dependency>
+			<groupId>eu.dnetlib</groupId>
+			<artifactId>dnet-index-solr-client</artifactId>
+			<version>[2.0.0,2.9.9)</version>
+			<exclusions>
+				<exclusion>
+					<groupId>org.slf4j</groupId>
+					<artifactId>jcl-over-slf4j</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+	</dependencies>
+</project>
Index: modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/deploy.info
===================================================================
--- modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/deploy.info	(nonexistent)
+++ modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7/deploy.info	(revision 55805)
@@ -0,0 +1 @@
+{ "type_source": "SVN", "goal": "package -U -T 4C source:jar", "url": "http://svn-public.driver.research-infrastructures.eu/driver/dnet45/modules/dnet-index-solr-service/trunk/", "deploy_repository": "dnet45-snapshots", "version": "4", "mail": "sandro.labruzzo@isti.cnr.it,michele.artini@isti.cnr.it, claudio.atzori@isti.cnr.it, alessia.bardi@isti.cnr.it", "deploy_repository_url": "http://maven.research-infrastructures.eu/nexus/content/repositories/dnet45-snapshots", "name": "dnet-index-solr-service" }
\ No newline at end of file
Index: modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7
===================================================================
--- modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7	(nonexistent)
+++ modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7	(revision 55805)

Property changes on: modules/dnet-index-solr-service/tags/dnet-index-solr-service-2.4.7
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,6 ##
+*.iml
+target
+.settings
+.classpath
+.project
+
