{"id":19756273,"url":"https://github.com/nextapps-de/flexsearch-server","last_synced_at":"2025-04-30T11:33:23.480Z","repository":{"id":57238344,"uuid":"168258219","full_name":"nextapps-de/flexsearch-server","owner":"nextapps-de","description":"High-performance FlexSearch Server for Node.js (Cluster)","archived":false,"fork":false,"pushed_at":"2019-02-03T22:05:58.000Z","size":129,"stargazers_count":187,"open_issues_count":4,"forks_count":18,"subscribers_count":10,"default_branch":"master","last_synced_at":"2024-04-27T00:41:45.366Z","etag":null,"topics":["clustering","node-module","nodejs","server"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nextapps-de.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-01-30T01:28:10.000Z","updated_at":"2024-04-07T11:32:08.000Z","dependencies_parsed_at":"2022-08-26T14:04:38.310Z","dependency_job_id":null,"html_url":"https://github.com/nextapps-de/flexsearch-server","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nextapps-de%2Fflexsearch-server","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nextapps-de%2Fflexsearch-server/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nextapps-de%2Fflexsearch-server/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nextapps-de%2Fflexsearch-server/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nextapps-de","download_url":"https://codeload.github.com/nextapps-de/flexsearch-server/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":251691610,"owners_count":21628356,"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":["clustering","node-module","nodejs","server"],"created_at":"2024-11-12T03:15:23.926Z","updated_at":"2025-04-30T11:33:23.048Z","avatar_url":"https://github.com/nextapps-de.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n    \u003cbr\u003e\n    \u003cimg src=\"https://rawgithub.com/nextapps-de/flexsearch/master/doc/flexsearch.svg\" alt=\"Search Library\" width=\"50%\"\u003e\n    \u003cbr\u003e\u003cbr\u003e\n    \u003ca target=\"_blank\" href=\"https://www.npmjs.com/package/flexsearch-server\"\u003e\u003cimg src=\"https://img.shields.io/npm/v/flexsearch-server.svg\"\u003e\u003c/a\u003e\n    \u003cimg src=\"https://img.shields.io/badge/status-BETA-orange.svg\"\u003e\n    \u003ca target=\"_blank\" href=\"https://travis-ci.org/nextapps-de/flexsearch-server\"\u003e\u003cimg src=\"https://travis-ci.org/nextapps-de/flexsearch-server.svg?branch=master\"\u003e\u003c/a\u003e\n    \u003ca target=\"_blank\" href=\"https://coveralls.io/github/nextapps-de/flexsearch-server?branch=master\"\u003e\u003cimg src=\"https://coveralls.io/repos/github/nextapps-de/flexsearch-server/badge.svg?branch=master\"\u003e\u003c/a\u003e\n    \u003c!--\u003cimg src=\"https://badges.greenkeeper.io/nextapps-de/flexsearch.svg\"\u003e--\u003e\n    \u003ca target=\"_blank\" href=\"https://github.com/nextapps-de/flexsearch-server/issues\"\u003e\u003cimg src=\"https://img.shields.io/github/issues/nextapps-de/flexsearch-server.svg\"\u003e\u003c/a\u003e\n    \u003ca target=\"_blank\" href=\"https://github.com/nextapps-de/flexsearch-server/blob/master/LICENSE.md\"\u003e\u003cimg src=\"https://img.shields.io/npm/l/flexsearch-server.svg\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003ch1\u003e\u003c/h1\u003e\n\u003ch3\u003eHigh-performance FlexSearch Server for Node.js\u003c/h3\u003e\n\nA full documentation of FlexSearch is available here: \u003ca target=\"_blank\" href=\"https://github.com/nextapps-de/flexsearch\"\u003ehttps://github.com/nextapps-de/flexsearch\u003c/a\u003e\n\n#### Cluster (Vertical Scaling)\n\nFlexSearch Server actually use Node.js Clusters and a Connection Pool to balance all incoming load through the workers.\n\n\u003cimg src=\"https://raw.githubusercontent.com/nextapps-de/flexsearch-server/master/doc/cluster.png\" width=\"62%\"\u003e\u003cbr\u003e\n\n\u003e The performance gain of workers depends on the complexity of the index and how much time a query takes.\n\nFor most situations disabled workers performs a lot better, e.g.:\n\n\u003ctable\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003cb\u003eSingle Thread\u003c/b\u003e\u003cbr\u003e(Request per seconds)\u003c/td\u003e\n        \u003ctd\u003e\u003cb\u003eCluster\u003c/b\u003e\u003cbr\u003e(Request per seconds)\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eQuery Time \u003c 10 ms\u003c/td\u003e\n        \u003ctd\u003e\u003cb\u003e6122\u003c/b\u003e\u003c/td\u003e\n        \u003ctd\u003e1215\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eQuery Time \u003e 1000 ms\u003c/td\u003e\n        \u003ctd\u003e114\u003c/td\u003e\n        \u003ctd\u003e\u003cb\u003e1041\u003c/b\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n\u003c/table\u003e\n\n__Note:__ A query time of 10 ms is already based on a large index.\n\n#### Sharding / Replication (Horizontal Scaling)\n\nBasically the current codebase has all requirements to provide also scaling in horizontal direction. If this project gains popularity I will made an implementation and also provide some docker bindings for an out-of-the-box installation.\n\n\u003ca name=\"installation\"\u003e\u003c/a\u003e\n## Installation\n\n```npm\nnpm install flexsearch-server\n```\n\nRun setup once when not installing via \"npm install\":\n\n```node\nnpm run setup\n```\n\nRun as a single web server:\n\n```node\nnpm start\n```\n\nRun as a server cluster:\n\n```node\nnpm run cluster\n```\n\nRun with a specified environment:\n\n```node\nnpm start production\n```\n\n```node\nnpm run cluster test\n```\n\nThe server is listening at:\n\n\u003ctable\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eEnvironment\u003c/td\u003e\n        \u003ctd\u003eServer Address\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003edevelopment\u003c/td\u003e\n        \u003ctd\u003ehttp://localhost\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eproduction\u003cbr\u003e\u003cbr\u003e\u003c/td\u003e\n        \u003ctd\u003ehttp://localhost:6780\u003cbr\u003ehttps://localhost:6780\u003c/td\u003e\n    \u003c/tr\u003e\n     \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003etest\u003c/td\u003e\n        \u003ctd\u003ehttp://localhost\u003c/td\u003e\n    \u003c/tr\u003e\n\u003c/table\u003e\n\n\u003e The default port for production is __6780__ (over HTTP) and __6781__ (over HTTPS), you can change the default ports in the configs.\n\n\u003e When _NODE_ENV_ is set, all manual passed environments will be overridden.\n\n\u003ca name=\"api\"\u003e\u003c/a\u003e\n## API Overview\n\n__RESTful__\n\n\u003ctable\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eRequest Type\u003c/td\u003e\n        \u003ctd\u003eEndpoint\u003c/td\u003e\n        \u003ctd\u003eDescription\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eGET\u003c/td\u003e\n        \u003ctd\u003e/\u003c/td\u003e\n        \u003ctd\u003eReturns info about the index\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003ePOST\u003c/td\u003e\n        \u003ctd\u003e/add/:id/:content\u003c/td\u003e\n        \u003ctd\u003eAdd content to the index\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003ePOST\u003c/td\u003e\n        \u003ctd\u003e/update/:id/:content\u003c/td\u003e\n        \u003ctd\u003eUpdate content of the index\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eGET\u003c/td\u003e\n        \u003ctd\u003e/search/:query\u003c/td\u003e\n        \u003ctd\u003eSearch for query\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003ePOST\u003c/td\u003e\n        \u003ctd\u003e/remove/:id\u003c/td\u003e\n        \u003ctd\u003eRemove id from the index\u003c/td\u003e\n    \u003c/tr\u003e\n\u003c/table\u003e\n\n__JSON__\n\n\u003ctable\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eRequest Type\u003c/td\u003e\n        \u003ctd\u003eEndpoint\u003c/td\u003e\n        \u003ctd\u003eBody\u003c/td\u003e\n        \u003ctd\u003eDescription\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003ePOST\u003c/td\u003e\n        \u003ctd\u003e/add\u003c/td\u003e\n        \u003ctd\u003eJSON\u003c/td\u003e\n        \u003ctd\u003eAdd multiple contents to the index\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003ePOST\u003c/td\u003e\n        \u003ctd\u003e/update\u003c/td\u003e\n        \u003ctd\u003eJSON\u003c/td\u003e\n        \u003ctd\u003eUpdate multiple contents of the index\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eGET\u003c/td\u003e\n        \u003ctd\u003e/search\u003c/td\u003e\n        \u003ctd\u003eJSON\u003c/td\u003e\n        \u003ctd\u003eSearch for query (custom search)\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003ePOST\u003c/td\u003e\n        \u003ctd\u003e/remove\u003c/td\u003e\n        \u003ctd\u003eJSON\u003c/td\u003e\n        \u003ctd\u003eRemove multiple ids from the index\u003c/td\u003e\n    \u003c/tr\u003e\n\u003c/table\u003e\n\n\u003ca name=\"env\"\u003e\u003c/a\u003e\n## Server Environment Variables\n\n\u003ctable\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eVariable\u003c/td\u003e\n        \u003ctd\u003eValues\u003c/td\u003e\n        \u003ctd\u003eDefault\u003c/td\u003e\n        \u003ctd\u003eDescription\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003ePORT\u003c/td\u003e\n        \u003ctd\u003einteger\u003c/td\u003e\n        \u003ctd\u003e80\u0026nbsp;(development)\u003cbr\u003e6780\u0026nbsp;(production)\u003c/td\u003e\n        \u003ctd\u003eServer listening port\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003ePORT_SSL\u003c/td\u003e\n        \u003ctd\u003einteger\u003c/td\u003e\n        \u003ctd\u003e443\u0026nbsp;(development)\u003cbr\u003e6781\u0026nbsp;(production)\u003c/td\u003e\n        \u003ctd\u003eServer listening port\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eSSL\u003c/td\u003e\n        \u003ctd\u003etrue\u003cbr\u003efalse\u003c/td\u003e\n        \u003ctd\u003efalse\u003c/td\u003e\n        \u003ctd\u003eStarts a HTTPS server (additionally to HTTP)\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eFORCE_SSL\u003c/td\u003e\n        \u003ctd\u003etrue\u003cbr\u003efalse\u003c/td\u003e\n        \u003ctd\u003efalse\u003c/td\u003e\n        \u003ctd\u003eAccept HTTPS connections only\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eCOMPRESS\u003c/td\u003e\n        \u003ctd\u003etrue\u003cbr\u003efalse\u003c/td\u003e\n        \u003ctd\u003etrue\u003c/td\u003e\n        \u003ctd\u003eEnable/Disable response compression (gzip)\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eWORKER\u003c/td\u003e\n        \u003ctd\u003einteger\u003cbr\u003e\"auto\"\u003c/td\u003e\n        \u003ctd\u003e\"auto\"\u003c/td\u003e\n        \u003ctd\u003eSets the number of workers or automatically determine available cpus\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eAUTOSAVE\u003c/td\u003e\n        \u003ctd\u003einteger\u003cbr\u003efalse\u003c/td\u003e\n        \u003ctd\u003e10000\u003c/td\u003e\n        \u003ctd\u003eEnables persistent handler. Set the delay in milliseconds or disable by setting to \u003ci\u003efalse\u003c/i\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n\u003c/table\u003e\n\n\u003ca name=\"config\"\u003e\u003c/a\u003e\n## Configuration\n\nWhen you do not pass any custom options, the environment will be inherited from _NODE_ENV_ by default.\n\nOverride the current environment (_NODE_ENV_) by adding a field in the root of `package.json`:\n\n```json\n  \"flexsearch\": \"production\" // development, test\n```\n\nOr add a config payload in the root of `package.json`:\n\n\u003e The field \"client\" holds the flexsearch options\n\n```json\n  \"flexsearch\": {\n    \"server\": {\n      \"debug\": true,\n      \"port\": 80,\n      \"port_ssl\": 443,\n      \"force_ssl\": false,\n      \"https\": true,\n      \"compress\": true,\n      \"autosave\": 2000,\n      \"worker\": \"auto\"\n    },\n    \"client\": {\n      \"async\": false,\n      \"cache\": 0,\n      \"worker\": 4\n    }\n  }\n```\n\nOr provide a config json file for each environment respectively and pass file locations:\n\n\u003e You can also provide a config json file to override the default settings globally.\n\n```json\n  \"flexsearch\": {\n    \"development\": \"config/development.json\",\n    \"production\": \"config/production.json\",\n    \"test\": \"config/test\",\n    \"default\": \"config/default.json\"\n}\n```\n\nOr just provide a ___flexsearch.json___ in the root of your project.\n\n\u003ca name=\"persistence\"\u003e\u003c/a\u003e\n## Persistence\n\nTurn on persistence by setting a numeric value as delay on _config.autosave_. Flexsearch will automatically save the index to the local filesystem and also loads it when starting.\n\nDisable persistence by setting this field to _false_.\n\n\u003ca name=\"ssl\"\u003e\u003c/a\u003e\n## Setup SSL for HTTPS Connections\n\nInside the folder _cert_ add the certificate as a .crt file and the key as a .pem file for each environment respectively.\n\n__Development Environment:__\n\n_cert/development.crt_\u003cbr\u003e\n_cert/development.pem_\n\n__Production Environment:__\n\n_cert/production.crt_\u003cbr\u003e\n_cert/production.pem_\n\n\u003ca name=\"important\"\u003e\u003c/a\u003e\n## Important Notes\n\nYou can increase workers without any drawbacks, but when you decrease worker count, the old index doesnt restore completely from the filesystem. This will be fixed in an upcoming version. As long please do not decrease worker count when using persistent index.\n\n---\n\nCopyright 2019 Nextapps GmbH\u003cbr\u003e\nReleased under the \u003ca href=\"http://www.apache.org/licenses/LICENSE-2.0.html\" target=\"_blank\"\u003eApache 2.0 License\u003c/a\u003e\u003cbr\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnextapps-de%2Fflexsearch-server","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnextapps-de%2Fflexsearch-server","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnextapps-de%2Fflexsearch-server/lists"}