= Using the Solr Administration User Interface
:page-children: overview-of-the-solr-admin-ui, logging, cloud-screens, collections-core-admin, java-properties, thread-dump, collection-specific-tools, core-specific-tools
// 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 section discusses the Solr Administration User Interface ("Admin UI").

The <<overview-of-the-solr-admin-ui.adoc#,Overview of the Solr Admin UI>> explains the basic features of the user interface, what's on the initial Admin UI page, and how to configure the interface. In addition, there are pages describing each screen of the Admin UI:

* *<<logging.adoc#,Logging>>* shows recent messages logged by this Solr node and provides a way to change logging levels for specific classes.
* *<<cloud-screens.adoc#,Cloud Screens>>* display information about nodes when running in SolrCloud mode.
* *<<collections-core-admin.adoc#,Collections / Core Admin>>* explains how to get management information about each core.
* *<<java-properties.adoc#,Java Properties>>* shows the Java information about each core.
* *<<thread-dump.adoc#,Thread Dump>>* lets you see detailed information about each thread, along with state information.

* *<<collection-specific-tools.adoc#,Collection-Specific Tools>>* is a section explaining additional screens available for each collection.
// TODO: SOLR-10655 BEGIN: refactor this into a 'collection-screens-list.include.adoc' file for reuse
** <<analysis-screen.adoc#,Analysis>> - lets you analyze the data found in specific fields.
** <<documents-screen.adoc#,Documents>> - provides a simple form allowing you to execute various Solr indexing commands directly from the browser.
** <<files-screen.adoc#,Files>> - shows the current core configuration files such as `solrconfig.xml`.
** <<query-screen.adoc#,Query>> - lets you submit a structured query about various elements of a core.
** <<stream-screen.adoc#,Stream>> - allows you to submit streaming expressions and see results and parsing explanations.
** <<schema-browser-screen.adoc#,Schema Browser>> - displays schema data in a browser window.
// TODO: SOLR-10655 END
* *<<core-specific-tools.adoc#,Core-Specific Tools>>* is a section explaining additional screens available for each named core.
// TODO: SOLR-10655 BEGIN: refactor this into a 'core-screens-list.include.adoc' file for reuse
** <<ping.adoc#,Ping>> - lets you ping a named core and determine whether the core is active.
** <<plugins-stats-screen#plugins-stats-screen,Plugins/Stats>> - shows statistics for plugins and other installed components.
** <<replication-screen.adoc#,Replication>> - shows you the current replication status for the core, and lets you enable/disable replication.
** <<segments-info.adoc#,Segments Info>> - Provides a visualization of the underlying Lucene index segments.
// TODO: SOLR-10655 END
