{"id":19427268,"url":"https://github.com/theasp/lapidary","last_synced_at":"2026-05-15T00:40:34.671Z","repository":{"id":81613341,"uuid":"125137876","full_name":"theasp/lapidary","owner":"theasp","description":"Search engine for logs stored in PostgreSQL","archived":false,"fork":false,"pushed_at":"2019-02-07T15:01:28.000Z","size":584,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-01-07T19:42:07.489Z","etag":null,"topics":["clojurescript","fluentd","logging","macchiato","postgres","postgresql"],"latest_commit_sha":null,"homepage":null,"language":"Clojure","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/theasp.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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}},"created_at":"2018-03-14T01:35:38.000Z","updated_at":"2023-08-03T23:23:39.000Z","dependencies_parsed_at":"2023-03-06T16:30:31.149Z","dependency_job_id":null,"html_url":"https://github.com/theasp/lapidary","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/theasp%2Flapidary","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/theasp%2Flapidary/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/theasp%2Flapidary/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/theasp%2Flapidary/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/theasp","download_url":"https://codeload.github.com/theasp/lapidary/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":240605918,"owners_count":19827995,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["clojurescript","fluentd","logging","macchiato","postgres","postgresql"],"created_at":"2024-11-10T14:11:07.028Z","updated_at":"2026-05-15T00:40:34.628Z","avatar_url":"https://github.com/theasp.png","language":"Clojure","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Lapidary\n\nA search engine for structured data using Postgres, with a similar syntax to Apache Lucene.  This is intended for small to medium sized centralized logging configurations.\n\nPull requests welcome, especially documentation!\n\n[![CircleCI](https://circleci.com/gh/theasp/lapidary.svg?style=svg)](https://circleci.com/gh/theasp/lapidary)\n\n## Features\n\n* Data is stored as JSON in PostgreSQL\n* Lucene like search syntax\n* Full text search\n\n## Screenshots\n\n### Tables\n![Tables](screenshots/tables.png)\n\n### Query\n![Query](screenshots/query.png)\n\n## Installation\n\n### Docker\n\nUsing the [docker-compose.yml](docker-compose.yml) file from the repository, run:\n```\ndocker-compose up\n```\n\nThis will start PostgreSQL, Lapidary and fluentd.  You can log into Lapidary at http://localhost:8081 using the username admin and the password \"ChangeMe!\".  Fluentd is listening on 24230 for forward connections, and 5145 for syslog.\n\nYou can log a message using:\n```\nlogger -n localhost -P 5145 \"Hello Lapidary!\"\n```\n\n## Configuration\n\n## Reference\n\n### Query String\n\nQuerying the database is loosely based on Lucene syntax, though grouping is done in a more lisp like style.\n\nThe query consists fields to search, and the values to search for. If your value contains whitespace, you can wrap it in quotation marks.  For example, to find all records which contain the word `fail` in the `message` field, you could use:\n```\nmessage:fail\n```\n\nBy default, each field you search is joined together logically using `or`, so the following will find records which have `fail` or `ssh` in the `message field:\n```\nmessage:fail message:ssh\n```\n\nThis could also be written using a list of acceptable values:\n```\nmessage:(fail ssh)\n```\n\nYou can build more complex searches using `and` and `or`, with `or` being the default, so that the above search will logically expand to be:\n```\n(or message:fail message:ssh)\n```\n\nIf you were looking for records that match both `fail` and `ssh`:\n```\n(and message:fail message:ssh)\n```\n\nA term can be negated by prepending it with `!`:, so to find records with `fail` and `ssh`, but not `mysql` in `message`, you could use:\n```\n(and message:fail message:ssh !message:mysql)\n```\n\nYou can specify a comparison operator, using one of `\u003c`, `\u003c=`, `\u003e`, `\u003e=`, `=`, `!=`.  For example, to find records with `OriginStatus` between 400 and 499, you could use:\n```\n(and OriginStatus:\u003e=400 OriginStatus:\u003c=499)\n```\n\nFor `=` and `!=` the value will be matched exactly.  For example, to match records with a `RequestMethod` of `POST` but not `POSTAL`, you can use:\n```\nRequestMethod:=POST\n```\n\nAddtionally, there are regex operators of `~` for a case sensitve regex, `~*` for a case insensntive regex, and the negative form of both using `!~` or `!~*`.  If you want to match the regex `/sockjs/.*/websocket$` in a `RequestPath` field, you could use:\n```\nRequestPath:~\"sockjs/.*/websocket$\"\n```\n\nThe comparison operators can also be used in a list:\n```\nRequestMethod:(=POST =HEAD)\n```\n\nAs an alternative to using `and`, you can use a range of values with `[]` used to signify both ends of the range being inclusive, `{}` for exclusive, and `[}` or `{]` as a mix of both.  The values are seperated using either `..` or ` to `.  For `OriginStatus` between 400 and 499, you could use:\n```\nOriginStatus:[400 to 499]\n```\n\nOr, for the same effect:\n```\nOriginStatus:[400..500}\n```\n\n### API\n\nTODO: Currently not available\n\n## Project Roadmap\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftheasp%2Flapidary","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftheasp%2Flapidary","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftheasp%2Flapidary/lists"}