{"id":33386164,"url":"https://github.com/synapticloop/panl","last_synced_at":"2026-03-01T23:33:45.260Z","repository":{"id":240192047,"uuid":"801918543","full_name":"synapticloop/panl","owner":"synapticloop","description":"Search Engine Friendly, Friendly Search Engine - Solr Panl","archived":false,"fork":false,"pushed_at":"2025-11-23T04:13:30.000Z","size":123281,"stargazers_count":1,"open_issues_count":21,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-11-23T05:02:30.541Z","etag":null,"topics":["solr","solr-client","solr-plugin","solr-search","solrcloud"],"latest_commit_sha":null,"homepage":"https://synapticloop.github.io/panl/","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/synapticloop.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-05-17T07:09:58.000Z","updated_at":"2025-11-23T04:13:33.000Z","dependencies_parsed_at":"2024-05-17T08:37:36.027Z","dependency_job_id":"71647542-1845-4116-9b3c-45671dcef010","html_url":"https://github.com/synapticloop/panl","commit_stats":null,"previous_names":["synapticloop/panl"],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/synapticloop/panl","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/synapticloop%2Fpanl","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/synapticloop%2Fpanl/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/synapticloop%2Fpanl/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/synapticloop%2Fpanl/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/synapticloop","download_url":"https://codeload.github.com/synapticloop/panl/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/synapticloop%2Fpanl/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29987698,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-01T22:42:38.399Z","status":"ssl_error","status_checked_at":"2026-03-01T22:41:51.863Z","response_time":124,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["solr","solr-client","solr-plugin","solr-search","solrcloud"],"created_at":"2025-11-23T05:00:48.392Z","updated_at":"2026-03-01T23:33:45.237Z","avatar_url":"https://github.com/synapticloop.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Synapticloop PANL\n\n\u003cimg src=\"src/docs/synapticloop-panl-headline.png\" alt=\"The Synapticloop Panl headline\" /\u003e\n\n\n\u003e **_Rapidly get up and running with a fully featured, SEO friendly, keyword\n\u003e searchable, faceted search engine with in-built search pages to test it all\n\u003e out._**\n\n---\n\n\u003e **_And, yes, there is full documentation available, over 600 pages, \n\u003e covering all aspects of the configuration of the Panl server so that you \n\u003e can get the most out of your Solr and Panl experience._**\n\n# IMPORTANT:\n\nApache®, Solr® the names of Apache projects, and the multicolor feather logo are \nregistered trademarks or trademarks of the Apache Software Foundation in the \nUnited States and/or other countries.  \n\nThe mention and references of any Apache projects, sub-projects, or resources in \nno way constitutes an endorsement for Synapticloop or the Panl project.\n\n# Want to See What it in Action?\n\nThere are now Docker images for integration between the Panl server and various \nSolr server versions, just pull the correct version and then run the image:\n\n## Solr version 9.10.0\n\n```shell\ndocker pull synapticloop/solr-panl:9-2.2.0\ndocker run -p 8181:8181 -p 8983:8983 synapticloop/solr-panl:9-2.2.0\n```\n\n## Solr version 8.11.4\n\n```shell\ndocker pull synapticloop/solr-panl:8-2.2.0\ndocker run -p 8181:8181 -p 8983:8983 synapticloop/solr-panl:8-2.2.0\n```\n\n## Solr version 7.7.3\n\n```shell\ndocker pull synapticloop/solr-panl:7-2.2.0\ndocker run -p 8181:8181 -p 8983:8983 synapticloop/solr-panl:7-2.2.0\n```\n\n_(**Note:** You don't actually need to map the `8983` port - this just makes the \nSolr administration console available if you are interested.)_\n\n# Development Information \n\n| Latest\u003cbr /\u003eRelease                                                          | Latest Book Release                                                | Development Branch\u003cbr /\u003e(name / version) | \n|------------------------------------------------------------------------------|--------------------------------------------------------------------|------------------------------------------|\n| ![GitHub Release](https://img.shields.io/github/v/release/synapticloop/panl) | Synapticloop - Getting Started With Panl version 2.2.0 (release 1) | `raspy-pine` / `?.?.?`                   |\n\n\n**Major branch release status:**\n\n| BRANCH        | STATUS                                                                                                                                                                                                                                                                  | VERSION | TYPE                                                  | LATEST SOLR\u003cbr /\u003eVERSION TESTED | Solr Download                                                            | DockerHub Link                                                             |\n|---------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------|-------------------------------------------------------|---------------------------------|--------------------------------------------------------------------------|----------------------------------------------------------------------------|\n| `raspy-pine`  | [![CircleCI](https://dl.circleci.com/status-badge/img/circleci/3Y1eqqe4mcvtSZuzJnQ3tJ/DyFKUm7c7AoLa1wHmRjAnf/tree/raspy-pine.svg?style=shield)](https://dl.circleci.com/status-badge/redirect/circleci/3Y1eqqe4mcvtSZuzJnQ3tJ/DyFKUm7c7AoLa1wHmRjAnf/tree/raspy-pine)   | `?.?.?` | Development branch - integration with Solr version 10 | **`10.x.x`** _(unavailable)_    | _(unavailable)_                                                          | _(unavailable)_                                                                           |\n| `MAIN`        | [![CircleCI](https://dl.circleci.com/status-badge/img/circleci/3Y1eqqe4mcvtSZuzJnQ3tJ/DyFKUm7c7AoLa1wHmRjAnf/tree/main.svg?style=shield)](https://dl.circleci.com/status-badge/redirect/circleci/3Y1eqqe4mcvtSZuzJnQ3tJ/DyFKUm7c7AoLa1wHmRjAnf/tree/main)               | `2.2.0` | Trunk - integration with Solr version 9               | `9.10.0`                        | [`Download Latest`](https://solr.apache.org/downloads.html)              | [`9-2.2.0`](https://hub.docker.com/layers/synapticloop/solr-panl/9-2.2.0/) |\n| `SOLR PANL 9` | [![CircleCI](https://dl.circleci.com/status-badge/img/circleci/3Y1eqqe4mcvtSZuzJnQ3tJ/DyFKUm7c7AoLa1wHmRjAnf/tree/solr-panl-9.svg?style=shield)](https://dl.circleci.com/status-badge/redirect/circleci/3Y1eqqe4mcvtSZuzJnQ3tJ/DyFKUm7c7AoLa1wHmRjAnf/tree/solr-panl-9) | `2.2.0` | Panl integration with Solr version 9                  | `9.10.0`                        | [`Download Latest`](https://solr.apache.org/downloads.html)              | [`9-2.2.0`](https://hub.docker.com/layers/synapticloop/solr-panl/9-2.2.0/) |\n| `SOLR PANL 8` | [![CircleCI](https://dl.circleci.com/status-badge/img/circleci/3Y1eqqe4mcvtSZuzJnQ3tJ/DyFKUm7c7AoLa1wHmRjAnf/tree/solr-panl-8.svg?style=shield)](https://dl.circleci.com/status-badge/redirect/circleci/3Y1eqqe4mcvtSZuzJnQ3tJ/DyFKUm7c7AoLa1wHmRjAnf/tree/solr-panl-8) | `2.2.0` | Panl integration with Solr version 8                  | `8.11.4`                        | [`Download 8.11.4`](https://archive.apache.org/dist/lucene/solr/8.11.4/) | [`8-2.2.0`](https://hub.docker.com/layers/synapticloop/solr-panl/8-2.2.0/) |\n| `SOLR PANL 7` | [![CircleCI](https://dl.circleci.com/status-badge/img/circleci/3Y1eqqe4mcvtSZuzJnQ3tJ/DyFKUm7c7AoLa1wHmRjAnf/tree/solr-panl-7.svg?style=shield)](https://dl.circleci.com/status-badge/redirect/circleci/3Y1eqqe4mcvtSZuzJnQ3tJ/DyFKUm7c7AoLa1wHmRjAnf/tree/solr-panl-7) | `2.2.0` | Panl integration with Solr version 7                  | `7.7.3`                         | [`Download 7.7.3`](https://archive.apache.org/dist/lucene/solr/7.7.3/)   | [`7-2.2.0`](https://hub.docker.com/layers/synapticloop/solr-panl/7-2.2.0/) |\n\n\u003e We _always_ recommend that you use the most recently available release which\n\u003e contains bug fixes and new functionality and is _generally_ backwards\n\u003e compatible.\n\u003e \n\u003e We do not keep previous individual Panl branches available for Solr version 8 \n\u003e and version 7 - i.e. there is no branch available for SOLR PANL 8 which \n\u003e integrates with any Panl version that is not the latest Panl release \n\u003e version.\n\u003e \n\u003e You could however, download a previous Panl version that integrates with your \n\u003e chosen Solr version from the releases page.\n\n**Branches/Release:**\n\nThis is for reference\n\n| BRANCH              | TYPE     | VERSION | GITHUB                                                                                      |\n|---------------------|----------|---------|---------------------------------------------------------------------------------------------|\n| `raspy-pine`        | `BRANCH` | `?.?.?` | [GitHub \u003e `raspy-pine`](https://github.com/synapticloop/panl/tree/raspy-pine)               |\n|                     |          |         |                                                                                             |\n| `MAIN`              | `BRANCH` | `2.2.0` | [GitHub \u003e MAIN](https://github.com/synapticloop/panl)                                       |\n|                     |          |         |                                                                                             |\n| `bitter-shadow`     | `BRANCH` | `2.2.0` | [GitHub \u003e `bitter-shadow`](https://github.com/synapticloop/panl/tree/bitter-shadow)         |\n| `hidden-summer`     | `BRANCH` | `2.1.0` | [GitHub \u003e `hidden-summer`](https://github.com/synapticloop/panl/tree/hidden-summer)         |\n| `billowing-feather` | `BRANCH` | `2.0.0` | [GitHub \u003e `billowing-feather`](https://github.com/synapticloop/panl/tree/billowing-feather) |\n\n\u003cstrong\u003eBREAKING CHANGE TO LPSE URL path part for versions below\u003c/strong\u003e\n\n| BRANCH              | TYPE     | VERSION | GITHUB                                                                              |\n|---------------------|----------|---------|-------------------------------------------------------------------------------------|\n| `needy-phantom`     | `BRANCH` | `1.2.0` | [GitHub \u003e `needy-phanton`](https://github.com/synapticloop/panl/tree/needy-phanton) |\n| `grizzled-pebble`   | `TAG`    | `1.1.1` | [GitHub \u003e Tag 1.1.1](https://github.com/synapticloop/panl/tree/1.1.1)               |\n| `broad-firefly`     | `TAG`    | `1.1.0` | [GitHub \u003e Tag 1.1.0](https://github.com/synapticloop/panl/tree/1.1.0)               |\n| `bright-wildflower` | `TAG`    | `1.0.0` | [GitHub \u003e Tag 1.1.0](https://github.com/synapticloop/panl/tree/1.0.0)               |\n\n\nThe Synapticloop Panl project uses `major.minor.micro` versioning, the meaning\nof which:\n\n- `major` - the major version will increment when there is a **BREAKING CHANGE\n  to the Panl LPSE URL**, **BREAKING CHANGE to the Panl response JSON \n  Object**, or a **MAJOR UPDATE TO SOLR** . Upon increment of the  major \n  version, both the minor and micro version number will be reset to 0 \n  (zero).\n- `minor` - the minor version will increment when there is additional\n  functionality added to the release. Upon increment of the minor version, the\n  micro number will be reset to 0 (zero).\n- `micro` - the micro version will increment for bug fixes only.\n\nThe book version matches the version of the latest Synapticloop Project version.\nAny changes to the book without any changes to the codebase will be updated on the\n`main` branch and the `ghpages` based website will be updated.\n\nAny out-of-band book updates will not be reflected in the panl code release \nupdates, however the PDF will be uploaded to the releases pages.\n\n\n# Why?\n\nBecause...\n\n`/Caran d'Ache/true/Black/bDW/`\n\nlooks **A LOT** nicer than\n\n`q=*:*\u0026facet.mincount=1\u0026rows=10\u0026facet.field=lead_size_indicator\u0026facet.field=grip_material\u0026facet.field=colours\u0026facet.field=nib_shape\u0026facet.field=diameter\u0026facet.field=cap_shape\u0026facet.field=brand\u0026facet.field=mechanism_type\u0026facet.field=length\u0026facet.field=hardness_indicator\u0026facet.field=grip_type\u0026facet.field=cap_material\u0026facet.field=lead_grade_indicator\u0026facet.field=tubing_material\u0026facet.field=in_built_sharpener\u0026facet.field=disassemble\u0026facet.field=category\u0026facet.field=body_shape\u0026facet.field=clip_material\u0026facet.field=mechanism_material\u0026facet.field=lead_length\u0026facet.field=body_material\u0026facet.field=in_built_eraser\u0026facet.field=grip_shape\u0026facet.field=relative_weight\u0026facet.field=name\u0026facet.field=nib_material\u0026facet.field=weight\u0026facet.field=variants\u0026facet=true\u0026fq=brand:\"Caran+d'Ache\"\u0026fq=disassemble:\"true\"\u0026fq=colours:\"Black\"\u0026q.op=AND`\n\n# Why Synapticloop Panl?\n\nPanl was designed to convert rather long and unfriendly (both in human-readable\nand SEO terms) to shorter, nicer, and friendlier URL paths throughout the entire\nsearch journey.\n\nWorking with a Solr schema, the Panl configuration files translate unwieldy URL\nparameters into concise and precise URL paths.\n\n- **Have SEO friendlier URL paths with much shorter URLs than traditional query\n  parameters _(throughout the complete search journey)_** - This was the primary\n  driver and the base functionality.\n\n- **Abstract away the complexities of the Solr query string** - Being able to\n  have a simple interface through the URL which could generate complex queries,\n  without having to fully understand how Solr works in the back-end.  \n  Additionally, it abstracts away the complexity of a front-end integrator \n  and reduces the need to have the back-end and front-end understand each-other.\n\n- **Be quick to start up and easy to configure** - During development of a\n  solution, being able to iterate over a solution, or change the way that Panl\n  is configured is a must-have. Additionally, being able to upgrade the Panl\n  server and have the configuration files be automatically picked up and work\n  without any changes is a plus. (On the aging Windows development \n  build machine, it takes less than a second to start...)\n\n- **Protect Solr from errant queries** - Hiding the Solr implementation details\n  from the end user and parsing, decoding, and validating the URL before passing\n  the query through to Solr. Additionally, Solr has a tendency to return an\n  internal server error when the query string is not as it expected, and this\n  should not disturb the return of the results.\n\n- **Be able to present the same Solr collection in multiple different ways** - A\n  single Solr collection should be able to serve up different fields and facets\n  from the result documents without any back-end logic.\n\n- **Have a configuration file drive the generation of the UI as much as \n  possible** - Rather than hard-coding facets and then determining how to  \n  display them, being able to have a returned JSON response which can be \n  interrogated to determine how the facets should be displayed.\n\n## Additional Panl Niceties\n\n1. **MULTIPLE ways to 'SLICE and DICE'** - From one Solr collection, the Panl\n   server can present the results and facets in multiple different ways,\n   providing individual use cases for specific needs.\n\n1. **PREFIXES and SUFFIXES** - Panl can also add prefixes and suffixes to the\n   URI path to increase readability, for example, with configuration. For the\n   example LPSE URI path of\n\n   `/Caran d'Ache/true/Black/bDW/`\n\n   could also have the brand Solr field prefixed with ‘`Manufactured By `’ and\n   suffixed by ‘` Company`’ to produce the URI path\n\n   `/Manufactured By The Caran d'Ache Company/true/Black/bDW/`\n\n1. **BOOLEAN value translations**, for any Solr field that is defined as a\n   `solr.BoolField`, then an additional translation can be performed. ‘True’ and\n   ‘False’ values can be replaced with arbitrary text, which will be\n   transparently converted between Panl and Solr. For the LPSE URI path of\n\n   `/Caran d'Ache/true/Black/bDW/`\n\n   the true value (which is defined as whether the mechanical pencil can be\n   disassembled could be changed to ‘`Able to be disassembled`’ for `true` \n   values, and ‘`Cannot be disassembled`’ for `false` values.\n\n   The above URI paths would then become\n\n   `/Caran d'Ache/Able to be disassembled/Black/bDW/`\n\n   and\n\n   `/Caran d'Ache/Cannot be disassembled/Black/bDW/`\n\n1. **BOOLEAN checkboxes** - Whilst this may seem obvious to have a checkbox for\n   a true/false value, the checkboxes work in a subtly different way.  By\n   selecting the checkbox, the only one of facet values will be selected when\n   deselected, the BOOLEAN facet is in a don't care start - the facet value can \n   be either of the values.\n\n1. **OR Facets** - Where an item has only one facet value attached to it (for \n   example a pencil will only be manufactured by one company), OR facets allow \n   you to expand the selection to choose one or more of the single-valued \n   facets.\n\n1. **CONDENSED multiple field values** - Rather than having a forward slash URL\n   path separator for multiple values of the same facet (used in OR Facets and\n   Multi-valued REGULAR facets), Panl can be configured to condense these values\n   into a single path part, saving URL characters, and reducing URL length, and\n   making the URL far more human-readable. For example, selecting pencils\n   manufactured by `Faber-Castell` **OR** `Koh-i-Noor` could have the URI path\n   of\n\n   `/Manufactured by Koh-i-Noor/Manufactured by Faber-Castell/bb/`,\n\n   with condensed multiple field values - this could be configured (with a \n   value separator configured to be `, or `) to become\n\n   `/Manufactured by Koh-i-Noor, or Faber-Castell Co./b/`\n\n   Saving 15 characters in the URL, the more multivalued fields values that \n   are selected, the more URL space is saved (In the example, with 3 values \n   selected, the saving becomes 30 characters).\n\n1. **SEARCH ALL OR SPECIFIC SOLR FIELDS** - Any Solr field that is analysed can \n   be selected to be searched on, for example, in the Bookstore Walkthrough, \n   the user can select to search within the title, the author, the description, \n   none (i.e. the default search) or all of them.  Additionally, you may choose \n   to configure the Solr query time boost to put more weight on one (or more) \n   of the fields.\n\n1. **MORE LIKE THIS** - Return 'More Like This' results from the Solr server \n   with your specific query, with the ability to configure the Solr query \n   operands on the fly.\n\n1. **FIELD VALUE validation** - By default, Solr will error (or give an \n   erroneous result) when an invalid value is passed through - for example, \n   if Solr is expecting a numeric value and it could not parse the passed in \n   value, it will throw an exception.  Panl protects against this by \n   attempting to parse the value as best it can, and silently dropping the \n   parameter if it cannot be sensibly parsed. This is done for numeric types \n   (integer, long, float, and double) and boolean values.\n\n1. **HIERARCHICAL facets** - Only show facets if a parent facet is currently\n   selected, allowing you to narrow down the facet results and lead users\n   through the search journey.\n\n1. **UNLESS facets** - Continue to show a facet unless another specified facet \n   is selected.  This can be thought of as the inverse of a hierarchical facet \n   and is useful when a facet no longer becomes relevant as the user goes \n   through the search journey.\n\n1. **SORTED facets** - Each facet can be individually configured to order \n   the facet results by either the facet count in descending order (which is \n   the default), or the facet value (e.g. alphabetic/numeric based on the \n   value of the facet - in _either_ ascending or descending).\n\n1. **MORE facets** - Solr (and Panl) configures a limit for the maximum \n   number of facet values that are returned with any query, this functionality \n   enables you  to dynamically load additional facet values if they are \n   available but weren't returned with the results by default.\n\n1. **RESULTS SORTING options** - Sort by any of the Solr fields, either\n   ascending, or descending and with multiple sub-sorting available - e.g.\n   sorting by a brand name, than the model number.  Additionally, Panl generates\n   URLs for the inverse of the sorting without impacting any sub-sorting.\n\n1. **INTEGRATED TYPEAHEAD/LOOKAHEAD** - Retrieve results suggestions as you type\n   in the query search box.\n\n1. **PAGINATION** - All the data to easily generate pagination URL paths giving\n   you options and control over your own implementation.  The returned \n   information includes:\n   1. the number of pages of results,\n   1. the number of results per page,\n   1. the total number of results,\n   1. the current page number, and\n   1. whether the returned results are an exact number.\n\n1. **STATIC SITE GENERATION** - With the exception of a query parameter, all\n   available links for every conceivable URI path can be statically generated\n   ahead of time, all with canonical URLs. Additionally, for search results\n   which do not change frequently, the Panl JSON response Object can be cached\n   for faster lookups.\n\n1. **STATELESS** - No state is stored in the Panl server, all state is from the\n   URL path part that is passed through. No sessions, no memory, nothing to\n   backup or replicate across servers, easy to update and quick to start and \n   restart.\n\n1. **CACHE-ABLE** - Unless the underlying Solr search document index changes,\n   each Solr request can be cached.\n\n1. **100% TEXT CONFIGURATION** - All configuration for Panl is based on text \n   files (Java `.properties`) files so they can be stored in a source code \n   management system.  Additionally, upgrades to the Panl server are easy - \n   just drop in the new Panl release package, use your existing \n   configuration, and it will just work.  And with quick restart times, the \n   configuration changes will be seen in an instant.\n\n\n\n# Instructions\n\n## Download the Panl Server Release\n\n1. [https://github.com/synapticloop/panl/releases](https://github.com/synapticloop/panl/releases)\n2. Read the [5-Step Quick Start section](https://github.com/synapticloop/panl/tree/main?tab=readme-ov-file#quick-start---the-5-steps)\n3. Done.\n\n## Upgrading the Panl Server Release\n\n\u003e **IMPORTANT !!!** \n\u003e \n\u003e Version 2.\\*.\\* is a breaking change with version 1.\\*.\\*,\n\u003e \n\u003e Both the LPSE URL and the JSON response have changes.\n\n\nPanl is designed to be a drop in replacement for your current version. Although\nbackwards compatibility is always the highest priority, do keep an eye out \nin the release notes for any breaking features.\n\nYour existing configuration files _should_ just work with the downloaded release\npackage.\n\n### Some important notes on upgrading\n\nWith the release of Panl version 2.1.0 the addition of the 'More Like This' \nfunctionality will require additional configuration in the `solrconfig.xml` \nfile in order for this to work.  This configuration is _not_ included by \ndefault in the Apache Solr distributions.  Unless you are starting from a \nfresh install, you _will need to reconfigure your Solr server with a new \nhandler_.\n\n## Read the Documentation\n\n- Online book (\n  HTML): [https://synapticloop.github.io/panl/](https://synapticloop.github.io/panl/)\n- Offline book (\n  PDF): [Getting Started With Synapticloop Panl.pdf](https://github.com/synapticloop/panl/blob/main/src/dist/book/Getting%20Started%20With%20Synapticloop%20Panl.pdf)\n  _(over 600 pages of documentation, written with you, the integrator, in \n  mind)_\n\nBoth of the book links above refer to Solr Panl integration 9 with instructions\nfor setting up and running earlier versions of Solr.\n\n\n# Getting up to Speed... Fast!\n\n_If you have docker and want to look at Panl:_\n\n```\ndocker pull synapticloop/solr-panl:9-2.2.0\n```\n\nRun the image and point your browser to \n[http://localhost:8181/panl-results-viewer](http://localhost:8181/panl-results-viewer)\n\nThe Solr Panl release package was designed to get you up and running as quickly\nas possible.\n\nWith the in-built tool, point it at your existing Solr `managed-schema.xml`\nfile, run the Panl server and view the results. From there you can tweak the\nconfiguration, generate new configurations and see your results in an instant.\n\n## The Panl Results Viewer Web App\n\n\u003cimg src=\"src/docs/panl-features.png\" alt=\"The Panl Features\" /\u003e\n\n_**Image**: The features and functionality of the Panl Simple Results Viewer Web\nApp_\n\n_The image is a screenshot of the in-built Panl Results Viewer Web App available\nin the release package, and whilst not intended as a production search page, can\nbe used to fine-tune the configuration, or just to have a quick overview of the\nresults._\n\n1. **A list of available Collections and FieldSet URI Paths (CaFUPs)** that Panl\n   is configured to serve. CaFUPs enable different Solr fields to be returned in\n   the documents with the same search parameters.\n\n1. **A textual representation of the CaFUPs** that the Panl Results Viewer web\n   app is using.\n\n1. **The canonical URI path** (which is returned with the Panl results JSON\n   object) - this is important as multiple Panl LPSE URI paths will return\n   exactly the same results - this is the unique URI path for this result set\n   and necessary for de-duplicating the search engine results. This also\n   includes a link to the Panl Results Explainer web app.\n\n1. **The search query box**, by default, Panl responds to the same parameter\n   name as The Solr server - i.e. 'q'. This can be configured to be a different\n   value should you choose.\n\n   **Specific Search Fields (not shown)** If multiple fields are configured \n   to be searchable, display the fields that are available to search within, and\n   allow the user to select within the field.\n\n   \u003cimg src=\"src/docs/specific-search-fields.png\" \u003e\n\n   **Integrated Lookahead (not shown)** If multiple fields are configured\n   to be searchable, display the fields that are available to search within, and\n   allow the user to select within the field.\n\n   \u003cimg src=\"src/docs/lookahead.png\" \u003e\n\n1. **Active filters** - either queries or any of the selected facets that have\n   been used to refine the search results.\n\n1. **Active BOOLEAN filters** - if the selected facet is a BOOLEAN facet (i.e.\n   either true/false) then a link (\u003cimg src=\"src/main/resources/webapp/static/invert.png\" alt=\"invert\" /\u003e) \n   can be included to invert this selection (i.e. change the value from true if \n   currently false and vice versa).\n\n1. **Active sorting** - sorting options that are currently ordering the\n   results - the \u003cimg src=\"src/main/resources/webapp/static/remove.png\" alt=\"remove\" /\u003e link \n   is the URI path that will remove this query, facet,\n   or sorting option from the results. If it is an active sorting filter, the\n   \u003cimg src=\"src/main/resources/webapp/static/invert.png\" alt=\"invert\" /\u003e \n   `Change to DESC` or \u003cimg src=\"src/main/resources/webapp/static/invert.png\" alt=\"invert\" /\u003e \n   `Change to ASC` links will invert the sorting order without affecting any \n   further sub-ordering.\n\n1. **BOOLEAN Checkboxes** - any facets that have been defined as BOOLEAN \n   checkboxes, which allows the integrator to highlight one of the values \n   (either true or false).\n\n1. **RANGE filters** - for facets that are defined as ranges - allowing\n   end-users to select a range of values - the values are inclusive (i.e.\n   include the minimum and maximum values).\n\n   **DATE Range filters (not shown)** - Enabling searching on a range of dates \n   (but not a specific date) in the form of:\n   next/previous \u003cany_integer\u003e hours/days/months/years.\n    - For example:\n      - Last 30 days\n      - Previous 24 hours\n\n1. **Available filters** - additional facets that can further refine and limit\n   the Solr search results.  These facets can be sorted by the count \n   descending (which is the default) and also by the index (or value) either \n   ascending or descending. This may also display a link to load more facets if \n   the returned number of facets is not the complete set.\n\n1. **Number of results found**, and whether this is an exact match.\n\n1. **Query operand** - whether the query is OR, or AND, this affects the search\n   query, not the faceting - i.e. the Solr server q.op parameter.\n\n1. **Page information**, the number of pages, how many results are shown per\n   page, and how many results are shown on this page.\n\n1. **Sorting options** - Whether to sort by relevance (the default) or by other\n   configured sorting options with ascending and descending options available.\n   Any Solr field can be configured to be used as a sorting option. And\n   multi-sort orders are available, allowing sorting on more than one field.\n\n1. **Pagination options** - the Panl server returns all information needed to\n   build a pagination system, number of results, number of results shown per\n   page and the current page number.\n\n1. **Number of results per page**. Able to dynamically set the number of results\n   to return for the query. **Note:** In the above image, the values 3, 5, 10\n   are just examples - this can be set to any positive integer number.\n\n1. **Timing information** about how long the Panl server took to build and\n   return the results (including how much time the Solr server took to find and\n   return the results).\n\n1. **The results** - the fields that are returned with the documents and are\n   shown in the results sections which are configured by the CaFUPs. Multiple\n   field sets can be configured for the collection.\n\n## The Panl Results Explainer Web App\n\n\u003cimg src=\"src/docs/panl-results-explainer.png\" alt=\"The In-Built Panl Results Explainer\" /\u003e\n\n_**Image**: The features and functionality of the Panl results explainer_\n\n_The image is a screenshot of the in-built Panl Results Explainer Web App\navailable in the release package, and whilst not intended as a production search\npage, can be used to look into, troubleshoot, and fine-tune the configuration._\n\n1. **A list of available Collections and FieldSet URI Paths (CaFUPs)** that Panl\n   is configured to serve. CaFUPs enable different Solr fields to be returned in\n   the documents with the same search parameters.\n1. **A textual representation of the CaFUPs** that the Panl Results Viewer web\n   app is using.\n1. **The canonical URI path entry field** allows you to enter any canonical URI\n   path and have the parsing and tokenising explained to you, including whether\n   the parsed token was valid, the LPSE code found and the original value that\n   Panl attempted to decode.\n1. **The request token explainer** - for any canonical URI entered, this will\n   list the parsing and decoding steps, with the following details\n    1. Whether the token is valid (if it is invalid, it will be ignored and not\n       passed through to the Solr search server),\n    1. The type of token that was found,\n    1. The LPSE code,\n    1. The parsed value,\n    1. The original value, and\n    1. Where pertinent, additional information pertaining to the specific code.\n1. **Configuration parameters** - parameters that are not fields or facets with\n   information about the value, a description, and the property that set the\n   value.\n1. **Field configuration explainer** - for each of the fields or facets that are\n   configured in the LPSE order an explanation of their configuration including:\n    1. The type of Java field type,\n    1. The LPSE code,\n    1. The Solr field name,\n    1. The Solr field type, the Panl field name, and\n    1. Additional configuration items which may include Prefixes, Suffixes,\n       Ranges, Facet type, or Minimum/maximum values\n    1. **Any configuration warning messages** that were found whilst parsing the\n       properties files.\n\n## The Panl Single Page Search Web App\n\n\u003cimg src=\"src/docs/panl-single-page-search.png\" alt=\"The Panl Example Single Search Page interface\" /\u003e\n\n_**Image**: The In-Built Panl Single Page Search Web Application_\n\nPanl also ships with a URL that will provide a separate JSON response, allowing\nyou to build a single page search interface, giving your users all the options\nat a glance.\n\n1. A list of available Collections URI Paths for each available single page\n   search interface.\n1. The generated Panl LPSE path from the selections.\n1. All the facets and the facet values that can be selected.\n1. The generated Panl LPSE path from the selections.\n1. A search button that will take you the in-built Panl Results Viewer web app\n   so that you can view the results instantly.\n\n\n\n\n# Quick Start - The 5 Steps\n\nAt the end of this chapter, you will have a web page up and running with the\nmechanical-pencils collection indexed and ready to sort and facet on the URL:\nhttp://localhost:8181/panl-results-viewer/\n\n\n\u003cimg src=\"src/docs/panl-results-viewer.png\" alt=\"The Panl In-Built Simple Results Viewer\" /\u003e\n\n_**Image**: The In-Built Panl Results Viewer Web Application_\n\n## 0. Download and Extract the Solr and Panl Packages\n\nDownload the latest release of Synapticloop Panl\n\n[https://github.com/synapticloop/panl/releases](https://github.com/synapticloop/panl/releases)\n\nDownload the latest version of Apache Solr - this book is using the `9.10.0-slim`\nversion\n\n[https://solr.apache.org/downloads.html](https://solr.apache.org/downloads.html)\n\n**A Note On Running The Commands**\n\n*These are the commands for either Microsoft Windows or *NIX operating systems\n(Linux/Apple Macintosh). Should there be any errors - see the ‘Getting Started’\nsection for a more in-depth explanation and approach.**\n\n---\n\n\u003e **WARNING:** The Solr Release version before `9.8.0` has different command \n\u003e line options for creating a new example cloud.  For these versions the \n\u003e command line option should be `-noprompt` rather than `--no-prompt`.\n\u003e \n\u003e Additionally, when creating the collection, the options should be changed \n\u003e from `--shards` to `-s`.\n\u003e\n\u003e All other commands remain the same\n\n---\n\n```\n**IMPORTANT**: You will need to replace the\n\nSOLR_INSTALL_DIRECTORY\n\n  and\n\nPANL_INSTALL_DIRECTORY\n\nreferences in the commands for your particular setup.\n```\n\nExtract both the packages, either through the command line, or with a GUI utility.  For the examples in this section, the Panl server was extracted to:\n\n`\\java-servers\\solr-panl-9-2.2.0\\` (labeled as `PANL_INSTALL_DIRECTORY`)\n\nAnd\n\n`\\java-servers\\solr.10.0-slim\\` (labeled as `SOLR_INSTALL_DIRECTORY`)\n\n# Windows Commands\n\n```\n**IMPORTANT**: Each of the commands - either Windows or *NIX must be run on a\n single line - watch out for continuations.\n```\n\n## 1. Create an example cloud instance\n\nThis requires no interaction, will use the default setup, two replicas, and two\nshards under the 'example' cloud node.\n\nCommand(s)\n\n```shell\ncd SOLR_INSTALL_DIRECTORY\n\nbin\\solr start -e cloud --no-prompt\n```\n\n## 2. Create the mechanical pencils collection\n\nThis will set up the mechanical pencil collection and schema so that the data\ncan be indexed.\nCommand(s)\n\n```shell\ncd SOLR_INSTALL_DIRECTORY\n\nbin\\solr create -c mechanical-pencils -d PANL_INSTALL_DIRECTORY\\sample\\solr\\mechanical-pencils\\ --shards 2 -rf 2\n```\n\n## 3. Index the mechanical pencils data\n\nThis will index all mechanical pencil data into the Solr instance.\nCommand(s)\n\n```shell\ncd SOLR_INSTALL_DIRECTORY\n\nbin\\solr post -c mechanical-pencils PANL_INSTALL_DIRECTORY\\sample\\data\\mechanical-pencils.json\n```\n\n## 4. Start the Panl server\n\nThis will start the server and be ready to accept requests.\nCommand(s)\n\n```shell\ncd PANL_INSTALL_DIRECTORY\n\nbin\\panl.bat -properties PANL_INSTALL_DIRECTORY\\sample\\panl\\mechanical-properties\\panl.properties\n```\n\n## 5. Start searching and faceting\n\nOpen [http://localhost:8181/panl-results-viewer/](http://localhost:8181/panl-results-viewer/)\nin your favourite browser.\n\nChoose a collection/fieldset and search, facet, sort, paginate and view the\nresults\n\n# *NIX Commands\n\n```\n**IMPORTANT**: Each of the commands - either Windows or *NIX must be run on\n a single line - watch out for continuations.\n```\n\n## 1. Create an example cloud instance\n\nNo prompting, default setup, two replicas, and two shards under the 'example'\ncloud node.\nCommand(s)\n\n```shell\ncd SOLR_INSTALL_DIRECTORY\n\nbin/solr start -e cloud -noprompt\n```\n\n## 2. Create the mechanical pencils collection\n\nSet up the schema so that the data can be indexed.\nCommand(s)\n\n```shell\ncd SOLR_INSTALL_DIRECTORY\n\nbin/solr create -c mechanical-pencils -d PANL_INSTALL_DIRECTORY/sample/solr/mechanical-pencils/ --shards 2 -rf 2\n```\n\n## 3. Index the mechanical pencils data\n\nIndex all of the data into the Solr instance\nCommand(s)\n\n```shell\ncd SOLR_INSTALL_DIRECTORY\n\nbin/solr post -c mechanical-pencils PANL_INSTALL_DIRECTORY/sample/data/mechanical-pencils.json\n```\n\n## 4. Start the Panl server\n\nReady to go.\nCommand(s)\n\n```shell\ncd PANL_INSTALL_DIRECTORY\n\nbin/panl -properties PANL_INSTALL_DIRECTORY/sample/panl/mechanical-properties/panl.properties\n```\n\nView the in-built Panl Results Viewer web application\n\n## 5. Start searching and faceting\n\nOpen [http://localhost:8181/panl-results-viewer/](http://localhost:8181/panl-results-viewer/)\nin your favourite browser.\n\nChoose a collection/fieldset and search, facet, sort, paginate and view the\nresults.\n\n# Build/Development Related Tasks\n\nSee the `DEV-PROCESS.md` file in this repository for building and testing\nthe code.\n\n## Building the Code\n\nThis will build, test, and assemble the distributable\n\n### _Windows_\n\n```shell\ngradlew.bat build\n```\n\n### _*NIX_\n\n```shell\n./gradlew build\n```\n\n## Assembling the Distributable\n\nThis will assemble the distribution\n\n### _Windows_\n\n```shell\ngradlew.bat assemble\n```\n\n### _*NIX_\n\n```shell\n./gradlew assemble\n```\n\nThe distributions (both a `.zip` and a `.tar` file) will be created in the build\ndistributions directory.\n\nI.e.\n\n- `./build/distributions` (*NIX), or\n- `.\\build\\distributions` (Windows)\n\nwith the release files named `solr-panl-9-x.x.x` where `x.x.x` is the version\nnumber.\n\n# Quick Info\n\n## Starting up the example cloud\n\n\u003e **WARNING:** The Solr Release version `9.7.0` has changed the options for\n\u003e starting a new example cloud.\n\u003e The command line option has changed from `-cloud` to `--cloud`\n\n\u003e All other commands remain the same - For versions greater than `9.7.0` they\n\u003e have re-added the `-cloud` option\n\nIf you have stopped the example Solr server, starting it up:\n\n### _Windows_\n\n```shell\ncd SOLR_INSTALL_DIRECTORY\nbin\\solr start -cloud -p 8983 -s \"example\\cloud\\node1\\solr\"\nbin\\solr start -cloud -p 7574 -s \"example\\cloud\\node2\\solr\" -z localhost:9983\n```\n\n### _*NIX_\n\n```shell\ncd SOLR_INSTALL_DIRECTORY\nbin/solr start -cloud -p 8983 -s \"example/cloud/node1/solr\"\nbin/solr start -cloud -p 7574 -s \"example/cloud/node2/solr\" -z localhost:9983\n```\n\n## Docker Building\n\nThere is an in-built task to build a docker container in gradle which will work\nwith either Microsoft Windows and *NIX operating systems.  The docker image \ncontains all data (i.e. mechanical pencils, book store, and the simple date) \nindexed in Solr and ready to go.  \n\n### _ANY OS - WINDOWS/*NIX_\n\n```shell\ngradlew docker\n```\n\n---\n\nAnd to run the container\n\n### _ANY OS - WINDOWS/*NIX_\n\n```shell\ndocker run -p 8181:8181 -p 8983:8983 synapticloop/solr-panl:9-2.2.0\n```\n\n_**NOTE:** You do not need to pass through the `-p 8983:8983` command line \nargument if you do not need to view the underlying Solr server._ \n\nThis will expose the ports for both the Panl server (port 8181) and the Solr \nserver (port 8983) so that it can be viewed:\n\n - SOLR: [http://localhost:8983/solr/](http://localhost:8983/solr/)\n - PANL: [http://localhost:8181/panl-results-viewer/](http://localhost:8181/panl-results-viewer/)\n\n\n# Version History\n\n## ?.?.? _Untitled_ (codename `raspy-pine` UNDER DEVELOPMENT)\n\n## 2.2.0 Internal Harnesses (codename `bitter-shadow`)\n\n- **New Features**\n  - Changed the docker image to include all datasets\n  - Pushed the docker image to docker hub - this is a testing image only - i.e. \n    it contains all test data indexed and ready to be browsed.\n  - Added in `--no-prompt` option to generator to accept in-built defaults\n  - Added in a `help` command line argument (which is not particularly needed)\n\n\n- **Bug Fixes**\n  - Fixed decoding of UTF-8 LPSE codes\n  - Fixed bug with the query operand being passed through the URL not being \n    picked up.\n\n\n- **Code Changes**\n  - Updated the usage text to be context specific, made the look and feel of \n    the output a little clearer\n  - Updated both the `panl.properties`  file and \n    `\u003cpanl_collection_url\u003e.panl.properties` template files and merged them with \n    the associated sample files.\n  - No longer request the unique key from Solr as a facet field unless it is \n    specifically requested in the Panl LPSE URL path (this reduces the \n    payload that is returned from Solr)\n  - Added `panl.lpse.ignore` replacement key in the template to \n    automatically add in the Solr uniqueKey field.\n  - Minor error outputting formatting changes\n\n\n- **Documentation Update**\n  - Rewrote documentation to be a little clearer and removed extraneous \n    information \n  - Added in missed `panl.uniquekey.\u003clpse_code\u003e` to the documentation\n\n`!! The included PDF contains over **600** pages of documentation for every \npart of the Panl server. !!`\n\n[View the code for this release](https://github.com/synapticloop/panl/tree/2.2.0)\n\n[Download the release packages](https://github.com/synapticloop/panl/releases/tag/2.2.0)\n\n[See all releases](https://github.com/synapticloop/panl/releases/)\n\n\n| Release\u003cbr /\u003eNumber | Short note             | Codename              | Release Date         | \n|---------------------|------------------------|-----------------------|----------------------|\n| 2.2.0               | mMm harnesses          | `bitter-shadow`       | `November  23, 2025` |\n| 2.1.0               | niceties/want-it-ies   | `hidden-summer`       | `July      28, 2025` |\n| 2.0.0               | fluffy stuff           | `billowing-feather`   | `February  28, 2025` |\n| `-breaking-change-` | `--------------------` | `-------------------` | `------------------` |\n| 1.2.0               | more like this         | `needy-phanton`       | `October   30, 2024` |\n| 1.1.1               | the fly spray          | `grizzled-pebble`     | `September 24, 2024` |\n| 1.1.0               | the better update      | `broad-firefly`       | `September 19, 2024` |\n| 1.0.0               | the initial release    | `bright-wildflower`   | `September 04, 2024` |\n\nFor full release notes for previous versions, see the [releases page](https://github.com/synapticloop/panl/releases/).\n\n\n# End Plate \n\n```\n# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #\n#                                        __                                   #\n#                          .-----.-----.|  |.----.                            #\n#                          |__ --|  _  ||  ||   _|                            #\n#                          |_.-----.-----.--.--|  |                           #\n#                            |  _  |  _  |     |  |                           #\n#                            |   __|___._|__|__|__|                           #\n#                            |__|     ... .-..                                #\n#                                                                             #\n#                                ~ ~ ~ * ~ ~ ~                                #\n#                                                                             #\n#                                                                             #\n#                                  SOLR/PANL                                  #\n#                                                                             #\n#                                  ---------                                  #\n#                                                                             #\n# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #\n\n                         \"Parting is such sweet sorrow\"\n\n                                                               Romeo And Juliet \n                                                                         Act 2, \n                                                                       Scene 2, \n                                                                       176–185\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsynapticloop%2Fpanl","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsynapticloop%2Fpanl","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsynapticloop%2Fpanl/lists"}