{"id":13825218,"url":"https://github.com/clear-code/redmine_full_text_search","last_synced_at":"2026-02-03T18:44:33.775Z","repository":{"id":49729972,"uuid":"54269052","full_name":"clear-code/redmine_full_text_search","owner":"clear-code","description":"Full text search for Redmine","archived":false,"fork":false,"pushed_at":"2025-11-24T23:23:08.000Z","size":2572,"stargazers_count":68,"open_issues_count":10,"forks_count":24,"subscribers_count":15,"default_branch":"master","last_synced_at":"2025-11-28T09:54:08.974Z","etag":null,"topics":["full-text-search","groonga","mroonga","pgroonga","redmine","redmine-plugin"],"latest_commit_sha":null,"homepage":null,"language":"Ruby","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/clear-code.png","metadata":{"files":{"readme":"README.md","changelog":"NEWS.md","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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2016-03-19T14:06:30.000Z","updated_at":"2025-11-24T23:23:11.000Z","dependencies_parsed_at":"2023-12-21T08:26:00.797Z","dependency_job_id":"4aed6f9a-2798-4a62-8d36-f19257e9d043","html_url":"https://github.com/clear-code/redmine_full_text_search","commit_stats":null,"previous_names":[],"tags_count":27,"template":false,"template_full_name":null,"purl":"pkg:github/clear-code/redmine_full_text_search","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/clear-code%2Fredmine_full_text_search","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/clear-code%2Fredmine_full_text_search/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/clear-code%2Fredmine_full_text_search/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/clear-code%2Fredmine_full_text_search/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/clear-code","download_url":"https://codeload.github.com/clear-code/redmine_full_text_search/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/clear-code%2Fredmine_full_text_search/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29053302,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-03T15:43:47.601Z","status":"ssl_error","status_checked_at":"2026-02-03T15:43:46.709Z","response_time":96,"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":["full-text-search","groonga","mroonga","pgroonga","redmine","redmine-plugin"],"created_at":"2024-08-04T09:01:16.743Z","updated_at":"2026-02-03T18:44:33.767Z","avatar_url":"https://github.com/clear-code.png","language":"Ruby","funding_links":[],"categories":["Ruby"],"sub_categories":[],"readme":"# Full text search plugin\n\nThis plugin provides the following features:\n\n* Fast and rich full text search to Redmine\n* Display similar issues on an issue page\n\n## Requirements\n\n* [Mroonga](https://mroonga.org/) or\n  [PGroonga](https://pgroonga.github.io/): RDBMS plugins for full text search.\n\nIf you're using MySQL or MariaDB, you need Mroonga 9.03 or later.\n\nIf you're using PostgreSQL, you need PGroonga 2.2.0 or later.\n\nMroonga and PGroonga uses Groonga as full text search engine. You need\nGroonga 9.0.3 or later.\n\n### Optional requirements\n\n* ChupaText server: Text extractor server.\n\n## How to use\n\n### Install PGroonga or Mroonga\n\nSee [PGroonga document](https://pgroonga.github.io/install/)\n\nSee [Mroonga document](https://mroonga.org/docs/install.html)\n\n### Install ChupaText server (optional)\n\nYou can choose one of them to install ChupaText:\n\n1. Use [chupa-text-docker](https://github.com/ranguba/chupa-text-docker)\n2. Use [chupa-text-vagrant](https://github.com/ranguba/chupa-text-vagrant)\n3. Use [chupa-text-http-server](https://github.com/ranguba/chupa-text-http-server)\n\nchupa-text-docker is recommended. See [chupa-text-docker\ndocument](https://github.com/ranguba/chupa-text-docker/blob/master/README.md)\nto install chupa-text-docker.\n\nSee [chupa-text-vagrant\ndocument](https://github.com/ranguba/chupa-text-vagrant/blob/master/README.md)\nto install chupa-text-vagrant.\n\nchupa-text-http-server is a normal [Ruby on\nRails](https://rubyonrails.org/) application like Redmine itself. You\ncan deploy chupa-text-http-server as a normal Ruby on Rails\napplication.\n\n### Install this plugin\n\n```console\n$ cd redmine\n$ git clone https://github.com/clear-code/redmine_full_text_search.git plugins/full_text_search\n$ bundle install\n$ RAILS_ENV=production bin/rails redmine:plugins:migrate\n```\n\nRestart Redmine.\n\n**NOTE** for PGroonga:\n\nIf you use normal user for Redmine. You must run the following query\nas a super user before run `RAILS_ENV=production bin/rails\nredmine:plugins:migrate`:\n\n```sql\nCREATE EXTENSION IF NOT EXISTS pgroonga;\n```\n\n### Configure this plugin\n\nOpen https://YOUR_REDMINE_SERVER/settings/plugin/full_text_search and\nconfigure items in the page. If you install ChupaText server, you must\nconfigure \"ChupaText server URL\". If you install your ChupaText server\nby chupa-text-docker or chupa-text-vagrant on the same host, it's\n`http://127.0.0.1:20080/extraction.json`.\n\n### Synchronize data\n\nYou need to create index for existing data. You need to run\n`full_text_search:synchronize` task until no more synchronize target\ndata.\n\n```console\n$ cd redmine\n$ RAILS_ENV=production bin/rails full_text_search:synchronize\n$ RAILS_ENV=production bin/rails full_text_search:synchronize\n$ RAILS_ENV=production bin/rails full_text_search:synchronize\n...\n```\n\n### Synchronize query expansion list\n\nThis plugin supports query expansion. You can use this feature to\nimplement synonym search.\n\nYou can administrate query expansion list by Web UI in administration\npage or data file.\n\nYou can use the following format for data file:\n\n  * CSV\n  * JSON\n\nIf you use CSV, use the following format:\n\n```csv\nSOURCE1,DESTINATION1\nSOURCE2,DESTINATION2\n...\n```\n\nExample:\n\n```csv\nMySQL,MySQL\nMySQL,MariaDB\nMariaDB,MySQL\nMariaDB,MariaDB\n```\n\nIf you use JSON, use one of the following formats:\n\n```json\n[\n[\"SOURCE1\", \"DESTINATION1\"],\n[\"SOURCE2\", \"DESTINATION2\"],\n...\n]\n```\n\n```json\n[\n{\"source\": \"SOURCE1\", \"destination\": \"DESTINATION1\"},\n{\"source\": \"SOURCE2\", \"destination\": \"DESTINATION2\"},\n...\n]\n```\n\nExamples:\n\n```json\n[\n[\"MySQL\",   \"MySQL\"],\n[\"MySQL\",   \"MariaDB\"],\n[\"MariaDB\", \"MySQL\"],\n[\"MariaDB\", \"MariaDB\"]\n]\n```\n\n```json\n[\n{\"source\": \"MySQL\",   \"destination\": \"MySQL\"},\n{\"source\": \"MySQL\",   \"destination\": \"MariaDB\"},\n{\"source\": \"MariaDB\", \"destination\": \"MySQL\"},\n{\"source\": \"MariaDB\", \"destination\": \"MariaDB\"}\n]\n```\n\nYou can synchronize query expansion list with the data file by the\nfollowing command:\n\n```console\n$ cd redmine\n$ RAILS_ENV=production bin/rails full_text_search:query_expansion:synchronize INPUT=query-expansion.csv\n```\n\nYou can confirm the current query expansion list in administration\npage.\n\n## How to recover broken database\n\n### Mroonga\n\nMroonga isn't crash safe. If MySQL is crashed while updating data in\nMroonga, Mroonga data may be broken.\n\nHere is the instruction to recover from broken Mroonga data.\n\nIf you're using [Redmine plugin Delayed\nJob](https://gitlab.com/clear-code/redmine-plugin-delayed-job), you\nneed to stop workers and delete jobs for this plugin:\n\n```console\n$ sudo -H systemctl stop redmine-delayed-job@0.service\n$ cd redmine\n$ RAILS_ENV=production bin/rails runner 'Delayed::Job.where(queue: \"full_text_search\").delete_all'\n```\n\nStop MySQL:\n\n```console\n$ sudo -H systemctl stop mysqld\n```\n\nRemove Mroonga related files:\n\n```console\n$ cd redmine\n$ database_name=$(RAILS_ENV=production bin/rails runner 'puts ActiveRecord::Base.configurations[Rails.env][\"database\"]')\n$ sudo -H sh -c \"rm -rf /var/lib/mysql/${database_name}.mrn*\"\n```\n\nStart MySQL:\n\n```console\n$ sudo -H systemctl start mysqld\n```\n\nCheck that Mroonga has been properly installed based on [the Mroonga\nmanual](https://mroonga.org/docs/tutorial/installation_check.html). If\nMroonga isn't installed, install Mroonga like the following:\n\n```console\n$ mysql -u root -p \u003c /usr/share/mroonga/install.sql\n```\n\nDestruct tables explicitly for this plugin:\n\n```console\n$ mysql -u root -p ${database_name}\n\u003e DROP TABLE IF EXISTS fts_query_expansions;\n\u003e DROP TABLE IF EXISTS fts_targets;\n\u003e DROP TABLE IF EXISTS fts_tags;\n\u003e DROP TABLE IF EXISTS fts_tag_types;\n\u003e DROP TABLE IF EXISTS fts_types;\n```\n\nRecreate schema for this plugin:\n\n```console\n$ cd redmine\n$ RAILS_ENV=production bin/rails redmine:plugins:migrate NAME=full_text_search VERSION=0\n$ RAILS_ENV=production bin/rails redmine:plugins:migrate NAME=full_text_search\n```\n\nIf you're using [Redmine plugin Delayed\nJob](https://gitlab.com/clear-code/redmine-plugin-delayed-job), you\nneed to start workers:\n\n```console\n$ sudo -H systemctl start redmine-delayed-job@0.service\n```\n\nSynchronize:\n\n```console\n$ cd redmine\n$ RAILS_ENV=production bin/rails full_text_search:synchronize UPSERT=later\n```\n\n## How to develop\n\n### Preparation\n\nHere are some useful tools to prepare:\n\n  * `dev/run-mysql.sh` and `dev/run-postgresql.sh`: Run new RDBMS\n    instance by Docker.\n  * `dev/initialize-redmine.sh`: Initialize Redmine.\n  * `dev/run-test.sh`: Run tests for the full text search plugin.\n\nClone source codes. This is required only once.\n\n```console\n$ git clone https://github.com/redmine/redmine.git\n$ cd redmine\n$ git checkout 6.1-stable # or something\n$ git clone git@github.com:${YOUR_FORK}/redmine_full_text_search.git plugins/full_text_search\n```\n\nYou can add more plugins to `plugins/`.\n\nChoose suitable database configuration:\n\n```console\n$ ln -fs ../plugins/full_text_search/config/database.yml.example.${REDMINE_VERSION}.${RDBMS} config/database.yml\n```\n\nHere is an example to use Redmine 6.1 and MySQL:\n\n```console\n$ ln -fs ../plugins/full_text_search/config/database.yml.example.6.1.mysql config/database.yml\n```\n\nRun RDBMS.\n\nFor MySQL:\n\n```console\n$ plugins/full_text_search/dev/run-mysql.sh /tmp/mysql\n```\n\nFor PostgreSQL:\n\n```console\n$ plugins/full_text_search/dev/run-postgresql.sh /tmp/postgresql\n```\n\nInitialize Redmine:\n\n```console\n$ plugins/full_text_search/dev/initialize-redmine.sh\n```\n\nRun tests:\n\n```console\n$ plugins/full_text_search/dev/run-test.sh\n```\n\n### How to add a new search target\n\nYou need to create mapper classes for each search target. See\n`lib/full_text_search/*_mapper.rb` for details.\n\nYou need to add `require_dependency \"full_text_search/XXX_mapper` to\n`init.rb` to load these new mapper classes.\n\nYou can confirm your changes by usual Redmine development ways.\n\nFor example, here is a command line to run Redmine:\n\n```console\n$ bin/rails server\n```\n\nYou need to add tests to the following files:\n\n  * `test/unit/full_text_search/XXX_test.rb`\n  * `test/functional/full_text_search/search_controller_test.rb`\n\nHere is a command line to run tests:\n\n```console\n$ plugins/full_text_search/dev/run-test.sh\n```\n\nYou can specify test options by `TESTOPTS`:\n\n```console\n$ plugins/full_text_search/dev/run-test.sh TESTOPTS=\"-n/test_XXX/\"\n```\n\nYou can see all test options by `TESTOPTS=--help`:\n\n```console\n$ plugins/full_text_search/dev/run-test.sh TESTOPTS=--help\n```\n\n## Authors\n\n  * Kenji Okimoto\n\n  * Sutou Kouhei `\u003ckou@clear-code.com\u003e`\n\n  * Shimadzu Corporation\n\n## License\n\nThe MIT License. See [LICENSE](LICENSE) for details.\n\n### Exceptions\n\n  * `asserts/stylesheets/fontawesome*/**/*`\n    * Author: [@fontawesome](https://fontawesome.com/)\n    * Fonts: SIL OFL 1.1 License\n    * Codes: MIT License\n    * See `asserts/stylesheets/fontawesome*/LICENSE.txt` for details\n\n## Contributing\n\n1. Fork it ( http://github.com/clear-code/redmine_full_text_search/fork )\n1. Create your feature branch (`git checkout -b my-new-feature`)\n1. Commit your changes (`git commit -am 'Add some feature'`)\n1. Push to the branch (`git push origin my-new-feature`)\n1. Create new Pull Request\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fclear-code%2Fredmine_full_text_search","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fclear-code%2Fredmine_full_text_search","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fclear-code%2Fredmine_full_text_search/lists"}