fields = new ArrayList<>();
+ for (String key : object.keySet()) {
+ String order = object.getString(key);
+ boolean reverse;
+ if (order.equals("asc")) {
+ reverse = false;
+ } else if (order.equals("desc")) {
+ reverse = true;
+ } else {
+ throw new LuceneException(HttpURLConnection.HTTP_BAD_REQUEST,
+ "Sort order must be 'asc' or 'desc' but it was '" + order + "'");
+ }
+
+ if (DocumentMapping.longFields.contains(key)) {
+ fields.add(new SortedNumericSortField(key, Type.LONG, reverse));
+ } else if (DocumentMapping.doubleFields.contains(key)) {
+ fields.add(new SortedNumericSortField(key, Type.DOUBLE, reverse));
+ } else {
+ fields.add(new SortField(key, Type.STRING, reverse));
+ }
+ }
+ fields.add(new SortedNumericSortField("id", Type.LONG));
+ scored = false;
+ sort = new Sort(fields.toArray(new SortField[0]));
+ }
+ }
+}
diff --git a/src/main/resources/run.properties b/src/main/resources/run.properties
index b010790..f1266ab 100644
--- a/src/main/resources/run.properties
+++ b/src/main/resources/run.properties
@@ -1,6 +1,16 @@
# Real comments in this file are marked with '#' whereas commented out lines
# are marked with '!'
-directory = ${HOME}/data/lucene
-commitSeconds = 5
-ip = 127.0.0.1/32
+directory = ${HOME}/data/search
+commitSeconds = 5
+maxShardSize = 2147483519
+ip = 127.0.0.1/32
+# A search taking longer than this will be cancelled to avoid blocking other users' searches
+maxSearchTimeSeconds = 5
+# List of units to enable conversion to SI units when querying on numerical parameters
+units = J: eV 1.602176634e-19; \u2103: celsius, degC; K: kelvin
+# List of fields that should be stored for facet filtering when searching
+# In order to be available, these fields must be set when indexing the data
+facetFields = datafileFormat.name instrument.name sample.type.name stringValue technique.name type.name
+# Aggregate file sizes and counts in real time (this will have a performance impact on write operations)
+aggregateFiles = false
diff --git a/src/main/resources/synonym.txt b/src/main/resources/synonym.txt
new file mode 100755
index 0000000..5e633da
--- /dev/null
+++ b/src/main/resources/synonym.txt
@@ -0,0 +1,246 @@
+# Synonyms to be applied after stemming according to the Porter algorithm
+
+# Alternate spellings
+ionise, ionize
+
+# Elements
+Hydrogen, H
+Helium, He
+Lithium, Li
+Beryllium, Be
+Boron, B
+Carbon, C
+Nitrogen, N
+Oxygen, O
+Fluorine, F
+Neon, Ne
+Sodium,Na
+Magnesium,Mg
+Aluminum,Al
+Silicon,Si
+Phosphorus,P
+Sulfur, Sulphur,S
+Chlorine,Cl
+Argon,Ar
+Potassium,K
+Calcium,Ca
+Scandium,Sc
+Titanium,Ti
+Vanadium,V
+Chromium,Cr
+Manganese,Mn
+Iron,Fe
+Cobalt,Co
+Nickel,Ni
+Copper,Cu
+Zinc,Zn
+Gallium,Ga
+Germanium,Ge
+Arsenic,As
+Selenium,Se
+Bromine,Br
+Krypton,Kr
+Rubidium,Rb
+Strontium,Sr
+Yttrium,Y
+Zirconium,Zr
+Niobium,Nb
+Molybdenum,Mo
+Technetium,Tc
+Ruthenium,Ru
+Rhodium,Rh
+Palladium,Pd
+Silver,Ag
+Cadmium,Cd
+Indium,In
+Tin,Sn
+Antimony,Sb
+Tellurium,Te
+Iodine,I
+Xenon,Xe
+Caesium, Cesium, Cs
+Barium,Ba
+Lanthanum,La
+Cerium,Ce
+Praseodymium,Pr
+Neodymium,Nd
+Promethium,Pm
+Samarium,Sm
+Europium,Eu
+Gadolinium,Gd
+Terbium,Tb
+Dysprosium,Dy
+Holmium,Ho
+Erbium,Er
+Thulium,Tm
+Ytterbium,Yb
+Lutetium,Lu
+Hafnium,Hf
+Tantalum,Ta
+Tungsten, Wolfram,W
+Rhenium,Re
+Osmium,Os
+Iridium,Ir
+Platinum,Pt
+Gold,Au
+Mercury,Hg
+Thallium,Tl
+Lead,Pb
+Bismuth,Bi
+Polonium,Po
+Astatine,At
+Radon,Rn
+Francium,Fr
+Radium,Ra
+Actinium,Ac
+Thorium,Th
+Protactinium,Pa
+Uranium,U
+Neptunium,Np
+Plutonium,Pu
+Americium,Am
+Curium,Cm
+Berkelium,Bk
+Californium,Cf
+Einsteinium,Es
+Fermium,Fm
+Mendelevium,Md
+Nobelium,No
+Lawrencium,Lr
+Rutherfordium,Rf
+Dubnium,Db
+Seaborgium,Sg
+Bohrium,Bh
+Hassium,Hs
+Meitnerium, Mt
+Darmstadtium ,Ds
+Roentgenium ,Rg
+Copernicium ,Cn
+Nihonium,Nh
+Flerovium,Fl
+Moscovium,Mc
+Livermorium,Lv
+Tennessine,Ts
+Oganesson,Og
+
+# Techniques
+forward scattering technique, propagation technique => forward scattering technique, propagation technique
+TOF, time of flight technique => TOF, time of flight technique
+femtosecond probe, ultrafast probe => femtosecond probe, ultrafast probe
+MuSR, muon spin resonance => MuSR, muon spin resonance
+crystallography, obtain crystal structure => crystallography, obtain crystal structure
+time dependent study, time resolved study => time dependent study, time resolved study
+ARPES, angle resolved photoemission spectroscopy => ARPES, angle resolved photoemission spectroscopy
+GISAS, grazing incidence SAS, grazing incidence small angle scattering => GISAS, grazing incidence SAS, grazing incidence small angle scattering
+NPD, neutron powder diffraction => NPD, neutron powder diffraction
+XPD, x-ray powder diffraction => XPD, x-ray powder diffraction
+SXRD, single crystal x-ray diffraction, x-ray single crystal diffraction => SXRD, single crystal x-ray diffraction, x-ray single crystal diffraction
+HAXPES, hard photoelectron spectroscopy, hard x-ray photoelectron spectroscopy => HAXPES, hard photoelectron spectroscopy, hard x-ray photoelectron spectroscopy
+inelastic SAS, inelastic small angle scatteringng => inelastic SAS, inelastic small angle scatteringng
+IR spectroscopy, infrared spectroscopy => IR spectroscopy, infrared spectroscopy
+Micro XRF, fluorescence microscopy, microfluorescence => Micro XRF, fluorescence microscopy, microfluorescence
+PCS, photon correlation spectroscopy => PCS, photon correlation spectroscopy
+quasi elastic spin echo, quasielastic neutron spin echo scattering, quasielastic spin echo => quasi elastic spin echo, quasielastic neutron spin echo scattering, quasielastic spin echo
+reflectivity, reflectometry => reflectivity, reflectometry
+anomalous diffraction, anomalous scattering, resonant diffraction => anomalous diffraction, anomalous scattering, resonant diffraction
+STM, scanning transmission microscopy => STM, scanning transmission microscopy
+SAS, small angle diffraction, small angle scattering => SAS, small angle diffraction, small angle scattering
+spin echo SANS, spin echo small angle scattering => spin echo SANS, spin echo small angle scattering
+UV circular dichroism, UVCD => UV circular dichroism, UVCD
+USAS, ultra small angle scattering => USAS, ultra small angle scattering
+diffraction imaging, topography => diffraction imaging, topography
+XMCD, x-ray magnetic circular dichroism => XMCD, x-ray magnetic circular dichroism
+LD, linear dichroism => LD, linear dichroism
+XEOL, x-ray excited optical luminescence => XEOL, x-ray excited optical luminescence
+MCD, magnetic circular dichroism => MCD, magnetic circular dichroism
+MChD, magnetochiral dichroism => MChD, magnetochiral dichroism
+NCD, natural circular dichroism => NCD, natural circular dichroism
+EM, electron microscopy => EM, electron microscopy
+PEEM, photoemission electron microscopy, photoemission microscopy => PEEM, photoemission electron microscopy, photoemission microscopy
+scanning microscopy, scanning probe microscopy => scanning microscopy, scanning probe microscopy
+XRR, x-ray reflectivity, x-ray reflectometry => XRR, x-ray reflectivity, x-ray reflectometry
+EDD, energy dispersive diffraction => EDD, energy dispersive diffraction
+EDXRD, energy dispersive x-ray diffraction => EDXRD, energy dispersive x-ray diffraction
+GIXD, grazing incidence x-ray diffraction => GIXD, grazing incidence x-ray diffraction
+GISAXS, grazing incidence small angle x-ray scattering => GISAXS, grazing incidence small angle x-ray scattering
+Diffraction, high pressure single crystal diffraction => Diffraction, high pressure single crystal diffraction
+MX, macromolecular crystallography, protein crystallography => MX, macromolecular crystallography, protein crystallography
+MAD, multi wavelength anomalous diffraction, multi wavelength anomalous dispersion => MAD, multi wavelength anomalous diffraction, multi wavelength anomalous dispersion
+PhD, photoelectron diffraction => PhD, photoelectron diffraction
+SFX, serial femtosecond crystallography => SFX, serial femtosecond crystallography
+SSX, serial synchrotron crystallography => SSX, serial synchrotron crystallography
+SAD, single wavelength anomalous diffraction, single wavelength anomalous dispersion => SAD, single wavelength anomalous diffraction, single wavelength anomalous dispersion
+chemical crystallography, small molecule crystallography, small molecule diffraction => chemical crystallography, small molecule crystallography, small molecule diffraction
+XSW, x-ray standing wave => XSW, x-ray standing wave
+CDI, coherent diffraction imaging, coherent diffractive imaging => CDI, coherent diffraction imaging, coherent diffractive imaging
+infrared nanospectroscopy imaging, nano infrared spectroscopy => infrared nanospectroscopy imaging, nano infrared spectroscopy
+XRF, x-ray fluorescence => XRF, x-ray fluorescence
+IR microscopy, infrared microscopy => IR microscopy, infrared microscopy
+PDF, pair distribution function => PDF, pair distribution function
+IXS, inelastic x-ray scattering => IXS, inelastic x-ray scattering
+RIXS, resonant inelastic x-ray scattering => RIXS, resonant inelastic x-ray scattering
+RXS, resonant x-ray scattering => RXS, resonant x-ray scattering
+RSXS, resonant soft x-ray scattering => RSXS, resonant soft x-ray scattering
+SAXS, small angle x-ray scattering => SAXS, small angle x-ray scattering
+SANS, small angle neutron scattering => SANS, small angle neutron scattering
+WAXS, wide angle x-ray scattering => WAXS, wide angle x-ray scattering
+CD, circular dichroism => CD, circular dichroism
+EDX, energy dispersive x-ray spectroscopy => EDX, energy dispersive x-ray spectroscopy
+XAS, x-ray absorption spectroscopy => XAS, x-ray absorption spectroscopy
+XAFS, x-ray absorption fine structure => XAFS, x-ray absorption fine structure
+EXAFS, extended x-ray absorption fine structure => EXAFS, extended x-ray absorption fine structure
+NEXAFS, XANES, x-ray absorption near edge structure => NEXAFS, XANES, x-ray absorption near edge structure
+XES, x-ray emission spectroscopy => XES, x-ray emission spectroscopy
+PES, photoelectron spectroscopy => PES, photoelectron spectroscopy
+XPS, x-ray photoelectron spectroscopy => XPS, x-ray photoelectron spectroscopy
+XPCS, x-ray photon correlation spectroscopy => XPCS, x-ray photon correlation spectroscopy
+CT scan, x-ray tomography => CT scan, x-ray tomography
+Absorption-based tomographic microscopy, absorption microtomography => Absorption-based tomographic microscopy, absorption microtomography
+Ultra-fast tomographic microscopy, ultrafast microtomography => Ultra-fast tomographic microscopy, ultrafast microtomography
+XRD, x-ray diffraction => XRD, x-ray diffraction
+STXM, scanning transmission x-ray microscopy => STXM, scanning transmission x-ray microscopy
+TEY, total electron yield => TEY, total electron yield
+XMCD TEY, XMCD total electron yield => XMCD TEY, XMCD total electron yield
+neutron reflectivity, neutron reflectometry => neutron reflectivity, neutron reflectometry
+USAXS, ultra small angle x-ray scattering => USAXS, ultra small angle x-ray scattering
+polarized neutron reflectivity, polarized neutron reflectometry => polarized neutron reflectivity, polarized neutron reflectometry
+TOF spectrometry, TOF spectroscopy, time-of-flight spectrometry => TOF spectrometry, TOF spectroscopy, time-of-flight spectrometry
+inelastic neutron scattering, inelastic neutron scattering spectroscopy, inelastic neutron spectroscopy => inelastic neutron scattering, inelastic neutron scattering spectroscopy, inelastic neutron spectroscopy
+XMLD, x-ray magnetic linear dichroism => XMLD, x-ray magnetic linear dichroism
+REXS, resonant elastic x-ray scattering => REXS, resonant elastic x-ray scattering
+x-ray refraction imaging, x-ray refraction radiography => x-ray refraction imaging, x-ray refraction radiography
+time dependent scattering, time resolved scattering => time dependent scattering, time resolved scattering
+time dependent diffraction, time resolved diffraction => time dependent diffraction, time resolved diffraction
+time dependent absorption, time resolved absorption => time dependent absorption, time resolved absorption
+ASAXS, anomalous small angle x-ray scattering => ASAXS, anomalous small angle x-ray scattering
+ASAX, anomalous solution x-ray scattering => ASAX, anomalous solution x-ray scattering
+GISANS, grazing incidence small angle neutron scattering => GISANS, grazing incidence small angle neutron scattering
+VSANS, very small angle neutron scattering => VSANS, very small angle neutron scattering
+micro SAXS tomography, micro small angle x-ray scattering tomography => micro SAXS tomography, micro small angle x-ray scattering tomography
+micro GISAXS tomography, micro grazing incidence small angle x-ray scattering tomography => micro GISAXS tomography, micro grazing incidence small angle x-ray scattering tomography
+nano ARPES, nano angle resolved photoemission spectroscopy => nano ARPES, nano angle resolved photoemission spectroscopy
+scanning x-ray microscopy, x-ray scanning microscopy => scanning x-ray microscopy, x-ray scanning microscopy
+HR-XPS, high resolution x-ray photoelectron spectroscopy => HR-XPS, high resolution x-ray photoelectron spectroscopy
+RENS, elastic neutron scattering spectroscopy, resolution elastic neutron scattering => RENS, elastic neutron scattering spectroscopy, resolution elastic neutron scattering
+XMChiD, x-ray magnetochiral dichroism => XMChiD, x-ray magnetochiral dichroism
+XNCD, x-ray natural circular dichroism => XNCD, x-ray natural circular dichroism
+XNLD, x-ray natural linear dichroism => XNLD, x-ray natural linear dichroism
+crystallographic fragment screening, fragment screening => crystallographic fragment screening, fragment screening
+microfocus MX, microfocus macromolecular crystallography => microfocus MX, microfocus macromolecular crystallography
+nanofocus MX, nanofocus macromolecular crystallography => nanofocus MX, nanofocus macromolecular crystallography
+MR, molecular replacement => MR, molecular replacement
+TR-SFX, time resolved serial femtosecond crystallography => TR-SFX, time resolved serial femtosecond crystallography
+FT-SSX, fixed target serial synchrotron crystallography => FT-SSX, fixed target serial synchrotron crystallography
+LCP-SSX, lipidic cubic phase serial synchrotron crystallography => LCP-SSX, lipidic cubic phase serial synchrotron crystallography
+TR-SSX, time resolved serial synchrotron crystallography => TR-SSX, time resolved serial synchrotron crystallography
+CLXM, correlative light x-ray microscopy => CLXM, correlative light x-ray microscopy
+GIWAXS, grazing incidence wide angle scattering => GIWAXS, grazing incidence wide angle scattering
+HR-ARPES, high resolution angle resolved photoemission spectroscopy => HR-ARPES, high resolution angle resolved photoemission spectroscopy
+AFM, atomic force microscopy => AFM, atomic force microscopy
+AFM-IR, atomic force microscope infrared spectroscopy => AFM-IR, atomic force microscope infrared spectroscopy
+FTIR, fourier transform infrared spectroscopy => FTIR, fourier transform infrared spectroscopy
+ED-EXAFS, EDE, energy dispersive extended x-ray absorption fine structure => ED-EXAFS, EDE, energy dispersive extended x-ray absorption fine structure
+radiation therapy, radiotherapy => radiation therapy, radiotherapy
+obtain surface atomic structure, surface crystallography => obtain surface atomic structure, surface crystallography
+XBI, x-ray birefringence imaging => XBI, x-ray birefringence imaging
+
diff --git a/src/main/scripts/parse_synonyms.py b/src/main/scripts/parse_synonyms.py
new file mode 100644
index 0000000..d23d2a4
--- /dev/null
+++ b/src/main/scripts/parse_synonyms.py
@@ -0,0 +1,184 @@
+#!/usr/bin/env python3
+
+import csv
+import sys
+from typing import Dict, List
+
+
+def add_to_parents(
+ relationships: Dict[str, Dict[str, List[str]]],
+ label: str,
+ parents: List[str],
+ child_depth: int
+):
+ """
+ Adds the `label` to all the entries in `relationships` that have a key in
+ `parents`, then recursively calls itself to add `label` to any
+ grandparents. `child_depth` is decreased by 1 for each generation to
+ prevent exponentially large injections.
+
+ Parameters
+ ----------
+ relationships: Dict[str, Dict[str, List[str]]]
+ Maps terms to an inner dictionary containing arrays for "alternatives",
+ "parents", and "children".
+ label: str
+ The term to be added to its `parents`.
+ parents: List[str]
+ The direct parents of the current `label`
+ child_depth: int
+ The number of generations of children to inject for each term.
+ For example, a value of 2 would inject children and their children.
+ 0 will only add alternative terms. Negative integers will add all
+ children, grandchildren, etc. Note that this may result in an
+ exponentially large number of terms
+ """
+ if child_depth != 0:
+ for parent in parents:
+ try:
+ relationships[parent]["children"].append(label)
+ # If the parent is equivalent to anything, also add label as a
+ # child of the equivalent_parent
+ for equivalent_parent in relationships[parent]["equivalent"]:
+ relationships[equivalent_parent]["children"].append(label)
+ add_to_parents(
+ relationships,
+ label,
+ relationships[parent]["parents"],
+ child_depth - 1,
+ )
+ except KeyError:
+ pass
+
+
+def main(input_file: str, output_file: str, mode: str, max_child_depth: int):
+ """
+ Reads an CSV file of terminology and writes it into Solr synonym format
+ for use in synonym injection. Alternative terms are always written, and the
+ number of child terms is configurable by `max_child_depth`.
+
+ Parameters
+ ----------
+ input_file: str
+ CSV file to read ontology from.
+ output_file: str
+ Solr synonym output file.
+ mode: str
+ Python file mode (w, a, ...) to use when writing the output file.
+ max_child_depth: int
+ The maximum number of generations of children to inject for each term.
+ For example, a value of 2 would inject children and their children.
+ 0 will only add alternative terms. Negative integers will add all
+ children, grandchildren, etc. Note that this may result in an
+ exponentially large number of terms
+ """
+ alt_indices = []
+ parent_indices = []
+ equivalent_indices = []
+ equivalent_pairs = {}
+ relationships = {}
+ with open(input_file) as f:
+ reader = csv.reader(f)
+
+ # Dynamically determine header positions
+ headers = next(reader)
+ for i, header in enumerate(headers):
+ if "Label" == header.strip():
+ label_index = i
+ elif "Alt Label" in header.strip():
+ alt_indices.append(i)
+ elif "Parent IRI" == header.strip():
+ parent_indices.append(i)
+ elif "Equivalent" == header.strip():
+ equivalent_indices.append(i)
+
+ for entries in reader:
+ try:
+ int(entries[0])
+ except (ValueError, IndexError):
+ # If we do not have an ID, continue to the next line
+ continue
+
+ label = entries[label_index]
+ if label in relationships.keys():
+ raise ValueError(f"Duplicate entry for label {label}")
+
+ relationships[label] = {
+ "alternatives": [],
+ "parents": [],
+ "equivalent": [],
+ "children": [],
+ }
+ for alt_index in alt_indices:
+ alternative_label = entries[alt_index]
+ if alternative_label:
+ relationships[label]["alternatives"].append(
+ alternative_label
+ )
+ for parent_index in parent_indices:
+ parent = entries[parent_index]
+ if parent:
+ relationships[label]["parents"].append(parent)
+ for equivalent_index in equivalent_indices:
+ equivalent_label = entries[equivalent_index]
+ if equivalent_label:
+ relationships[label]["equivalent"].append(equivalent_label)
+ equivalent_pairs[equivalent_label] = label
+
+ # If A is equivalent to B, then also set B equivalent to A
+ # This ensures they share all children
+ for key, value in equivalent_pairs.items():
+ try:
+ relationships[key]["equivalent"].append(value)
+ except KeyError:
+ pass
+
+ print(f"{len(relationships)} relationships found")
+ for label, relationship in relationships.items():
+ add_to_parents(
+ relationships, label, relationship["parents"], max_child_depth
+ )
+
+ output = ""
+ for label, relationship in relationships.items():
+ # Only write to file if we have alternative or child terms
+ if (len(relationship["alternatives"]) > 0
+ or len(relationship["children"]) > 0):
+ left_hand_side = ", ".join(
+ sorted(set([label] + relationship["alternatives"]))
+ )
+ right_hand_side = ", ".join(
+ sorted(set(
+ [label]
+ + relationship["alternatives"]
+ + relationship["children"]
+ ))
+ )
+ output += left_hand_side + " => " + right_hand_side + "\n"
+
+ with open(output_file, mode) as f:
+ f.write(output)
+
+
+if __name__ == "__main__":
+ args = sys.argv
+ try:
+ input_file = args[1]
+ except IndexError as e:
+ raise IndexError("input_file to parse not provided") from e
+ try:
+ output_file = args[2]
+ except IndexError as e:
+ raise IndexError("output_file to write to not provided") from e
+ try:
+ mode = args[3]
+ except IndexError:
+ # Default to appending to the output_file (no overwrite)
+ mode = "a"
+ try:
+ max_child_depth = int(args[4])
+ except (IndexError, ValueError):
+ # Default to 0 depth (only alternative terms)
+ max_child_depth = 0
+
+ main(input_file, output_file, mode, max_child_depth)
diff --git a/src/main/scripts/setup b/src/main/scripts/setup
index 7c8cb4e..6674f48 100755
--- a/src/main/scripts/setup
+++ b/src/main/scripts/setup
@@ -26,6 +26,7 @@ if arg == "INSTALL":
uninstall()
ovfiles = [[prop_name, "WEB-INF/classes"]]
if os.path.exists("logback.xml"): ovfiles.append(["logback.xml", "WEB-INF/classes"])
+ if os.path.exists("synonym.txt"): ovfiles.append(["synonym.txt", "WEB-INF/classes"])
actions.deploy(deploymentorder=80, files=ovfiles)
except Exception as e:
abort(str(e))
diff --git a/src/site/xhtml/installation.xhtml.vm b/src/site/xhtml/installation.xhtml.vm
index 37ec5ef..8d997f0 100644
--- a/src/site/xhtml/installation.xhtml.vm
+++ b/src/site/xhtml/installation.xhtml.vm
@@ -56,6 +56,11 @@
the interval in seconds between committing lucene changes to
disk and updating the index.
+ maxShardSize
+ The maximum number of documents to store in a single index before "sharding"
+ into an additional index. All sharded indices are searched at once when
+ performing a search. Has a maximum value of 2147483519 (max int - 128).
+
ip
Ranges of ip addresses to accept requests from. This should
be as restrictive as possible - just list the icats you need to
@@ -63,7 +68,42 @@
take the form of an IPV4 or IPV6 address followed by the number of
bits (starting from the most significant) to consider. For example
127.0.0.1/32 is the IPV4 value for localhost.
+
+ units
+ Recognised unit names/symbols. Each symbol recognised by indriya's
+ SimpleUnitFormat should be followed by a colon, and then a comma separated
+ list of units measuring the same property. If the unit is simply an alias
+ (e.g. "K: kelvin") this is sufficient. If a conversion is required, it
+ should be followed by this factor (e.g. "J: eV 1.602176634e-19"). Different
+ units can be separated by a semi-colon.
+
+ facetFields
+ The names of fields which should be stored as facetable. The names should
+ correspond to how the field appears in the Lucene index, which may be
+ different to how it is represented in the ICAT database due to flattening of
+ one to one relationships between entities. Accurate field names can be taken
+ from `getDoc` function(s) in icat.server. Note that in order to be available
+ at search time, the field must have been specified when indexing the
+ documents.
+
+ aggregateFiles
+ Aggregate file sizes/counts for Datasets and Investigations as Datafiles are
+ added or modified (i.e. in real time). This can have a significant
+ performance impact when writing to the index. If "false", icat.server can
+ instead be configured to update sizes at a regular intervals.
+ The synonym.txt file
+
+ Lucene supports synonym injection via the inclusion of the synonym.txt file.
+ The format of the file follows the
+ Solr synonyms format.
+ Either equivalent or one way mappings of terms is supported. An example file
+ containing chemical symbols and full names of elements, and abbreviations of the
+ PaNET ontology
+ is included, but modifications to this can be made. Note that ideally the
+ synonym file should be defined before indexing, so that synonymous terms are
+ indexed in the same way as they are searched.
+