This is an automated email from the ASF dual-hosted git repository.
epugh pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/solr.git
The following commit(s) were added to refs/heads/main by this push:
new df903cb SOLR-10887: Append .xml to managed-schema file VERSION 2
(#279)
df903cb is described below
commit df903cbdc1de7fb2c3469b9773d6f9d23d591a5d
Author: Eric Pugh <[email protected]>
AuthorDate: Thu Sep 16 08:43:31 2021 -0400
SOLR-10887: Append .xml to managed-schema file VERSION 2 (#279)
Managed schema file is now called "managed-schema.xml", however there is a
fallback to "managed-schema" since that is a common legacy name for the file.
Updated the name of the files used in running tests.
---
dev-docs/overseer/overseer.adoc | 2 +-
solr/CHANGES.txt | 2 +
.../org/apache/solr/core/ConfigSetService.java | 2 +-
.../solr/handler/designer/SchemaDesignerAPI.java | 2 +-
.../solr/schema/ManagedIndexSchemaFactory.java | 93 +++++++++--
.../java/org/apache/solr/schema/SchemaManager.java | 18 ++-
.../apache/solr/schema/ZkIndexSchemaReader.java | 14 +-
.../collection1/conf/solrconfig-managed-schema.xml | 2 +-
.../managed-schema | 0
.../upload/legacy-managed-schema/solrconfig.xml | 60 +++++++
.../managed-schema => regular/managed-schema.xml} | 0
.../managed-schema.xml} | 0
.../{managed-schema => managed-schema.xml} | 0
.../org/apache/solr/cloud/TestConfigSetsAPI.java | 71 ++++++--
.../solr/schema/SpatialRPTFieldTypeTest.java | 52 +++---
.../apache/solr/schema/TestCloudManagedSchema.java | 4 +-
.../org/apache/solr/schema/TestManagedSchema.java | 87 +++++-----
.../conf/{managed-schema => managed-schema.xml} | 178 ++++++++++-----------
solr/solr-ref-guide/src/config-sets.adoc | 4 +-
solr/solr-ref-guide/src/configuration-files.adoc | 6 +-
solr/solr-ref-guide/src/coreadmin-api.adoc | 2 +-
.../src/documents-fields-schema-design.adoc | 2 +-
solr/solr-ref-guide/src/schema-api.adoc | 6 +-
solr/solr-ref-guide/src/schema-elements.adoc | 2 +-
solr/solr-ref-guide/src/schema-factory.adoc | 10 +-
solr/solr-ref-guide/src/schemaless-mode.adoc | 2 +-
solr/solr-ref-guide/src/solr-glossary.adoc | 4 +-
.../solrcloud-with-legacy-configuration-files.adoc | 2 +-
solr/solr-ref-guide/src/tutorial-diy.adoc | 2 +-
solr/solr-ref-guide/src/tutorial-techproducts.adoc | 2 +-
.../src/user-managed-index-replication.adoc | 2 +-
.../collection1/conf/solrconfig-managed-schema.xml | 7 +-
32 files changed, 406 insertions(+), 234 deletions(-)
diff --git a/dev-docs/overseer/overseer.adoc b/dev-docs/overseer/overseer.adoc
index 6929270..350096b 100644
--- a/dev-docs/overseer/overseer.adoc
+++ b/dev-docs/overseer/overseer.adoc
@@ -322,7 +322,7 @@ These messages are received from the Collection API queue
(there’s a single qu
The `createConfigSet()` call implementing `CREATE` copies all the files of an
existing config set (by default the `_default` config set) into a new config
set, merges the existing config set properties if any with new ones specified
in the message (config set properties in the message are properties that start
with `"configSetProp."`, for example `configSetProp.immutable` is a property
that prevents the config set from ever being deleted) and writes the resulting
properties into `/config [...]
-Note the `_default` config set is defined in the SolrCloud distribution and
copied if absent into Zookeeper when SolrCloud starts
(`ZkController.bootstrapDefaultConfigSet`) then used only from Zookeeper. This
config set has a directory `lang` with language specific stop words,
contractions and other, and it contains files `managed-schema`, `params.json`,
`protwords.txt`, `solrconfig.xml`, `stopwords.txt` and `synonyms.txt`.
+Note the `_default` config set is defined in the SolrCloud distribution and
copied if absent into Zookeeper when SolrCloud starts
(`ZkController.bootstrapDefaultConfigSet`) then used only from Zookeeper. This
config set has a directory `lang` with language specific stop words,
contractions and other, and it contains files `managed-schema.xml`,
`params.json`, `protwords.txt`, `solrconfig.xml`, `stopwords.txt` and
`synonyms.txt`.
deleteConfigSet() deletes the whole znode structure at `/configs/_<config set
name>_` assuming the config set is not used by any collection and is not
immutable (the only case where an immutable config set can be deleted is when
its creation has failed midway).
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 4d53d9c..43e0b36 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -143,6 +143,8 @@ when told to. The admin UI now tells it to. (Nazerke
Seidan, David Smiley)
This was already working for XML & "javabin"/SolrJ. Previously, omitting
the ID would be confused
for a partial/atomic update. (David Smiley)
+* SOLR-10887: Migrate "managed-schema" file naming to "managed-schema.xml"
file name, with a fallback to the legacy "managed-schema". (Eric Pugh, David
Smiley)
+
Build
---------------------
diff --git a/solr/core/src/java/org/apache/solr/core/ConfigSetService.java
b/solr/core/src/java/org/apache/solr/core/ConfigSetService.java
index a4b246a..de80fba 100644
--- a/solr/core/src/java/org/apache/solr/core/ConfigSetService.java
+++ b/solr/core/src/java/org/apache/solr/core/ConfigSetService.java
@@ -265,7 +265,7 @@ public abstract class ConfigSetService {
// This is the schema name that we think will actually be used. In the
case of a managed schema,
// we don't know for sure without examining what files exists in the
configSet, and we don't
// want to pay the overhead of that at this juncture. If we guess wrong,
no schema sharing.
- // The fix is usually to name your schema managed-schema instead of
schema.xml.
+ // The fix is usually to name your schema managed-schema.xml instead of
schema.xml.
IndexSchemaFactory indexSchemaFactory =
IndexSchemaFactory.newIndexSchemaFactory(solrConfig);
String configSet = cd.getConfigSet();
diff --git
a/solr/core/src/java/org/apache/solr/handler/designer/SchemaDesignerAPI.java
b/solr/core/src/java/org/apache/solr/handler/designer/SchemaDesignerAPI.java
index 1108065..4eb26b2 100644
--- a/solr/core/src/java/org/apache/solr/handler/designer/SchemaDesignerAPI.java
+++ b/solr/core/src/java/org/apache/solr/handler/designer/SchemaDesignerAPI.java
@@ -1042,7 +1042,7 @@ public class SchemaDesignerAPI implements
SchemaDesignerConstants {
final String prefix = configPathInZk + "/";
final int prefixLen = prefix.length();
Set<String> stripPrefix = files.stream().map(f -> f.startsWith(prefix) ?
f.substring(prefixLen) : f).collect(Collectors.toSet());
- stripPrefix.remove(DEFAULT_MANAGED_SCHEMA_RESOURCE_NAME);
+ stripPrefix.remove(schema.getResourceName());
stripPrefix.remove("lang");
stripPrefix.remove(CONFIGOVERLAY_JSON); // treat this file as private
diff --git
a/solr/core/src/java/org/apache/solr/schema/ManagedIndexSchemaFactory.java
b/solr/core/src/java/org/apache/solr/schema/ManagedIndexSchemaFactory.java
index 75bdd3a..7c3e670 100644
--- a/solr/core/src/java/org/apache/solr/schema/ManagedIndexSchemaFactory.java
+++ b/solr/core/src/java/org/apache/solr/schema/ManagedIndexSchemaFactory.java
@@ -20,6 +20,9 @@ import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.lang.invoke.MethodHandles;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
import org.apache.commons.io.IOUtils;
import org.apache.solr.cloud.ZkController;
@@ -34,6 +37,7 @@ import org.apache.solr.core.ConfigSetService;
import org.apache.solr.core.SolrConfig;
import org.apache.solr.core.SolrCore;
import org.apache.solr.core.SolrResourceLoader;
+import org.apache.solr.core.SolrResourceNotFoundException;
import org.apache.solr.util.SystemIdResolver;
import org.apache.solr.util.plugin.SolrCoreAware;
import org.apache.zookeeper.CreateMode;
@@ -49,7 +53,8 @@ public class ManagedIndexSchemaFactory extends
IndexSchemaFactory implements Sol
public static final String UPGRADED_SCHEMA_EXTENSION = ".bak";
private static final String SCHEMA_DOT_XML = "schema.xml";
- public static final String DEFAULT_MANAGED_SCHEMA_RESOURCE_NAME =
"managed-schema";
+ public static final String DEFAULT_MANAGED_SCHEMA_RESOURCE_NAME =
"managed-schema.xml";
+ public static final String LEGACY_MANAGED_SCHEMA_RESOURCE_NAME =
"managed-schema";
public static final String MANAGED_SCHEMA_RESOURCE_NAME =
"managedSchemaResourceName";
private boolean isMutable = true;
@@ -79,7 +84,6 @@ public class ManagedIndexSchemaFactory extends
IndexSchemaFactory implements Sol
log.error(msg);
throw new SolrException(ErrorCode.SERVER_ERROR, msg);
}
-
if (args.size() > 0) {
String msg = "Unexpected arg(s): " + args;
log.error(msg);
@@ -93,6 +97,65 @@ public class ManagedIndexSchemaFactory extends
IndexSchemaFactory implements Sol
}
/**
+ * Lookup the path to the managed schema, dealing with falling back to the
+ * legacy managed-schema file, instead of the expected managed-schema.xml
file if the legacy file exists.
+ *
+ * This method is duplicated in ManagedIndexSchema.
+ */
+ public String lookupZKManagedSchemaPath() {
+ final ZkSolrResourceLoader zkLoader = (ZkSolrResourceLoader)loader;
+ final ZkController zkController = zkLoader.getZkController();
+ final SolrZkClient zkClient = zkController.getZkClient();
+ String managedSchemaPath = zkLoader.getConfigSetZkPath() + "/" +
managedSchemaResourceName;
+ final String legacyManagedSchemaPath = zkLoader.getConfigSetZkPath() + "/"
+ ManagedIndexSchemaFactory.LEGACY_MANAGED_SCHEMA_RESOURCE_NAME;
+ try {
+ // check if we are using the legacy managed-schema file name.
+ if (zkClient.exists(legacyManagedSchemaPath, true)){
+ log.debug("Legacy managed schema resource {} found - loading legacy
managed schema instead of {} file."
+ , ManagedIndexSchemaFactory.LEGACY_MANAGED_SCHEMA_RESOURCE_NAME,
managedSchemaResourceName);
+ managedSchemaPath = legacyManagedSchemaPath;
+ }
+ } catch (KeeperException e) {
+ throw new RuntimeException(e);
+ } catch (InterruptedException e) {
+ // Restore the interrupted status
+ Thread.currentThread().interrupt();
+ throw new RuntimeException(e);
+
+ }
+ return managedSchemaPath;
+ }
+
+ /**
+ * Lookup the path to the managed schema, dealing with falling back to the
+ * legacy managed-schema file, instead of the expected managed-schema.xml
file if the legacy file exists.
+ */
+ public Path lookupLocalManagedSchemaPath() {
+ final Path legacyManagedSchemaPath =
Paths.get(loader.getConfigPath().toString(),
ManagedIndexSchemaFactory.LEGACY_MANAGED_SCHEMA_RESOURCE_NAME);
+
+ Path managedSchemaPath = Paths.get(loader.getConfigPath().toString(),
managedSchemaResourceName);
+
+ // check if we are using the legacy managed-schema file name.
+ if (Files.exists(legacyManagedSchemaPath)){
+ log.debug("Legacy managed schema resource {} found - loading legacy
managed schema instead of {} file.",
ManagedIndexSchemaFactory.LEGACY_MANAGED_SCHEMA_RESOURCE_NAME,
managedSchemaResourceName);
+ managedSchemaPath = legacyManagedSchemaPath;
+ }
+
+ Path parentPath = managedSchemaPath.getParent();
+ if (!Files.isDirectory(parentPath)) {
+ try {
+ Files.createDirectories(parentPath);
+ }
+ catch (IOException ioe) {
+ final String msg = "Can't create managed schema directory " +
parentPath;
+ log.error(msg);
+ throw new SolrException(ErrorCode.SERVER_ERROR, msg);
+ }
+ }
+
+ return managedSchemaPath;
+ }
+ /**
* First, try to locate the managed schema file named in the
managedSchemaResourceName
* param. If the managed schema file exists and is accessible, it is used to
instantiate
* an IndexSchema.
@@ -102,7 +165,7 @@ public class ManagedIndexSchemaFactory extends
IndexSchemaFactory implements Sol
*
* Once the IndexSchema is instantiated, if the managed schema file does not
exist,
* the instantiated IndexSchema is persisted to the managed schema file
named in the
- * managedSchemaResourceName param, in the directory given by
+ * managedSchemaResourceName param, in the directory given by
* {@link org.apache.solr.core.SolrResourceLoader#getConfigDir()}, or if
configs are
* in ZooKeeper, under {@link
org.apache.solr.cloud.ZkSolrResourceLoader#getConfigSetZkPath()}.
*
@@ -126,7 +189,8 @@ public class ManagedIndexSchemaFactory extends
IndexSchemaFactory implements Sol
} else { // ZooKeeper
final ZkSolrResourceLoader zkLoader = (ZkSolrResourceLoader)loader;
final SolrZkClient zkClient = zkLoader.getZkController().getZkClient();
- final String managedSchemaPath = zkLoader.getConfigSetZkPath() + "/" +
managedSchemaResourceName;
+ final String managedSchemaPath = lookupZKManagedSchemaPath();
+ managedSchemaResourceName =
managedSchemaPath.substring(managedSchemaPath.lastIndexOf("/")+1); // not
loving this
Stat stat = new Stat();
try {
// Attempt to load the managed schema
@@ -153,7 +217,7 @@ public class ManagedIndexSchemaFactory extends
IndexSchemaFactory implements Sol
schemaInputStream = loader.openResource(resourceName);
loadedResource = resourceName;
shouldUpgrade = true;
- } catch (Exception e) {
+ } catch (IOException e) {
try {
// Retry to load the managed schema, in case it was created since
the first attempt
byte[] data = zkClient.getData(managedSchemaPath, null, stat,
true);
@@ -195,6 +259,8 @@ public class ManagedIndexSchemaFactory extends
IndexSchemaFactory implements Sol
InputStream schemaInputStream = null;
try {
// Attempt to load the managed schema
+ final Path managedSchemaPath = lookupLocalManagedSchemaPath();
+ managedSchemaResourceName =
managedSchemaPath.getName(managedSchemaPath.getNameCount()-1).toString();
schemaInputStream = loader.openResource(managedSchemaResourceName);
loadedResource = managedSchemaResourceName;
warnIfNonManagedSchemaExists();
@@ -219,7 +285,7 @@ public class ManagedIndexSchemaFactory extends
IndexSchemaFactory implements Sol
}
/**
- * Return whether a non-managed schema exists, either in local storage or on
ZooKeeper.
+ * Return whether a non-managed schema exists, either in local storage or on
ZooKeeper.
*/
private void warnIfNonManagedSchemaExists() {
if ( ! resourceName.equals(managedSchemaResourceName)) {
@@ -232,7 +298,7 @@ public class ManagedIndexSchemaFactory extends
IndexSchemaFactory implements Sol
exists = zkLoader.getZkController().pathExists(nonManagedSchemaPath);
} catch (InterruptedException e) {
Thread.currentThread().interrupt(); // Restore the interrupted status
- log.warn("", e); // Log as warning and suppress the exception
+ log.warn("", e); // Log as warning and suppress the exception
} catch (KeeperException e) {
// log as warning and suppress the exception
log.warn("Error checking for the existence of the non-managed schema
{}", resourceName, e);
@@ -244,7 +310,10 @@ public class ManagedIndexSchemaFactory extends
IndexSchemaFactory implements Sol
if (null != nonManagedSchemaInputStream) {
exists = true;
}
- } catch (IOException e) {
+ } catch (SolrResourceNotFoundException e) {
+ // This is expected when the non-managed schema does not exist
+ } catch (IOException e) {
+ throw new RuntimeException(e);
// This is expected when the non-managed schema does not exist
} finally {
IOUtils.closeQuietly(nonManagedSchemaInputStream);
@@ -258,7 +327,7 @@ public class ManagedIndexSchemaFactory extends
IndexSchemaFactory implements Sol
}
/**
- * Persist the managed schema and rename the non-managed schema
+ * Persist the managed schema and rename the non-managed schema
* by appending {@link #UPGRADED_SCHEMA_EXTENSION}.
*
* Failure to rename the non-managed schema will be logged as a warning,
@@ -290,7 +359,7 @@ public class ManagedIndexSchemaFactory extends
IndexSchemaFactory implements Sol
} else {
File upgradedSchemaFile = new File(nonManagedSchemaFile +
UPGRADED_SCHEMA_EXTENSION);
if (nonManagedSchemaFile.renameTo(upgradedSchemaFile)) {
- // Set the resource name to the managed schema so that the
CoreAdminHandler returns a findable filename
+ // Set the resource name to the managed schema so that the
CoreAdminHandler returns a findable filename
schema.setResourceName(managedSchemaResourceName);
log.info("After upgrading to managed schema, renamed the
non-managed schema {} to {}"
@@ -320,7 +389,7 @@ public class ManagedIndexSchemaFactory extends
IndexSchemaFactory implements Sol
}
/**
- * Persist the managed schema to ZooKeeper and rename the non-managed schema
+ * Persist the managed schema to ZooKeeper and rename the non-managed schema
* by appending {@link #UPGRADED_SCHEMA_EXTENSION}.
*
* Failure to rename the non-managed schema will be logged as a warning,
@@ -434,7 +503,7 @@ public class ManagedIndexSchemaFactory extends
IndexSchemaFactory implements Sol
this.schema = schema;
core.setLatestSchema(schema);
}
-
+
public boolean isMutable() {
return isMutable;
}
diff --git a/solr/core/src/java/org/apache/solr/schema/SchemaManager.java
b/solr/core/src/java/org/apache/solr/schema/SchemaManager.java
index cc9e150..03bdde2 100644
--- a/solr/core/src/java/org/apache/solr/schema/SchemaManager.java
+++ b/solr/core/src/java/org/apache/solr/schema/SchemaManager.java
@@ -427,31 +427,33 @@ public class SchemaManager {
KeeperException, InterruptedException {
SolrResourceLoader resourceLoader = core.getResourceLoader();
- String name = core.getLatestSchema().getResourceName();
+ String schemaResourceName = core.getLatestSchema().getResourceName();
if (resourceLoader instanceof ZkSolrResourceLoader) {
final ZkSolrResourceLoader zkLoader =
(ZkSolrResourceLoader)resourceLoader;
SolrZkClient zkClient = zkLoader.getZkController().getZkClient();
+ String managedSchemaPath = zkLoader.getConfigSetZkPath() + "/" +
schemaResourceName;
try {
- if (!zkClient.exists(zkLoader.getConfigSetZkPath() + "/" + name,
true)) {
- String backupName = name +
ManagedIndexSchemaFactory.UPGRADED_SCHEMA_EXTENSION;
+ if (!zkClient.exists(managedSchemaPath, true)) {
+ String backupName = schemaResourceName +
ManagedIndexSchemaFactory.UPGRADED_SCHEMA_EXTENSION;
if (!zkClient.exists(zkLoader.getConfigSetZkPath() + "/" +
backupName, true)) {
- log.warn("Unable to retrieve fresh managed schema, neither {} nor
{} exist.", name, backupName);
+ log.warn("Unable to retrieve fresh managed schema, neither {} nor
{} exist.", schemaResourceName, backupName);
// use current schema
return (ManagedIndexSchema) core.getLatestSchema();
} else {
- name = backupName;
+ schemaResourceName = backupName;
}
}
} catch (Exception e) {
- log.warn("Unable to retrieve fresh managed schema {}", name, e);
+ log.warn("Unable to retrieve fresh managed schema {}",
schemaResourceName, e);
// use current schema
return (ManagedIndexSchema) core.getLatestSchema();
}
- InputStream in = resourceLoader.openResource(name);
+ schemaResourceName =
managedSchemaPath.substring(managedSchemaPath.lastIndexOf("/")+1);
+ InputStream in = resourceLoader.openResource(schemaResourceName);
if (in instanceof ZkSolrResourceLoader.ZkByteArrayInputStream) {
int version = ((ZkSolrResourceLoader.ZkByteArrayInputStream)
in).getStat().getVersion();
log.info("managed schema loaded . version : {} ", version);
- return new ManagedIndexSchema(core.getSolrConfig(), name, () ->
IndexSchemaFactory.getParsedSchema(in, zkLoader,
core.getLatestSchema().getResourceName()), true, name, version,
+ return new ManagedIndexSchema(core.getSolrConfig(),
schemaResourceName, () -> IndexSchemaFactory.getParsedSchema(in, zkLoader,
core.getLatestSchema().getResourceName()), true, schemaResourceName, version,
core.getLatestSchema().getSchemaUpdateLock());
} else {
return (ManagedIndexSchema) core.getLatestSchema();
diff --git a/solr/core/src/java/org/apache/solr/schema/ZkIndexSchemaReader.java
b/solr/core/src/java/org/apache/solr/schema/ZkIndexSchemaReader.java
index e20a62c..3a4ba52 100644
--- a/solr/core/src/java/org/apache/solr/schema/ZkIndexSchemaReader.java
+++ b/solr/core/src/java/org/apache/solr/schema/ZkIndexSchemaReader.java
@@ -48,8 +48,8 @@ public class ZkIndexSchemaReader implements OnReconnect {
this.managedIndexSchemaFactory = managedIndexSchemaFactory;
zkLoader =
(ZkSolrResourceLoader)managedIndexSchemaFactory.getResourceLoader();
this.zkClient = zkLoader.getZkController().getZkClient();
- this.managedSchemaPath = zkLoader.getConfigSetZkPath() + "/" +
managedIndexSchemaFactory.getManagedSchemaResourceName();
- this.uniqueCoreId = solrCore.getName()+":"+solrCore.getStartNanoTime();
+ this.managedSchemaPath =
managedIndexSchemaFactory.lookupZKManagedSchemaPath();
+ this.uniqueCoreId = solrCore.getName() + ":" + solrCore.getStartNanoTime();
// register a CloseHook for the core this reader is linked to, so that we
can de-register the listener
solrCore.addCloseHook(new CloseHook() {
@@ -172,10 +172,10 @@ public class ZkIndexSchemaReader implements OnReconnect {
}
long start = System.nanoTime();
String resourceName =
managedIndexSchemaFactory.getManagedSchemaResourceName();
- ManagedIndexSchema newSchema = new ManagedIndexSchema
- (managedIndexSchemaFactory.getConfig(), resourceName,
- () -> IndexSchemaFactory.getParsedSchema(new
ByteArrayInputStream(data),zkLoader , resourceName),
managedIndexSchemaFactory.isMutable(),
- resourceName, stat.getVersion(),
oldSchema.getSchemaUpdateLock());
+ ManagedIndexSchema newSchema = new
ManagedIndexSchema(managedIndexSchemaFactory.getConfig(), resourceName,
+ () -> IndexSchemaFactory.getParsedSchema(new
ByteArrayInputStream(data), zkLoader, resourceName),
+ managedIndexSchemaFactory.isMutable(),
+ resourceName, stat.getVersion(), oldSchema.getSchemaUpdateLock());
managedIndexSchemaFactory.setSchema(newSchema);
long stop = System.nanoTime();
log.info("Finished refreshing schema in {} ms",
TimeUnit.MILLISECONDS.convert(stop - start, TimeUnit.NANOSECONDS));
@@ -198,7 +198,7 @@ public class ZkIndexSchemaReader implements OnReconnect {
// force update now as the schema may have changed while our zk session
was expired
updateSchema(null, -1);
} catch (Exception exc) {
- log.error("Failed to update managed-schema watcher after session
expiration due to: {}", exc);
+ log.error("Failed to update managed schema watcher after session
expiration due to: {}", exc);
}
}
diff --git
a/solr/core/src/test-files/solr/collection1/conf/solrconfig-managed-schema.xml
b/solr/core/src/test-files/solr/collection1/conf/solrconfig-managed-schema.xml
index 46158cd..e00b0c1 100644
---
a/solr/core/src/test-files/solr/collection1/conf/solrconfig-managed-schema.xml
+++
b/solr/core/src/test-files/solr/collection1/conf/solrconfig-managed-schema.xml
@@ -24,7 +24,7 @@
<schemaFactory class="ManagedIndexSchemaFactory">
<bool name="mutable">${managed.schema.mutable}</bool>
- <str
name="managedSchemaResourceName">${managed.schema.resourceName:managed-schema}</str>
+ <str
name="managedSchemaResourceName">${managed.schema.resourceName:managed-schema.xml}</str>
</schemaFactory>
<codecFactory class="solr.SchemaCodecFactory"/>
diff --git
a/solr/core/src/test-files/solr/configsets/upload/with-script-processor/managed-schema
b/solr/core/src/test-files/solr/configsets/upload/legacy-managed-schema/managed-schema
similarity index 100%
copy from
solr/core/src/test-files/solr/configsets/upload/with-script-processor/managed-schema
copy to
solr/core/src/test-files/solr/configsets/upload/legacy-managed-schema/managed-schema
diff --git
a/solr/core/src/test-files/solr/configsets/upload/legacy-managed-schema/solrconfig.xml
b/solr/core/src/test-files/solr/configsets/upload/legacy-managed-schema/solrconfig.xml
new file mode 100644
index 0000000..827b5bd
--- /dev/null
+++
b/solr/core/src/test-files/solr/configsets/upload/legacy-managed-schema/solrconfig.xml
@@ -0,0 +1,60 @@
+<?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.
+-->
+
+<!-- This is a "kitchen sink" config file that tests can use.
+ When writting a new test, feel free to add *new* items (plugins,
+ config options, etc...) as long as they don't break any existing
+ tests. if you need to test something esoteric please add a new
+ "solrconfig-your-esoteric-purpose.xml" config file.
+
+ Note in particular that this test is used by MinimalSchemaTest so
+ Anything added to this file needs to work correctly even if there
+ is now uniqueKey or defaultSearch Field.
+ -->
+
+<config>
+
+ <dataDir>${solr.data.dir:}</dataDir>
+
+ <directoryFactory name="DirectoryFactory"
+
class="${solr.directoryFactory:solr.NRTCachingDirectoryFactory}"/>
+
+ <luceneMatchVersion>${tests.luceneMatchVersion:LATEST}</luceneMatchVersion>
+
+ <updateHandler class="solr.DirectUpdateHandler2">
+ <commitWithin>
+ <softCommit>${solr.commitwithin.softcommit:true}</softCommit>
+ </commitWithin>
+
+ </updateHandler>
+ <requestHandler name="/select" class="solr.SearchHandler">
+ <lst name="defaults">
+ <str name="echoParams">explicit</str>
+ <str name="indent">true</str>
+ <str name="df">text</str>
+ </lst>
+
+ </requestHandler>
+
+ <requestHandler name="/update/xslt"
+ startup="lazy"
+ class="solr.XsltUpdateRequestHandler"/>
+
+ <requestHandler name="/update" class="solr.UpdateRequestHandler" />
+</config>
diff --git
a/solr/core/src/test-files/solr/configsets/upload/with-lib-directive/managed-schema
b/solr/core/src/test-files/solr/configsets/upload/regular/managed-schema.xml
similarity index 100%
rename from
solr/core/src/test-files/solr/configsets/upload/with-lib-directive/managed-schema
rename to
solr/core/src/test-files/solr/configsets/upload/regular/managed-schema.xml
diff --git
a/solr/core/src/test-files/solr/configsets/upload/regular/managed-schema
b/solr/core/src/test-files/solr/configsets/upload/with-lib-directive/managed-schema.xml
similarity index 100%
rename from
solr/core/src/test-files/solr/configsets/upload/regular/managed-schema
rename to
solr/core/src/test-files/solr/configsets/upload/with-lib-directive/managed-schema.xml
diff --git
a/solr/core/src/test-files/solr/configsets/upload/with-script-processor/managed-schema
b/solr/core/src/test-files/solr/configsets/upload/with-script-processor/managed-schema.xml
similarity index 100%
rename from
solr/core/src/test-files/solr/configsets/upload/with-script-processor/managed-schema
rename to
solr/core/src/test-files/solr/configsets/upload/with-script-processor/managed-schema.xml
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestConfigSetsAPI.java
b/solr/core/src/test/org/apache/solr/cloud/TestConfigSetsAPI.java
index d555080..532b2fd 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestConfigSetsAPI.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestConfigSetsAPI.java
@@ -32,6 +32,7 @@ import java.io.OutputStream;
import java.lang.invoke.MethodHandles;
import java.net.URI;
import java.nio.ByteBuffer;
+import java.nio.charset.Charset;
import java.security.Principal;
import java.util.Arrays;
import java.util.Collection;
@@ -403,6 +404,42 @@ public class TestConfigSetsAPI extends SolrCloudTestCase {
}
}
+ public void testUploadLegacyManagedSchemaFile() throws Exception {
+ String configSetName = "legacy-managed-schema";
+ SolrZkClient zkClient = new
SolrZkClient(cluster.getZkServer().getZkAddress(),
+ AbstractZkTestCase.TIMEOUT, 45000, null);
+ try {
+ long statusCode = uploadConfigSet(configSetName, "", null, zkClient,
true);
+ assertEquals(0l, statusCode);
+
+ assertTrue("managed-schema file should have been uploaded",
+ zkClient.exists("/configs/"+configSetName+"/managed-schema",
true));
+ } finally {
+ zkClient.close();
+ }
+
+ // try to create a collection with the uploaded configset
+ createCollection("newcollection", configSetName, 1, 1,
cluster.getSolrClient());
+
+ String payload = "{\n" +
+ " 'add-field' : {\n" +
+ " 'name':'a1',\n" +
+ " 'type': 'string',\n" +
+ " 'stored':true,\n" +
+ " 'indexed':false\n" +
+ " },\n" +
+ " }";
+
+ ByteBuffer buff = Charset.forName("UTF-8").encode(payload);
+ Map<?, ?> map = postDataAndGetResponse(cluster.getSolrClient(),
+ cluster.getJettySolrRunners().get(0).getBaseUrl().toString()
+ + "/newcollection/schema?wt=js" +
+ "on", buff, null, false);
+ Map<?, ?> responseHeader = (Map<?, ?>)map.get("responseHeader");
+ Long status = (Long)responseHeader.get("status");
+ assertEquals((long)status, 0L);
+ }
+
@Test
public void testOverwriteV1() throws Exception {
testOverwrite(false);
@@ -829,7 +866,7 @@ public class TestConfigSetsAPI extends SolrCloudTestCase {
// try to create a collection with the uploaded configset
CollectionAdminResponse resp = createCollection("newcollection3",
"with-lib-directive" + trustedSuffix,
1, 1, cluster.getSolrClient());
-
+
SolrInputDocument doc = sdoc("id", "4055", "subject", "Solr");
cluster.getSolrClient().add("newcollection3", doc);
cluster.getSolrClient().commit("newcollection3");
@@ -858,11 +895,11 @@ public class TestConfigSetsAPI extends SolrCloudTestCase {
}
}
private void assertConfigsetFiles(String configSetName, String suffix,
SolrZkClient zkClient) throws KeeperException, InterruptedException,
IOException {
- assertTrue("managed-schema file should have been uploaded",
- zkClient.exists("/configs/"+configSetName+suffix+"/managed-schema",
true));
- assertTrue("managed-schema file contents on zookeeper are not exactly same
as that of the file uploaded in config",
-
Arrays.equals(zkClient.getData("/configs/"+configSetName+suffix+"/managed-schema",
null, null, true),
-
readFile("solr/configsets/upload/"+configSetName+"/managed-schema")));
+ assertTrue("managed-schema.xml file should have been uploaded",
+
zkClient.exists("/configs/"+configSetName+suffix+"/managed-schema.xml", true));
+ assertTrue("managed-schema.xml file contents on zookeeper are not exactly
same as that of the file uploaded in config",
+
Arrays.equals(zkClient.getData("/configs/"+configSetName+suffix+"/managed-schema.xml",
null, null, true),
+
readFile("solr/configsets/upload/"+configSetName+"/managed-schema.xml")));
assertTrue("solrconfig.xml file should have been uploaded",
zkClient.exists("/configs/"+configSetName+suffix+"/solrconfig.xml",
true));
@@ -1001,7 +1038,7 @@ public class TestConfigSetsAPI extends SolrCloudTestCase {
zout.close();
}
}
-
+
public void scriptRequest(String collection) throws SolrServerException,
IOException {
SolrClient client = cluster.getSolrClient();
SolrInputDocument doc = sdoc("id", "4055", "subject", "Solr");
@@ -1026,21 +1063,21 @@ public class TestConfigSetsAPI extends
SolrCloudTestCase {
res.setResponse(client.request(request));
return res;
}
-
+
public static Map<?, ?> postDataAndGetResponse(CloudSolrClient cloudClient,
String uri, ByteBuffer bytarr, String username, boolean usePut) throws
IOException {
HttpEntityEnclosingRequestBase httpRequest = null;
HttpEntity entity;
String response = null;
Map<?, ?> m = null;
-
+
try {
if (usePut) {
httpRequest = new HttpPut(uri);
} else {
httpRequest = new HttpPost(uri);
}
-
+
if (username != null) {
httpRequest.addHeader(new BasicHeader("user", username));
}
@@ -1093,7 +1130,7 @@ public class TestConfigSetsAPI extends SolrCloudTestCase {
}
return buf;
}
-
+
@Test
public void testDeleteErrors() throws Exception {
final String baseUrl =
cluster.getJettySolrRunners().get(0).getBaseUrl().toString();
@@ -1188,15 +1225,15 @@ public class TestConfigSetsAPI extends
SolrCloudTestCase {
}
/**
- * A simple sanity check that the test-framework hueristic logic for setting
- * {@link ExternalPaths#DEFAULT_CONFIGSET} is working as it should
+ * A simple sanity check that the test-framework hueristic logic for setting
+ * {@link ExternalPaths#DEFAULT_CONFIGSET} is working as it should
* in the current test env, and finding the real directory which matches
what {@link ZkController}
* finds and uses to bootstrap ZK in cloud based tests.
*
* <p>
- * This assumes the {@link
SolrDispatchFilter#SOLR_DEFAULT_CONFDIR_ATTRIBUTE} system property
- * has not been externally set in the environment where this test is being
run -- which should
- * <b>never</b> be the case, since it would prevent the test-framework from
using
+ * This assumes the {@link
SolrDispatchFilter#SOLR_DEFAULT_CONFDIR_ATTRIBUTE} system property
+ * has not been externally set in the environment where this test is being
run -- which should
+ * <b>never</b> be the case, since it would prevent the test-framework from
using
* {@link ExternalPaths#DEFAULT_CONFIGSET}
*
* @see SolrDispatchFilter#SOLR_DEFAULT_CONFDIR_ATTRIBUTE
@@ -1208,7 +1245,7 @@ public class TestConfigSetsAPI extends SolrCloudTestCase {
final File extPath = new File(ExternalPaths.DEFAULT_CONFIGSET);
assertTrue("_default dir doesn't exist: " +
ExternalPaths.DEFAULT_CONFIGSET, extPath.exists());
assertTrue("_default dir isn't a dir: " + ExternalPaths.DEFAULT_CONFIGSET,
extPath.isDirectory());
-
+
final String zkBootStrap = ConfigSetService.getDefaultConfigDirPath();
assertEquals("extPath _default configset dir vs zk bootstrap path",
ExternalPaths.DEFAULT_CONFIGSET, zkBootStrap);
diff --git
a/solr/core/src/test/org/apache/solr/schema/SpatialRPTFieldTypeTest.java
b/solr/core/src/test/org/apache/solr/schema/SpatialRPTFieldTypeTest.java
index 8eade38..02e6d20 100644
--- a/solr/core/src/test/org/apache/solr/schema/SpatialRPTFieldTypeTest.java
+++ b/solr/core/src/test/org/apache/solr/schema/SpatialRPTFieldTypeTest.java
@@ -28,13 +28,13 @@ import org.junit.Before;
import org.locationtech.spatial4j.shape.Shape;
public class SpatialRPTFieldTypeTest extends AbstractBadConfigTestBase {
-
+
private static File tmpSolrHome;
private static File tmpConfDir;
-
+
private static final String collection = "collection1";
private static final String confDir = collection + "/conf";
-
+
@Before
private void initManagedSchemaCore() throws Exception {
tmpSolrHome = createTempDir().toFile();
@@ -48,14 +48,14 @@ public class SpatialRPTFieldTypeTest extends
AbstractBadConfigTestBase {
FileUtils.copyFileToDirectory(new File(testHomeConfDir,
"schema-minimal.xml"), tmpConfDir);
FileUtils.copyFileToDirectory(new File(testHomeConfDir,
"schema_codec.xml"), tmpConfDir);
FileUtils.copyFileToDirectory(new File(testHomeConfDir,
"schema-bm25.xml"), tmpConfDir);
-
+
// initCore will trigger an upgrade to managed schema, since the
solrconfig has
// <schemaFactory class="ManagedIndexSchemaFactory" ... />
System.setProperty("managed.schema.mutable", "false");
System.setProperty("enable.update.log", "false");
initCore("solrconfig-managed-schema.xml", "schema-minimal.xml",
tmpSolrHome.getPath());
}
-
+
@After
private void afterClass() throws Exception {
deleteCore();
@@ -68,47 +68,47 @@ public class SpatialRPTFieldTypeTest extends
AbstractBadConfigTestBase {
static final String DISTANCE_DEGREES = "1.3520328";
static final String DISTANCE_KILOMETERS = "150.33939";
static final String DISTANCE_MILES = "93.416565";
-
+
public void testDistanceUnitsDegrees() throws Exception {
setupRPTField("degrees", "true");
-
+
assertU(adoc("str", "X", "geo", INDEXED_COORDINATES));
assertU(commit());
String q;
-
+
q = "geo:{!geofilt score=distance filter=false sfield=geo
pt="+QUERY_COORDINATES+" d=180}";
assertQ(req("q", q, "fl", "*,score"),
"//result/doc/float[@name='score'][.='"+DISTANCE_DEGREES+"']");
-
+
q = "geo:{!geofilt score=degrees filter=false sfield=geo
pt="+QUERY_COORDINATES+" d=180}";
assertQ(req("q", q, "fl", "*,score"),
"//result/doc/float[@name='score'][.='"+DISTANCE_DEGREES+"']");
-
+
q = "geo:{!geofilt score=kilometers filter=false sfield=geo
pt="+QUERY_COORDINATES+" d=180}";
assertQ(req("q", q, "fl", "*,score"),
"//result/doc/float[@name='score'][.='"+DISTANCE_KILOMETERS+"']");
-
+
q = "geo:{!geofilt score=miles filter=false sfield=geo
pt="+QUERY_COORDINATES+" d=180}";
assertQ(req("q", q, "fl", "*,score"),
"//result/doc/float[@name='score'][.='"+DISTANCE_MILES+"']");
}
-
+
public void testDistanceUnitsKilometers() throws Exception {
setupRPTField("kilometers", "true");
-
+
assertU(adoc("str", "X", "geo", INDEXED_COORDINATES));
assertU(commit());
String q;
-
+
q = "geo:{!geofilt score=distance filter=false sfield=geo
pt="+QUERY_COORDINATES+" d=1000}";
assertQ(req("q", q, "fl", "*,score"),
"//result/doc/float[@name='score'][.='"+DISTANCE_KILOMETERS+"']");
-
+
q = "geo:{!geofilt score=degrees filter=false sfield=geo
pt="+QUERY_COORDINATES+" d=1000}";
assertQ(req("q", q, "fl", "*,score"),
"//result/doc/float[@name='score'][.='"+DISTANCE_DEGREES+"']");
-
+
q = "geo:{!geofilt score=kilometers filter=false sfield=geo
pt="+QUERY_COORDINATES+" d=1000}";
assertQ(req("q", q, "fl", "*,score"),
"//result/doc/float[@name='score'][.='"+DISTANCE_KILOMETERS+"']");
-
+
q = "geo:{!geofilt score=miles filter=false sfield=geo
pt="+QUERY_COORDINATES+" d=1000}";
assertQ(req("q", q, "fl", "*,score"),
"//result/doc/float[@name='score'][.='"+DISTANCE_MILES+"']");
}
-
+
public void testJunkValuesForDistanceUnits() throws Exception {
Exception ex = expectThrows(Exception.class, () -> setupRPTField("rose",
"true"));
assertTrue(ex.getMessage().startsWith("Must specify distanceUnits as one
of"));
@@ -116,17 +116,17 @@ public class SpatialRPTFieldTypeTest extends
AbstractBadConfigTestBase {
public void testMaxDistErrConversion() throws Exception {
deleteCore();
- File managedSchemaFile = new File(tmpConfDir, "managed-schema");
- Files.delete(managedSchemaFile.toPath()); // Delete managed-schema so it
won't block parsing a new schema
+ File managedSchemaFile = new File(tmpConfDir, "managed-schema.xml");
+ Files.delete(managedSchemaFile.toPath()); // Delete managed-schema.xml so
it won't block parsing a new schema
System.setProperty("managed.schema.mutable", "true");
initCore("solrconfig-managed-schema.xml",
"schema-one-field-no-dynamic-field.xml", tmpSolrHome.getPath());
-
+
String fieldName = "new_text_field";
assertNull("Field '" + fieldName + "' is present in the schema",
h.getCore().getLatestSchema().getFieldOrNull(fieldName));
-
+
IndexSchema oldSchema = h.getCore().getLatestSchema();
-
+
SpatialRecursivePrefixTreeFieldType rptFieldType = new
SpatialRecursivePrefixTreeFieldType();
Map<String, String> rptMap = new HashMap<String,String>();
@@ -232,15 +232,15 @@ public class SpatialRPTFieldTypeTest extends
AbstractBadConfigTestBase {
private void setupRPTField(String distanceUnits, String geo, String format,
FieldType fieldType) throws Exception {
deleteCore();
- File managedSchemaFile = new File(tmpConfDir, "managed-schema");
- Files.delete(managedSchemaFile.toPath()); // Delete managed-schema so it
won't block parsing a new schema
+ File managedSchemaFile = new File(tmpConfDir, "managed-schema.xml");
+ Files.delete(managedSchemaFile.toPath()); // Delete managed-schema.xml so
it won't block parsing a new schema
System.setProperty("managed.schema.mutable", "true");
initCore("solrconfig-managed-schema.xml",
"schema-one-field-no-dynamic-field.xml", tmpSolrHome.getPath());
String fieldName = "new_text_field";
assertNull("Field '" + fieldName + "' is present in the schema",
h.getCore().getLatestSchema().getFieldOrNull(fieldName));
-
+
IndexSchema oldSchema = h.getCore().getLatestSchema();
if (fieldType == null) {
diff --git
a/solr/core/src/test/org/apache/solr/schema/TestCloudManagedSchema.java
b/solr/core/src/test/org/apache/solr/schema/TestCloudManagedSchema.java
index 652063b..54c679d 100644
--- a/solr/core/src/test/org/apache/solr/schema/TestCloudManagedSchema.java
+++ b/solr/core/src/test/org/apache/solr/schema/TestCloudManagedSchema.java
@@ -65,12 +65,12 @@ public class TestCloudManagedSchema extends
AbstractFullDistribZkTestBase {
NamedList<?> collectionStatus = (NamedList<?>)status.getVal(0);
String collectionSchema =
(String)collectionStatus.get(CoreAdminParams.SCHEMA);
// Make sure the upgrade to managed schema happened
- assertEquals("Schema resource name differs from expected name",
"managed-schema", collectionSchema);
+ assertEquals("Schema resource name differs from expected name",
"managed-schema.xml", collectionSchema);
SolrZkClient zkClient = new SolrZkClient(zkServer.getZkHost(), 30000);
try {
// Make sure "DO NOT EDIT" is in the content of the managed schema
- String fileContent = getFileContentFromZooKeeper(zkClient,
"/solr/configs/conf1/managed-schema");
+ String fileContent = getFileContentFromZooKeeper(zkClient,
"/solr/configs/conf1/managed-schema.xml");
assertTrue("Managed schema is missing", fileContent.contains("DO NOT
EDIT"));
// Make sure the original non-managed schema is no longer in ZooKeeper
diff --git a/solr/core/src/test/org/apache/solr/schema/TestManagedSchema.java
b/solr/core/src/test/org/apache/solr/schema/TestManagedSchema.java
index d209f9d..42a5a79 100644
--- a/solr/core/src/test/org/apache/solr/schema/TestManagedSchema.java
+++ b/solr/core/src/test/org/apache/solr/schema/TestManagedSchema.java
@@ -48,7 +48,7 @@ public class TestManagedSchema extends
AbstractBadConfigTestBase {
private static final String collection = "collection1";
private static final String confDir = collection + "/conf";
-
+
@Before
private void initManagedSchemaCore() throws Exception {
tmpSolrHome = createTempDir().toFile();
@@ -64,6 +64,7 @@ public class TestManagedSchema extends
AbstractBadConfigTestBase {
FileUtils.copyFileToDirectory(new File(testHomeConfDir,
"schema_codec.xml"), tmpConfDir);
FileUtils.copyFileToDirectory(new File(testHomeConfDir,
"schema-bm25.xml"), tmpConfDir);
+
// initCore will trigger an upgrade to managed schema, since the
solrconfig has
// <schemaFactory class="ManagedIndexSchemaFactory" ... />
System.setProperty("managed.schema.mutable", "false");
@@ -77,30 +78,30 @@ public class TestManagedSchema extends
AbstractBadConfigTestBase {
System.clearProperty("managed.schema.mutable");
System.clearProperty("enable.update.log");
}
-
+
public void testUpgrade() throws Exception {
- File managedSchemaFile = new File(tmpConfDir, "managed-schema");
+ File managedSchemaFile = new File(tmpConfDir, "managed-schema.xml");
assertTrue(managedSchemaFile.exists());
String managedSchema = FileUtils.readFileToString(managedSchemaFile,
"UTF-8");
assertTrue(managedSchema.contains("DO NOT EDIT"));
File upgradedOriginalSchemaFile = new File(tmpConfDir,
"schema-minimal.xml.bak");
assertTrue(upgradedOriginalSchemaFile.exists());
- assertSchemaResource(collection, "managed-schema");
+ assertSchemaResource(collection, "managed-schema.xml");
}
-
+
public void testUpgradeThenRestart() throws Exception {
- assertSchemaResource(collection, "managed-schema");
+ assertSchemaResource(collection, "managed-schema.xml");
deleteCore();
File nonManagedSchemaFile = new File(tmpConfDir, "schema-minimal.xml");
assertFalse(nonManagedSchemaFile.exists());
initCore("solrconfig-managed-schema.xml", "schema-minimal.xml",
tmpSolrHome.getPath());
- File managedSchemaFile = new File(tmpConfDir, "managed-schema");
+ File managedSchemaFile = new File(tmpConfDir, "managed-schema.xml");
assertTrue(managedSchemaFile.exists());
String managedSchema = FileUtils.readFileToString(managedSchemaFile,
"UTF-8");
assertTrue(managedSchema.contains("DO NOT EDIT"));
File upgradedOriginalSchemaFile = new File(tmpConfDir,
"schema-minimal.xml.bak");
assertTrue(upgradedOriginalSchemaFile.exists());
- assertSchemaResource(collection, "managed-schema");
+ assertSchemaResource(collection, "managed-schema.xml");
}
public void testUpgradeThenRestartNonManaged() throws Exception {
@@ -112,13 +113,13 @@ public class TestManagedSchema extends
AbstractBadConfigTestBase {
}
public void
testUpgradeThenRestartNonManagedAfterPuttingBackNonManagedSchema() throws
Exception {
- assertSchemaResource(collection, "managed-schema");
+ assertSchemaResource(collection, "managed-schema.xml");
deleteCore();
File nonManagedSchemaFile = new File(tmpConfDir, "schema-minimal.xml");
assertFalse(nonManagedSchemaFile.exists());
File upgradedOriginalSchemaFile = new File(tmpConfDir,
"schema-minimal.xml.bak");
assertTrue(upgradedOriginalSchemaFile.exists());
-
+
// After upgrade to managed schema, downgrading to non-managed should work
after putting back the non-managed schema.
FileUtils.moveFile(upgradedOriginalSchemaFile, nonManagedSchemaFile);
initCore("solrconfig-basic.xml", "schema-minimal.xml",
tmpSolrHome.getPath());
@@ -135,9 +136,9 @@ public class TestManagedSchema extends
AbstractBadConfigTestBase {
SolrQueryResponse response = new SolrQueryResponse();
admin.handleRequestBody(request, response);
assertNull("Exception on create", response.getException());
- assertSchemaResource(collection, "managed-schema");
+ assertSchemaResource(collection, "managed-schema.xml");
}
-
+
private void assertSchemaResource(String collection, String
expectedSchemaResource) throws Exception {
final CoreContainer cores = h.getCoreContainer();
final CoreAdminHandler admin = new CoreAdminHandler(cores);
@@ -153,7 +154,7 @@ public class TestManagedSchema extends
AbstractBadConfigTestBase {
}
public void testAddFieldWhenNotMutable() throws Exception {
- assertSchemaResource(collection, "managed-schema");
+ assertSchemaResource(collection, "managed-schema.xml");
String errString = "This ManagedIndexSchema is not mutable.";
ignoreException(Pattern.quote(errString));
try {
@@ -177,20 +178,20 @@ public class TestManagedSchema extends
AbstractBadConfigTestBase {
resetExceptionIgnores();
}
}
-
+
public void testAddFieldPersistence() throws Exception {
- assertSchemaResource(collection, "managed-schema");
+ assertSchemaResource(collection, "managed-schema.xml");
deleteCore();
- File managedSchemaFile = new File(tmpConfDir, "managed-schema");
- Files.delete(managedSchemaFile.toPath()); // Delete managed-schema so it
won't block parsing a new schema
+ File managedSchemaFile = new File(tmpConfDir, "managed-schema.xml");
+ Files.delete(managedSchemaFile.toPath()); // Delete managed-schema.xml so
it won't block parsing a new schema
System.setProperty("managed.schema.mutable", "true");
initCore("solrconfig-managed-schema.xml",
"schema-one-field-no-dynamic-field.xml", tmpSolrHome.getPath());
-
+
assertTrue(managedSchemaFile.exists());
String managedSchemaContents =
FileUtils.readFileToString(managedSchemaFile, "UTF-8");
assertFalse(managedSchemaContents.contains("\"new_field\""));
-
+
Map<String,Object> options = new HashMap<>();
options.put("stored", "false");
IndexSchema oldSchema = h.getCore().getLatestSchema();
@@ -206,12 +207,12 @@ public class TestManagedSchema extends
AbstractBadConfigTestBase {
stream.close(); // Explicitly close so that Windows can delete this file
assertTrue(managedSchemaContents.contains("<field name=\"new_field\"
type=\"string\" stored=\"false\"/>"));
}
-
+
public void testAddedFieldIndexableAndQueryable() throws Exception {
- assertSchemaResource(collection, "managed-schema");
+ assertSchemaResource(collection, "managed-schema.xml");
deleteCore();
- File managedSchemaFile = new File(tmpConfDir, "managed-schema");
- Files.delete(managedSchemaFile.toPath()); // Delete managed-schema so it
won't block parsing a new schema
+ File managedSchemaFile = new File(tmpConfDir, "managed-schema.xml");
+ Files.delete(managedSchemaFile.toPath()); // Delete managed-schema.xml so
it won't block parsing a new schema
System.setProperty("managed.schema.mutable", "true");
initCore("solrconfig-managed-schema.xml",
"schema-one-field-no-dynamic-field.xml", tmpSolrHome.getPath());
@@ -254,16 +255,16 @@ public class TestManagedSchema extends
AbstractBadConfigTestBase {
assertQ(req("new_field:thing1"), "//*[@numFound='1']");
}
-
+
public void testAddFieldWhenItAlreadyExists() throws Exception{
deleteCore();
- File managedSchemaFile = new File(tmpConfDir, "managed-schema");
- Files.delete(managedSchemaFile.toPath()); // Delete managed-schema so it
won't block parsing a new schema
+ File managedSchemaFile = new File(tmpConfDir, "managed-schema.xml");
+ Files.delete(managedSchemaFile.toPath()); // Delete managed-schema.xml so
it won't block parsing a new schema
System.setProperty("managed.schema.mutable", "true");
initCore("solrconfig-managed-schema.xml",
"schema-one-field-no-dynamic-field.xml", tmpSolrHome.getPath());
assertNotNull("Field 'str' is not present in the schema",
h.getCore().getLatestSchema().getFieldOrNull("str"));
-
+
String errString = "Field 'str' already exists.";
ignoreException(Pattern.quote(errString));
try {
@@ -290,8 +291,8 @@ public class TestManagedSchema extends
AbstractBadConfigTestBase {
public void testAddSameFieldTwice() throws Exception{
deleteCore();
- File managedSchemaFile = new File(tmpConfDir, "managed-schema");
- Files.delete(managedSchemaFile.toPath()); // Delete managed-schema so it
won't block parsing a new schema
+ File managedSchemaFile = new File(tmpConfDir, "managed-schema.xml");
+ Files.delete(managedSchemaFile.toPath()); // Delete managed-schema.xml so
it won't block parsing a new schema
System.setProperty("managed.schema.mutable", "true");
initCore("solrconfig-managed-schema.xml",
"schema-one-field-no-dynamic-field.xml", tmpSolrHome.getPath());
@@ -325,8 +326,8 @@ public class TestManagedSchema extends
AbstractBadConfigTestBase {
public void testAddDynamicField() throws Exception{
deleteCore();
- File managedSchemaFile = new File(tmpConfDir, "managed-schema");
- Files.delete(managedSchemaFile.toPath()); // Delete managed-schema so it
won't block parsing a new schema
+ File managedSchemaFile = new File(tmpConfDir, "managed-schema.xml");
+ Files.delete(managedSchemaFile.toPath()); // Delete managed-schema.xml so
it won't block parsing a new schema
System.setProperty("managed.schema.mutable", "true");
initCore("solrconfig-managed-schema.xml",
"schema-one-field-no-dynamic-field.xml", tmpSolrHome.getPath());
@@ -355,20 +356,20 @@ public class TestManagedSchema extends
AbstractBadConfigTestBase {
resetExceptionIgnores();
}
}
-
+
public void testAddWithSchemaCodecFactory() throws Exception {
deleteCore();
- File managedSchemaFile = new File(tmpConfDir, "managed-schema");
- Files.delete(managedSchemaFile.toPath()); // Delete managed-schema so it
won't block parsing a new schema
+ File managedSchemaFile = new File(tmpConfDir, "managed-schema.xml");
+ Files.delete(managedSchemaFile.toPath()); // Delete managed-schema.xml so
it won't block parsing a new schema
System.setProperty("managed.schema.mutable", "true");
initCore("solrconfig-managed-schema.xml", "schema_codec.xml",
tmpSolrHome.getPath());
String uniqueKey = "string_f";
- assertNotNull("Unique key field '" + uniqueKey + "' is not present in the
schema",
+ assertNotNull("Unique key field '" + uniqueKey + "' is not present in the
schema",
h.getCore().getLatestSchema().getFieldOrNull(uniqueKey));
String fieldName = "string_disk_new_field";
- assertNull("Field '" + fieldName + "' is present in the schema",
+ assertNull("Field '" + fieldName + "' is present in the schema",
h.getCore().getLatestSchema().getFieldOrNull(fieldName));
Map<String,Object> options = new HashMap<>();
@@ -386,8 +387,8 @@ public class TestManagedSchema extends
AbstractBadConfigTestBase {
public void testAddWithSchemaSimilarityFactory() throws Exception {
deleteCore();
- File managedSchemaFile = new File(tmpConfDir, "managed-schema");
- Files.delete(managedSchemaFile.toPath()); // Delete managed-schema so it
won't block parsing a new schema
+ File managedSchemaFile = new File(tmpConfDir, "managed-schema.xml");
+ Files.delete(managedSchemaFile.toPath()); // Delete managed-schema.xml so
it won't block parsing a new schema
System.setProperty("managed.schema.mutable", "true");
initCore("solrconfig-managed-schema.xml", "schema-bm25.xml",
tmpSolrHome.getPath());
@@ -413,10 +414,10 @@ public class TestManagedSchema extends
AbstractBadConfigTestBase {
}
public void testPersistUniqueKey() throws Exception {
- assertSchemaResource(collection, "managed-schema");
+ assertSchemaResource(collection, "managed-schema.xml");
deleteCore();
- File managedSchemaFile = new File(tmpConfDir, "managed-schema");
- Files.delete(managedSchemaFile.toPath()); // Delete managed-schema so it
won't block parsing a new schema
+ File managedSchemaFile = new File(tmpConfDir, "managed-schema.xml");
+ Files.delete(managedSchemaFile.toPath()); // Delete managed-schema.xml so
it won't block parsing a new schema
System.setProperty("managed.schema.mutable", "true");
initCore("solrconfig-managed-schema.xml",
"schema-one-field-no-dynamic-field-unique-key.xml", tmpSolrHome.getPath());
@@ -451,8 +452,8 @@ public class TestManagedSchema extends
AbstractBadConfigTestBase {
public void testAddFieldThenReload() throws Exception {
deleteCore();
- File managedSchemaFile = new File(tmpConfDir, "managed-schema");
- Files.delete(managedSchemaFile.toPath()); // Delete managed-schema so it
won't block parsing a new schema
+ File managedSchemaFile = new File(tmpConfDir, "managed-schema.xml");
+ Files.delete(managedSchemaFile.toPath()); // Delete managed-schema.xml so
it won't block parsing a new schema
System.setProperty("managed.schema.mutable", "true");
initCore("solrconfig-managed-schema.xml",
"schema-one-field-no-dynamic-field.xml", tmpSolrHome.getPath());
diff --git a/solr/server/solr/configsets/_default/conf/managed-schema
b/solr/server/solr/configsets/_default/conf/managed-schema.xml
similarity index 97%
rename from solr/server/solr/configsets/_default/conf/managed-schema
rename to solr/server/solr/configsets/_default/conf/managed-schema.xml
index 7d46d78..5be18eb 100644
--- a/solr/server/solr/configsets/_default/conf/managed-schema
+++ b/solr/server/solr/configsets/_default/conf/managed-schema.xml
@@ -40,34 +40,34 @@
<schema name="default-config" version="1.6">
<!-- attribute "name" is the name of this schema and is only used for
display purposes.
- version="x.y" is Solr's version number for the schema syntax and
+ version="x.y" is Solr's version number for the schema syntax and
semantics. It should not normally be changed by applications.
- 1.0: multiValued attribute did not exist, all fields are multiValued
+ 1.0: multiValued attribute did not exist, all fields are multiValued
by nature
- 1.1: multiValued attribute introduced, false by default
- 1.2: omitTermFreqAndPositions attribute introduced, true by default
+ 1.1: multiValued attribute introduced, false by default
+ 1.2: omitTermFreqAndPositions attribute introduced, true by default
except for text fields.
1.3: removed optional field compress feature
1.4: autoGeneratePhraseQueries attribute introduced to drive QueryParser
- behavior when a single string produces multiple tokens. Defaults
+ behavior when a single string produces multiple tokens. Defaults
to off for version >= 1.4
- 1.5: omitNorms defaults to true for primitive field types
+ 1.5: omitNorms defaults to true for primitive field types
(int, float, boolean, string...)
1.6: useDocValuesAsStored defaults to true.
-->
<!-- Valid attributes for fields:
name: mandatory - the name for the field
- type: mandatory - the name of a field type from the
+ 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 is
recommended (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 are currently only supported by StrField, UUIDField, all
+ faster to load, more NRT-friendly and more memory-efficient.
+ They are currently only supported by StrField, UUIDField, all
*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
@@ -82,9 +82,9 @@
given field.
When using MoreLikeThis, fields used for similarity should be
stored for best performance.
- termPositions: Store position information with the term vector.
+ termPositions: Store position information with the term vector.
This will increase storage costs.
- termOffsets: Store offset information with the term vector. This
+ 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
@@ -102,10 +102,10 @@
<!-- In this _default configset, only four fields are pre-declared:
id, _version_, and _text_ and _root_. All other fields will be type
guessed and added via the
"add-unknown-fields-to-the-schema" update request processor chain
declared in solrconfig.xml.
-
- Note that many dynamic fields are also defined - you can use them to
specify a
+
+ Note that many dynamic fields are also defined - you can use them to
specify a
field's type via field naming conventions - see below.
-
+
WARNING: The _text_ catch-all field will significantly increase your
index size.
If you don't need it, consider removing it and the corresponding
copyField directive.
-->
@@ -130,7 +130,7 @@
for fields via the specification of patterns to match field names.
EXAMPLE: name="*_i" will match any field ending in _i (like myid_i,
z_i)
RESTRICTION: the glob-like pattern in the name attribute must have a
"*" only at the start or the end. -->
-
+
<dynamicField name="*_i" type="pint" indexed="true" stored="true"/>
<dynamicField name="*_is" type="pints" indexed="true" stored="true"/>
<dynamicField name="*_s" type="string" indexed="true" stored="true" />
@@ -227,7 +227,7 @@
<!-- 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
+ 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.
@@ -242,20 +242,20 @@
NOW/DAY+6MONTHS+3DAYS
... 6 months and 3 days in the future from the start of
the current day
-
+
-->
<!-- KD-tree versions of date fields -->
<fieldType name="pdate" class="solr.DatePointField" docValues="true"/>
<fieldType name="pdates" class="solr.DatePointField" docValues="true"
multiValued="true"/>
-
+
<!--Binary data type. The data should be sent/retrieved in as Base64
encoded Strings -->
<fieldType name="binary" class="solr.BinaryField"/>
-
- <!--
+
+ <!--
RankFields can be used to store scoring factors to improve document
ranking. They should be used
in combination with RankQParserPlugin.
(experimental)
- -->
+ -->
<fieldType name="rank" class="solr.RankField"/>
<!-- solr.TextField allows the specification of custom text analyzers
@@ -288,10 +288,10 @@
<!-- 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.
- -->
+ 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_general" class="solr.TextField"
positionIncrementGap="100" multiValued="true">
<analyzer type="index">
<tokenizer name="standard"/>
@@ -310,15 +310,15 @@
</analyzer>
</fieldType>
-
+
<!-- SortableTextField generaly functions exactly like TextField,
except that it supports, and by default uses, docValues for sorting
(or faceting)
on the first 1024 characters of the original field values (which is
configurable).
-
+
This makes it a bit more useful then TextField in many situations,
but the trade-off
is that it takes up more space on disk; which is why it's not used in
place of TextField
for every fieldType in this _default schema.
- -->
+ -->
<dynamicField name="*_t_sort" type="text_gen_sort" indexed="true"
stored="true" multiValued="false"/>
<dynamicField name="*_txt_sort" type="text_gen_sort" indexed="true"
stored="true"/>
<fieldType name="text_gen_sort" class="solr.SortableTextField"
positionIncrementGap="100" multiValued="true">
@@ -357,7 +357,7 @@
<filter name="keywordMarker" protected="protwords.txt"/>
<!-- Optionally you may want to use this less aggressive stemmer
instead of PorterStemFilterFactory:
<filter name="englishMinimalStem"/>
- -->
+ -->
<filter name="porterStem"/>
</analyzer>
<analyzer type="query">
@@ -372,7 +372,7 @@
<filter name="keywordMarker" protected="protwords.txt"/>
<!-- Optionally you may want to use this less aggressive stemmer
instead of PorterStemFilterFactory:
<filter name="englishMinimalStem"/>
- -->
+ -->
<filter name="porterStem"/>
</analyzer>
</fieldType>
@@ -451,7 +451,7 @@
</fieldType>
<!-- Just like text_general except it reverses the characters of
- each token, to enable more efficient leading wildcard queries.
+ each token, to enable more efficient leading wildcard queries.
-->
<dynamicField name="*_txt_rev" type="text_general_rev" indexed="true"
stored="true"/>
<fieldType name="text_general_rev" class="solr.TextField"
positionIncrementGap="100">
@@ -487,7 +487,7 @@
</analyzer>
</fieldType>
- <!--
+ <!--
Example of using PathHierarchyTokenizerFactory at index time, so
queries for paths match documents at that path, or in descendent paths
-->
@@ -517,7 +517,7 @@
<!-- 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
+ 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.
@@ -564,7 +564,7 @@
<!-- Arabic -->
<dynamicField name="*_txt_ar" type="text_ar" indexed="true"
stored="true"/>
<fieldType name="text_ar" class="solr.TextField"
positionIncrementGap="100">
- <analyzer>
+ <analyzer>
<tokenizer name="standard"/>
<!-- for any non-arabic -->
<filter name="lowercase"/>
@@ -578,18 +578,18 @@
<!-- Bulgarian -->
<dynamicField name="*_txt_bg" type="text_bg" indexed="true"
stored="true"/>
<fieldType name="text_bg" class="solr.TextField"
positionIncrementGap="100">
- <analyzer>
+ <analyzer>
<tokenizer name="standard"/>
<filter name="lowercase"/>
<filter name="stop" ignoreCase="true" words="lang/stopwords_bg.txt" />
<filter name="bulgarianStem"/>
</analyzer>
</fieldType>
-
+
<!-- Catalan -->
<dynamicField name="*_txt_ca" type="text_ca" indexed="true"
stored="true"/>
<fieldType name="text_ca" class="solr.TextField"
positionIncrementGap="100">
- <analyzer>
+ <analyzer>
<tokenizer name="standard"/>
<!-- removes l', etc -->
<filter name="elision" ignoreCase="true"
articles="lang/contractions_ca.txt"/>
@@ -598,7 +598,7 @@
<filter name="snowballPorter" language="Catalan"/>
</analyzer>
</fieldType>
-
+
<!-- CJK bigram (see text_ja for a Japanese configuration using
morphological analysis) -->
<dynamicField name="*_txt_cjk" type="text_cjk" indexed="true"
stored="true"/>
<fieldType name="text_cjk" class="solr.TextField"
positionIncrementGap="100">
@@ -615,29 +615,29 @@
<!-- Czech -->
<dynamicField name="*_txt_cz" type="text_cz" indexed="true"
stored="true"/>
<fieldType name="text_cz" class="solr.TextField"
positionIncrementGap="100">
- <analyzer>
+ <analyzer>
<tokenizer name="standard"/>
<filter name="lowercase"/>
<filter name="stop" ignoreCase="true" words="lang/stopwords_cz.txt" />
<filter name="czechStem"/>
</analyzer>
</fieldType>
-
+
<!-- Danish -->
<dynamicField name="*_txt_da" type="text_da" indexed="true"
stored="true"/>
<fieldType name="text_da" class="solr.TextField"
positionIncrementGap="100">
- <analyzer>
+ <analyzer>
<tokenizer name="standard"/>
<filter name="lowercase"/>
<filter name="stop" ignoreCase="true" words="lang/stopwords_da.txt"
format="snowball" />
<filter name="snowballPorter" language="Danish"/>
</analyzer>
</fieldType>
-
+
<!-- German -->
<dynamicField name="*_txt_de" type="text_de" indexed="true"
stored="true"/>
<fieldType name="text_de" class="solr.TextField"
positionIncrementGap="100">
- <analyzer>
+ <analyzer>
<tokenizer name="standard"/>
<filter name="lowercase"/>
<filter name="stop" ignoreCase="true" words="lang/stopwords_de.txt"
format="snowball" />
@@ -647,11 +647,11 @@
<!-- more aggressive: <filter name="snowballPorter"
language="German2"/> -->
</analyzer>
</fieldType>
-
+
<!-- Greek -->
<dynamicField name="*_txt_el" type="text_el" indexed="true"
stored="true"/>
<fieldType name="text_el" class="solr.TextField"
positionIncrementGap="100">
- <analyzer>
+ <analyzer>
<tokenizer name="standard"/>
<!-- greek specific lowercase for sigma -->
<filter name="greekLowercase"/>
@@ -659,11 +659,11 @@
<filter name="greekStem"/>
</analyzer>
</fieldType>
-
+
<!-- Spanish -->
<dynamicField name="*_txt_es" type="text_es" indexed="true"
stored="true"/>
<fieldType name="text_es" class="solr.TextField"
positionIncrementGap="100">
- <analyzer>
+ <analyzer>
<tokenizer name="standard"/>
<filter name="lowercase"/>
<filter name="stop" ignoreCase="true" words="lang/stopwords_es.txt"
format="snowball" />
@@ -686,14 +686,14 @@
<!-- Basque -->
<dynamicField name="*_txt_eu" type="text_eu" indexed="true"
stored="true"/>
<fieldType name="text_eu" class="solr.TextField"
positionIncrementGap="100">
- <analyzer>
+ <analyzer>
<tokenizer name="standard"/>
<filter name="lowercase"/>
<filter name="stop" ignoreCase="true" words="lang/stopwords_eu.txt" />
<filter name="snowballPorter" language="Basque"/>
</analyzer>
</fieldType>
-
+
<!-- Persian -->
<dynamicField name="*_txt_fa" type="text_fa" indexed="true"
stored="true"/>
<fieldType name="text_fa" class="solr.TextField"
positionIncrementGap="100">
@@ -707,11 +707,11 @@
<filter name="stop" ignoreCase="true" words="lang/stopwords_fa.txt" />
</analyzer>
</fieldType>
-
+
<!-- Finnish -->
<dynamicField name="*_txt_fi" type="text_fi" indexed="true"
stored="true"/>
<fieldType name="text_fi" class="solr.TextField"
positionIncrementGap="100">
- <analyzer>
+ <analyzer>
<tokenizer name="standard"/>
<filter name="lowercase"/>
<filter name="stop" ignoreCase="true" words="lang/stopwords_fi.txt"
format="snowball" />
@@ -719,11 +719,11 @@
<!-- less aggressive: <filter name="finnishLightStem"/> -->
</analyzer>
</fieldType>
-
+
<!-- French -->
<dynamicField name="*_txt_fr" type="text_fr" indexed="true"
stored="true"/>
<fieldType name="text_fr" class="solr.TextField"
positionIncrementGap="100">
- <analyzer>
+ <analyzer>
<tokenizer name="standard"/>
<!-- removes l', etc -->
<filter name="elision" ignoreCase="true"
articles="lang/contractions_fr.txt"/>
@@ -734,11 +734,11 @@
<!-- more aggressive: <filter name="snowballPorter"
language="French"/> -->
</analyzer>
</fieldType>
-
+
<!-- Irish -->
<dynamicField name="*_txt_ga" type="text_ga" indexed="true"
stored="true"/>
<fieldType name="text_ga" class="solr.TextField"
positionIncrementGap="100">
- <analyzer>
+ <analyzer>
<tokenizer name="standard"/>
<!-- removes d', etc -->
<filter name="elision" ignoreCase="true"
articles="lang/contractions_ga.txt"/>
@@ -749,11 +749,11 @@
<filter name="snowballPorter" language="Irish"/>
</analyzer>
</fieldType>
-
+
<!-- Galician -->
<dynamicField name="*_txt_gl" type="text_gl" indexed="true"
stored="true"/>
<fieldType name="text_gl" class="solr.TextField"
positionIncrementGap="100">
- <analyzer>
+ <analyzer>
<tokenizer name="standard"/>
<filter name="lowercase"/>
<filter name="stop" ignoreCase="true" words="lang/stopwords_gl.txt" />
@@ -761,11 +761,11 @@
<!-- less aggressive: <filter name="galicianMinimalStem"/> -->
</analyzer>
</fieldType>
-
+
<!-- Hindi -->
<dynamicField name="*_txt_hi" type="text_hi" indexed="true"
stored="true"/>
<fieldType name="text_hi" class="solr.TextField"
positionIncrementGap="100">
- <analyzer>
+ <analyzer>
<tokenizer name="standard"/>
<filter name="lowercase"/>
<!-- normalizes unicode representation -->
@@ -776,11 +776,11 @@
<filter name="hindiStem"/>
</analyzer>
</fieldType>
-
+
<!-- Hungarian -->
<dynamicField name="*_txt_hu" type="text_hu" indexed="true"
stored="true"/>
<fieldType name="text_hu" class="solr.TextField"
positionIncrementGap="100">
- <analyzer>
+ <analyzer>
<tokenizer name="standard"/>
<filter name="lowercase"/>
<filter name="stop" ignoreCase="true" words="lang/stopwords_hu.txt"
format="snowball" />
@@ -788,22 +788,22 @@
<!-- less aggressive: <filter name="hungarianLightStem"/> -->
</analyzer>
</fieldType>
-
+
<!-- Armenian -->
<dynamicField name="*_txt_hy" type="text_hy" indexed="true"
stored="true"/>
<fieldType name="text_hy" class="solr.TextField"
positionIncrementGap="100">
- <analyzer>
+ <analyzer>
<tokenizer name="standard"/>
<filter name="lowercase"/>
<filter name="stop" ignoreCase="true" words="lang/stopwords_hy.txt" />
<filter name="snowballPorter" language="Armenian"/>
</analyzer>
</fieldType>
-
+
<!-- Indonesian -->
<dynamicField name="*_txt_id" type="text_id" indexed="true"
stored="true"/>
<fieldType name="text_id" class="solr.TextField"
positionIncrementGap="100">
- <analyzer>
+ <analyzer>
<tokenizer name="standard"/>
<filter name="lowercase"/>
<filter name="stop" ignoreCase="true" words="lang/stopwords_id.txt" />
@@ -811,11 +811,11 @@
<filter name="indonesianStem" stemDerivational="true"/>
</analyzer>
</fieldType>
-
+
<!-- Italian -->
<dynamicField name="*_txt_it" type="text_it" indexed="true" stored="true"/>
<fieldType name="text_it" class="solr.TextField" positionIncrementGap="100">
- <analyzer>
+ <analyzer>
<tokenizer name="standard"/>
<!-- removes l', etc -->
<filter name="elision" ignoreCase="true"
articles="lang/contractions_it.txt"/>
@@ -825,7 +825,7 @@
<!-- more aggressive: <filter name="snowballPorter"
language="Italian"/> -->
</analyzer>
</fieldType>
-
+
<!-- Japanese using morphological analysis (see text_cjk for a
configuration using bigramming)
NOTE: If you want to optimize search for precision, use default
operator AND in your request
@@ -876,7 +876,7 @@
<filter name="lowercase"/>
</analyzer>
</fieldType>
-
+
<!-- Korean morphological analysis -->
<dynamicField name="*_txt_ko" type="text_ko" indexed="true"
stored="true"/>
<fieldType name="text_ko" class="solr.TextField"
positionIncrementGap="100">
@@ -887,7 +887,7 @@
This dictionary was built with MeCab, it defines a format for the
features adapted
for the Korean language.
-
+
Nori also has a convenient user dictionary feature that allows
overriding the statistical
model with your own entries for segmentation, part-of-speech tags
and readings without a need
to specify weights. Notice that user dictionaries have not been
subject to extensive testing.
@@ -900,7 +900,7 @@
-->
<tokenizer name="korean" decompoundMode="discard"
outputUnknownUnigrams="false"/>
<!-- Removes some part of speech stuff like EOMI (Pos.E), you can add
a parameter 'tags',
- listing the tags to remove. By default it removes:
+ listing the tags to remove. By default it removes:
E, IC, J, MAG, MAJ, MM, SP, SSC, SSO, SC, SE, XPN, XSA, XSN, XSV,
UNA, NA, VSV
This is basically an equivalent to stemming.
-->
@@ -914,18 +914,18 @@
<!-- Latvian -->
<dynamicField name="*_txt_lv" type="text_lv" indexed="true"
stored="true"/>
<fieldType name="text_lv" class="solr.TextField"
positionIncrementGap="100">
- <analyzer>
+ <analyzer>
<tokenizer name="standard"/>
<filter name="lowercase"/>
<filter name="stop" ignoreCase="true" words="lang/stopwords_lv.txt" />
<filter name="latvianStem"/>
</analyzer>
</fieldType>
-
+
<!-- Dutch -->
<dynamicField name="*_txt_nl" type="text_nl" indexed="true"
stored="true"/>
<fieldType name="text_nl" class="solr.TextField"
positionIncrementGap="100">
- <analyzer>
+ <analyzer>
<tokenizer name="standard"/>
<filter name="lowercase"/>
<filter name="stop" ignoreCase="true" words="lang/stopwords_nl.txt"
format="snowball" />
@@ -933,11 +933,11 @@
<filter name="snowballPorter" language="Dutch"/>
</analyzer>
</fieldType>
-
+
<!-- Norwegian -->
<dynamicField name="*_txt_no" type="text_no" indexed="true"
stored="true"/>
<fieldType name="text_no" class="solr.TextField"
positionIncrementGap="100">
- <analyzer>
+ <analyzer>
<tokenizer name="standard"/>
<filter name="lowercase"/>
<filter name="stop" ignoreCase="true" words="lang/stopwords_no.txt"
format="snowball" />
@@ -946,11 +946,11 @@
<!-- singular/plural: <filter name="norwegianMinimalStem"/> -->
</analyzer>
</fieldType>
-
+
<!-- Portuguese -->
<dynamicField name="*_txt_pt" type="text_pt" indexed="true" stored="true"/>
<fieldType name="text_pt" class="solr.TextField" positionIncrementGap="100">
- <analyzer>
+ <analyzer>
<tokenizer name="standard"/>
<filter name="lowercase"/>
<filter name="stop" ignoreCase="true" words="lang/stopwords_pt.txt"
format="snowball" />
@@ -960,22 +960,22 @@
<!-- most aggressive: <filter name="portugueseStem"/> -->
</analyzer>
</fieldType>
-
+
<!-- Romanian -->
<dynamicField name="*_txt_ro" type="text_ro" indexed="true"
stored="true"/>
<fieldType name="text_ro" class="solr.TextField"
positionIncrementGap="100">
- <analyzer>
+ <analyzer>
<tokenizer name="standard"/>
<filter name="lowercase"/>
<filter name="stop" ignoreCase="true" words="lang/stopwords_ro.txt" />
<filter name="snowballPorter" language="Romanian"/>
</analyzer>
</fieldType>
-
+
<!-- Russian -->
<dynamicField name="*_txt_ru" type="text_ru" indexed="true"
stored="true"/>
<fieldType name="text_ru" class="solr.TextField"
positionIncrementGap="100">
- <analyzer>
+ <analyzer>
<tokenizer name="standard"/>
<filter name="lowercase"/>
<filter name="stop" ignoreCase="true" words="lang/stopwords_ru.txt"
format="snowball" />
@@ -983,11 +983,11 @@
<!-- less aggressive: <filter name="russianLightStem"/> -->
</analyzer>
</fieldType>
-
+
<!-- Swedish -->
<dynamicField name="*_txt_sv" type="text_sv" indexed="true"
stored="true"/>
<fieldType name="text_sv" class="solr.TextField"
positionIncrementGap="100">
- <analyzer>
+ <analyzer>
<tokenizer name="standard"/>
<filter name="lowercase"/>
<filter name="stop" ignoreCase="true" words="lang/stopwords_sv.txt"
format="snowball" />
@@ -995,7 +995,7 @@
<!-- less aggressive: <filter name="swedishLightStem"/> -->
</analyzer>
</fieldType>
-
+
<!-- Thai -->
<dynamicField name="*_txt_th" type="text_th" indexed="true"
stored="true"/>
<fieldType name="text_th" class="solr.TextField"
positionIncrementGap="100">
@@ -1005,11 +1005,11 @@
<filter name="stop" ignoreCase="true" words="lang/stopwords_th.txt" />
</analyzer>
</fieldType>
-
+
<!-- Turkish -->
<dynamicField name="*_txt_tr" type="text_tr" indexed="true"
stored="true"/>
<fieldType name="text_tr" class="solr.TextField"
positionIncrementGap="100">
- <analyzer>
+ <analyzer>
<tokenizer name="standard"/>
<filter name="turkishLowercase"/>
<filter name="stop" ignoreCase="false" words="lang/stopwords_tr.txt" />
@@ -1018,8 +1018,8 @@
</fieldType>
<!-- Similarity is the scoring routine for each document vs. a query.
- A custom Similarity or SimilarityFactory may be specified here, but
- the default is fine for most applications.
+ A custom Similarity or SimilarityFactory may be specified here, but
+ the default is fine for most applications.
For more info:
http://lucene.apache.org/solr/guide/other-schema-elements.html#OtherSchemaElements-Similarity
-->
<!--
diff --git a/solr/solr-ref-guide/src/config-sets.adoc
b/solr/solr-ref-guide/src/config-sets.adoc
index 1c56627..ea736f9 100644
--- a/solr/solr-ref-guide/src/config-sets.adoc
+++ b/solr/solr-ref-guide/src/config-sets.adoc
@@ -41,11 +41,11 @@ The structure should look something like this:
/<configSetBaseDir>
/configset1
/conf
- /managed-schema
+ /managed-schema.xml
/solrconfig.xml
/configset2
/conf
- /managed-schema
+ /managed-schema.xml
/solrconfig.xml
----
diff --git a/solr/solr-ref-guide/src/configuration-files.adoc
b/solr/solr-ref-guide/src/configuration-files.adoc
index c84d4be..2c54c06 100644
--- a/solr/solr-ref-guide/src/configuration-files.adoc
+++ b/solr/solr-ref-guide/src/configuration-files.adoc
@@ -40,13 +40,13 @@ The crucial parts of the Solr home directory are shown in
these examples:
core.properties
conf/
solrconfig.xml
- managed-schema
+ managed-schema.xml
data/
core_name2/
core.properties
conf/
solrconfig.xml
- managed-schema
+ managed-schema.xml
data/
----
@@ -76,7 +76,7 @@ For more details on `core.properties`, see the section
<<core-discovery.adoc#,Co
** `solrconfig.xml` controls high-level behavior.
You can, for example, specify an alternate location for the data directory.
For more information on `solrconfig.xml`, see
<<configuring-solrconfig-xml.adoc#,Configuring solrconfig.xml>>.
-** `managed-schema` or `schema.xml` describes the documents you will ask Solr
to index.
+** `managed-schema.xml` or `schema.xml` describes the documents you will ask
Solr to index.
The schema defines a document as a collection of fields.
You can define both the field types and the fields themselves.
Field type definitions are powerful and include information about how Solr
processes incoming field values and query values.
diff --git a/solr/solr-ref-guide/src/coreadmin-api.adoc
b/solr/solr-ref-guide/src/coreadmin-api.adoc
index 0c266d8..60dec26 100644
--- a/solr/solr-ref-guide/src/coreadmin-api.adoc
+++ b/solr/solr-ref-guide/src/coreadmin-api.adoc
@@ -163,7 +163,7 @@ That said, if you're running SolrCloud, you should *NOT*
use the CoreAdmin API a
Instead, use the <<collections-api.adoc#,Collections API>>.
With a user-managed cluster, if you have <<config-sets.adoc#,Configsets>>
defined, you can use the `configSet` parameter as documented below.
-If there are no configsets, then the `instanceDir` specified in the CREATE
call must already exist, and it must contain a `conf` directory which in turn
must contain `solrconfig.xml`, your schema (usually named either
`managed-schema` or `schema.xml`), and any files referenced by those configs.
+If there are no configsets, then the `instanceDir` specified in the CREATE
call must already exist, and it must contain a `conf` directory which in turn
must contain `solrconfig.xml`, your schema (usually named either
`managed-schema.xml` or `schema.xml`), and any files referenced by those
configs.
The config and schema filenames can be specified with the `config` and
`schema` parameters, but these are expert options.
One thing you could do to avoid creating the `conf` directory is use `config`
and `schema` parameters that point at absolute paths, but this can lead to
confusing configurations unless you fully understand what you are doing.
diff --git a/solr/solr-ref-guide/src/documents-fields-schema-design.adoc
b/solr/solr-ref-guide/src/documents-fields-schema-design.adoc
index 880bfaf..08c3443 100644
--- a/solr/solr-ref-guide/src/documents-fields-schema-design.adoc
+++ b/solr/solr-ref-guide/src/documents-fields-schema-design.adoc
@@ -82,7 +82,7 @@ Field analysis is an important part of a field type.
== Solr's Schema File
Solr stores details about the field types and fields it is expected to
understand in a schema file.
-This file is named either `managed-schema` or `schema.xml`.
+This file is named either `managed-schema.xml` or `schema.xml`.
The difference is determined by how you plan to manage Solr's schema in your
installation: either programmatically or by hand-editing.
An important fact about the schema is that it is a Solr concept.
diff --git a/solr/solr-ref-guide/src/schema-api.adoc
b/solr/solr-ref-guide/src/schema-api.adoc
index fc24ee9..b73f082 100644
--- a/solr/solr-ref-guide/src/schema-api.adoc
+++ b/solr/solr-ref-guide/src/schema-api.adoc
@@ -29,15 +29,17 @@ See the section <<schema-factory.adoc#,Schema Factory
Definition in SolrConfig>>
.Hand editing of the managed schema is discouraged
[NOTE]
====
-The file named "managed-schema" in the example configurations may include a
note that recommends never hand-editing the file.
+The file named "managed-schema.xml" in the example configurations may include
a note that recommends never hand-editing the file.
Before the Schema API existed, such edits were the only way to make changes to
the schema, and users may have a strong desire to continue making changes this
way.
The reason that this is discouraged is because hand-edits of the schema may be
lost if the Schema API described here is later used to make a change, unless
the core or collection is reloaded or Solr is restarted before using the Schema
API.
If care is taken to always reload or restart after a manual edit, then there
is no problem at all with doing those edits.
+
+Prior to Solr 9, this xml file was referred to as `managed-schema` with no
file extension.
====
The API allows two output modes for all calls: JSON or XML.
-When requesting the complete schema, there is another output mode which is XML
modeled after the managed-schema file itself, which is in XML format.
+When requesting the complete schema, there is another output mode which is XML
modeled after the managed-schema.xml file itself, which is in XML format.
When modifying the schema with the API, a core reload will automatically occur
in order for the changes to be available immediately for documents indexed
thereafter.
Previously indexed documents will *not* be automatically updated - they *must*
be reindexed if existing index data uses schema elements that you changed.
diff --git a/solr/solr-ref-guide/src/schema-elements.adoc
b/solr/solr-ref-guide/src/schema-elements.adoc
index c2220fa..cf99c57 100644
--- a/solr/solr-ref-guide/src/schema-elements.adoc
+++ b/solr/solr-ref-guide/src/schema-elements.adoc
@@ -21,7 +21,7 @@ Solr stores details about the field types and fields it is
expected to understan
== Solr's Schema File
The name and location of Solr's schema file may vary depending on how you
initially configured Solr or if you modified it later.
-* `managed-schema` is the name for the schema file Solr uses by default to
support making schema changes at runtime via the <<schema-api.adoc#,Schema
API>>, or <<schemaless-mode.adoc#,Schemaless Mode>> features.
+* `managed-schema.xml` is the name for the schema file Solr uses by default to
support making schema changes at runtime via the <<schema-api.adoc#,Schema
API>>, or <<schemaless-mode.adoc#,Schemaless Mode>> features.
+
You may <<schema-factory.adoc#,explicitly configure the managed schema
features>> to use an alternative filename if you choose, but the contents of
the files are still updated automatically by Solr.
* `schema.xml` is the traditional name for a schema file which can be edited
manually by users who use the
<<schema-factory.adoc#,`ClassicIndexSchemaFactory`>>.
diff --git a/solr/solr-ref-guide/src/schema-factory.adoc
b/solr/solr-ref-guide/src/schema-factory.adoc
index 05b60b4..3b80f3b 100644
--- a/solr/solr-ref-guide/src/schema-factory.adoc
+++ b/solr/solr-ref-guide/src/schema-factory.adoc
@@ -41,7 +41,7 @@ While the "read" features of the Schema API are supported for
all schema types,
=== ManagedIndexSchemaFactory
-When a `<schemaFactory/>` is not explicitly declared in a `solrconfig.xml`
file, Solr implicitly uses a `ManagedIndexSchemaFactory`, which is by default
`"mutable"` (editable) and keeps schema information in a `managed-schema` file.
+When a `<schemaFactory/>` is not explicitly declared in a `solrconfig.xml`
file, Solr implicitly uses a `ManagedIndexSchemaFactory`, which is by default
`"mutable"` (editable) and keeps schema information in a `managed-schema.xml`
file.
Using the Managed Schema is required to be able to use the Schema API to
modify your schema.
However, using Managed Schema does not mean you are also using Solr in
Schemaless Mode (or "schema guessing" mode).
@@ -54,7 +54,7 @@ Below is an example of a `schemaFactory` that reflects Solr's
defaults:
----
<schemaFactory class="ManagedIndexSchemaFactory">
<bool name="mutable">true</bool>
- <str name="managedSchemaResourceName">managed-schema</str>
+ <str name="managedSchemaResourceName">managed-schema.xml</str>
</schemaFactory>
----
@@ -76,7 +76,7 @@ With the default configuration shown above, you could use the
<<schema-api.adoc#
+
[%autowidth,frame=none]
|===
-|Optional |Default: `managed-schema`
+|Optional |Default: `managed-schema.xml`
|===
+
The name of the schema file.
@@ -101,7 +101,7 @@ This option takes no parameters.
If you have an existing Solr collection that uses `ClassicIndexSchemaFactory`,
and you wish to convert to use a managed schema, you can simply modify the
`solrconfig.xml` to specify the use of the `ManagedIndexSchemaFactory`.
-Once Solr is restarted and it detects that a `schema.xml` file exists, but the
`managedSchemaResourceName` file (i.e., "`managed-schema`") does not exist, the
existing `schema.xml` file will be renamed to `schema.xml.bak` and the contents
re-written to the managed schema file.
+Once Solr is restarted and it detects that a `schema.xml` file exists, but the
`managedSchemaResourceName` file (i.e., "`managed-schema.xml`") does not exist,
the existing `schema.xml` file will be renamed to `schema.xml.bak` and the
contents re-written to the managed schema file.
If you look at the resulting file, you'll see this at the top of the page:
@@ -116,7 +116,7 @@ You are now free to use the <<schema-api.adoc#,Schema API>>
to make changes, and
If you have started Solr with managed schema enabled and you would like to
switch to manually editing a `schema.xml` file, you should take the following
steps:
-. Rename the `managed-schema` file to `schema.xml`.
+. Rename the `managed-schema.xml` file to `schema.xml`.
. Modify `solrconfig.xml` to replace the `schemaFactory` class.
.. Remove any `ManagedIndexSchemaFactory` definition if it exists.
.. Add a `ClassicIndexSchemaFactory` definition as shown above
diff --git a/solr/solr-ref-guide/src/schemaless-mode.adoc
b/solr/solr-ref-guide/src/schemaless-mode.adoc
index 4dcbd7f..311b677 100644
--- a/solr/solr-ref-guide/src/schemaless-mode.adoc
+++ b/solr/solr-ref-guide/src/schemaless-mode.adoc
@@ -82,7 +82,7 @@ You can configure the `ManagedIndexSchemaFactory` (and
control the resource file
----
<schemaFactory class="ManagedIndexSchemaFactory">
<bool name="mutable">true</bool>
- <str name="managedSchemaResourceName">managed-schema</str>
+ <str name="managedSchemaResourceName">managed-schema.xml</str>
</schemaFactory>
----
diff --git a/solr/solr-ref-guide/src/solr-glossary.adoc
b/solr/solr-ref-guide/src/solr-glossary.adoc
index ad16513..842bc1e 100644
--- a/solr/solr-ref-guide/src/solr-glossary.adoc
+++ b/solr/solr-ref-guide/src/solr-glossary.adoc
@@ -186,9 +186,9 @@ See also <<solrclouddef,SolrCloud>>.
[[solrclouddef]]<<cluster-types.adoc#solrcloud-mode,SolrCloud>>::
Umbrella term for a suite of functionality in Solr which allows managing a
<<cluster,Cluster>> of Solr <<node,Nodes>> for scalability, fault tolerance,
and high availability.
-[[schema]]<<solr-schema.adoc#,Solr Schema (managed-schema or schema.xml)>>::
+[[schema]]<<solr-schema.adoc#,Solr Schema (managed-schema.xml or
schema.xml)>>::
The Solr index Schema defines the fields to be indexed and the type for the
field (text, integers, etc.).
-By default schema data can be "managed" at run time using the
<<schema-api.adoc#,Schema API>> and is typically kept in a file named
`managed-schema` which Solr modifies as needed, but a collection may be
configured to use a static Schema, which is only loaded on startup from a human
edited configuration file - typically named `schema.xml`.
+By default schema data can be "managed" at run time using the
<<schema-api.adoc#,Schema API>> and is typically kept in a file named
`managed-schema.xml` which Solr modifies as needed, but a collection may be
configured to use a static Schema, which is only loaded on startup from a human
edited configuration file - typically named `schema.xml`.
See <<schema-factory.adoc#,Schema Factory Definition in SolrConfig>> for
details.
[[solrconfig]]<<configuring-solrconfig-xml.adoc#,SolrConfig
(solrconfig.xml)>>::
diff --git
a/solr/solr-ref-guide/src/solrcloud-with-legacy-configuration-files.adoc
b/solr/solr-ref-guide/src/solrcloud-with-legacy-configuration-files.adoc
index fc3e56c..dc6af6c 100644
--- a/solr/solr-ref-guide/src/solrcloud-with-legacy-configuration-files.adoc
+++ b/solr/solr-ref-guide/src/solrcloud-with-legacy-configuration-files.adoc
@@ -22,7 +22,7 @@ All of the required configuration is already set up in the
sample configurations
You only need to add the following if you are migrating old configuration
files.
Do not remove these files and parameters from a new Solr instance if you
intend to use Solr in SolrCloud mode.
-These properties exist in 3 files: `schema.xml` or `managed-schema`,
`solrconfig.xml`, and `solr.xml`.
+These properties exist in 3 files: `schema.xml` or `managed-schema.xml`,
`solrconfig.xml`, and `solr.xml`.
. In the schema file, you must have a `\_version_` field defined:
+
diff --git a/solr/solr-ref-guide/src/tutorial-diy.adoc
b/solr/solr-ref-guide/src/tutorial-diy.adoc
index dafc4fa..2f961a8 100644
--- a/solr/solr-ref-guide/src/tutorial-diy.adoc
+++ b/solr/solr-ref-guide/src/tutorial-diy.adoc
@@ -72,7 +72,7 @@ Click on the btn:[Submit Document] button below the form to
index your document.
=== Updating Data
You may notice that even if you index content in this tutorial more than once,
it does not duplicate the results found.
-This is because the example Solr schema (a file named either `managed-schema`
or `schema.xml`) specifies a `uniqueKey` field called `id`.
+This is because the example Solr schema (a file named either
`managed-schema.xml` or `schema.xml`) specifies a `uniqueKey` field called `id`.
Whenever you POST commands to Solr to add a document with the same value for
the `uniqueKey` as an existing document, it automatically replaces it for you.
You can see that has happened by looking at the values for `numDocs` and
`maxDoc` in the core-specific Overview section of the Solr Admin UI.
diff --git a/solr/solr-ref-guide/src/tutorial-techproducts.adoc
b/solr/solr-ref-guide/src/tutorial-techproducts.adoc
index a95f41d..97fe3c9 100644
--- a/solr/solr-ref-guide/src/tutorial-techproducts.adoc
+++ b/solr/solr-ref-guide/src/tutorial-techproducts.adoc
@@ -125,7 +125,7 @@ _default or sample_techproducts_configs [_default]
We've reached another point where we will deviate from the default option.
Solr has two sample sets of configuration files (called a configset) available
out-of-the-box.
-A collection must have a configset, which at a minimum includes the two main
configuration files for Solr: the schema file (named either `managed-schema` or
`schema.xml`), and `solrconfig.xml`.
+A collection must have a configset, which at a minimum includes the two main
configuration files for Solr: the schema file (named either
`managed-schema.xml` or `schema.xml`), and `solrconfig.xml`.
The question here is which configset you would like to start with.
The `_default` is a bare-bones option, but note there's one whose name
includes "techproducts", the same as we named our collection.
This configset is specifically designed to support the sample data we want to
use, so enter `sample_techproducts_configs` at the prompt and hit kbd:[enter].
diff --git a/solr/solr-ref-guide/src/user-managed-index-replication.adoc
b/solr/solr-ref-guide/src/user-managed-index-replication.adoc
index d3beb16..287066d 100644
--- a/solr/solr-ref-guide/src/user-managed-index-replication.adoc
+++ b/solr/solr-ref-guide/src/user-managed-index-replication.adoc
@@ -124,7 +124,7 @@ A line like the following would ensure that the local
configuration `solrconfig_
+
[source,xml]
----
-<str
name="confFiles">solrconfig_follower.xml:solrconfig.xml,managed-schema,stopwords.txt</str>
+<str
name="confFiles">solrconfig_follower.xml:solrconfig.xml,managed-schema.xml,stopwords.txt</str>
----
+
On the leader server, the file name of the follower configuration file can be
anything, as long as the name is correctly identified in the `confFiles`
string; then it will be saved as whatever file name appears after the colon ':'.
diff --git
a/solr/solrj/src/test-files/solrj/solr/collection1/conf/solrconfig-managed-schema.xml
b/solr/solrj/src/test-files/solrj/solr/collection1/conf/solrconfig-managed-schema.xml
index 9db6a57..92bf388 100644
---
a/solr/solrj/src/test-files/solrj/solr/collection1/conf/solrconfig-managed-schema.xml
+++
b/solr/solrj/src/test-files/solrj/solr/collection1/conf/solrconfig-managed-schema.xml
@@ -17,16 +17,15 @@
-->
<!--
- This is a stripped down config file used for a simple example...
- It is *not* a good example to work from.
+ This is a stripped down config file used for a simple example...
+ It is *not* a good example to work from.
-->
<config>
<luceneMatchVersion>${tests.luceneMatchVersion:LATEST}</luceneMatchVersion>
<schemaFactory class="ManagedIndexSchemaFactory">
<bool name="mutable">true</bool>
- <str name="managedSchemaResourceName">managed-schema</str>
+ <str name="managedSchemaResourceName">managed-schema.xml</str>
</schemaFactory>
</config>
-