Catalogue configuration
Each catalogue in Arranger is controlled by four JSON configuration files. Together they define which index to connect to, how fields are labelled for display, which columns appear in the data table, and which fields are exposed as facet panels.
Templates for all four files are in the Arranger repository. The full JSON schema describing every available option is at configTemplates/configs.json.schema.
File locations
Configuration files must be placed in the configs/ directory under the server's working directory, or in the path specified by the CONFIG_PATH environment variable.
In a multicatalogue setup, each catalogue gets its own subdirectory named after the catalogue ID:
configs/
├── participants/
│ ├── base.json
│ ├── extended.json
│ ├── facets.json
│ └── table.json
└── samples/
├── base.json
├── extended.json
├── facets.json
└── table.json
In single-catalogue mode, the four files sit directly in configs/ with no subdirectory.
base.json
Connects the catalogue to its Elasticsearch index.
{
"documentType": "file",
"esIndex": "my-elasticsearch-index"
}
documentType: The top-level name used in the generated GraphQL schema (e.g.file,participant,analysis). This becomes the root query field:{ file { hits { ... } } }.esIndex: The name of the Elasticsearch index or alias to query.
extended.json
Maps every field to its display name and controls which fields are visible.
{
"extended": [
{
"displayName": "Object ID",
"fieldName": "object_id"
},
{
"displayName": "Age at Diagnosis",
"fieldName": "clinical.donor.age_at_diagnosis"
}
]
}
displayName: How the field is labelled in the UI and introspection responses.fieldName: The field's path in the Elasticsearch document. Use dot notation for nested fields.
Fields in the mapping that are omitted from extended.json are still queryable via GraphQL but will not appear in the UI components.
table.json
Configures the columns in the data results table.
{
"table": {
"columns": [
{
"canChangeShow": true,
"fieldName": "object_id",
"show": true,
"sortable": true
},
{
"canChangeShow": true,
"fieldName": "analysis.collaborator.name",
"jsonPath": "$.analysis.collaborator.hits.edges[*].node.name",
"query": "analysis { collaborator { hits { edges { node { name } } } } }",
"show": true,
"sortable": false
}
]
}
}
canChangeShow: Whether users can toggle this column's visibility.show: Whether the column is visible by default.sortable: Whether the column header triggers result sorting.jsonPath: For nested data, the JSON path used to extract the value from the GraphQL response.query: For nested data, the GraphQL sub-query fragment for this field.
facets.json
Defines which fields appear as filterable facet panels.
{
"facets": {
"aggregations": [
{
"isActive": true,
"fieldName": "file_type",
"show": true
},
{
"isActive": true,
"fieldName": "analysis__collaborator__name",
"show": true
}
]
}
}
isActive: Whether this aggregation is computed. Set tofalseto disable a facet without removing it from the config.show: Whether to display this facet panel in the UI.fieldName: The field to aggregate on.
In facets.json, nested field paths use __ instead of .: write analysis__collaborator__name, not analysis.collaborator.name. This applies to fieldName in facet aggregations only; all other config files use dot notation.
Only fields with keyword or boolean types in the index mapping are suitable for facet aggregations. text fields cannot be aggregated reliably. See Index mappings for the full type compatibility table.
Best practices
- Keep
fieldNamevalues in sync with the actual field paths in your Elasticsearch index mapping. A mismatch silently returns no results for that field. extended.jsonis your source of truth for display names; make sure every field a user might see is listed there.- Mark columns as
sortable: falsefor nested or computed fields: Elasticsearch cannot sort directly on nested paths without a specific mapping configuration. - Use
isActive: falseinfacets.jsonto temporarily disable a facet rather than deleting it; re-enabling is then a one-field change.
For a step-by-step walkthrough of configuring a complete data portal, including mock data setup and Arranger component integration, see the platform guide on customizing the data portal.