[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-71285":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":18,"stars30d":19,"stars90d":16,"forks30d":16,"starsTrendScore":20,"compositeScore":21,"rankGlobal":10,"rankLanguage":10,"license":22,"archived":23,"fork":23,"defaultBranch":24,"hasWiki":23,"hasPages":23,"topics":25,"createdAt":10,"pushedAt":10,"updatedAt":41,"readmeContent":42,"aiSummary":43,"trendingCount":16,"starSnapshotCount":16,"syncStatus":44,"lastSyncTime":45,"discoverSource":46},71285,"orama","oramasearch\u002Forama","oramasearch","🌌  A complete search engine and RAG pipeline in your browser, server or edge network with support for full-text, vector, and hybrid search in less than 2kb.","https:\u002F\u002Fdocs.orama.com\u002Fdocs\u002Forama-js",null,"TypeScript",10395,390,44,20,0,3,12,63,9,42.78,"Other",false,"main",[26,27,28,29,30,31,32,33,34,35,36,37,38,39,40],"algiorithm","data-structures","full-text","javascript","node","search","search-algorithm","search-engine","typescript","typo-tolerance","vector","vector-database","vector-database-embedding","vector-search","vector-search-engine","2026-06-12 02:02:50","\u003Cp align=\"center\">\n  \u003Cimg src=\"https:\u002F\u002Fraw.githubusercontent.com\u002Foramasearch\u002Forama\u002Frefs\u002Fheads\u002Fmain\u002Fmisc\u002Freadme\u002Forama-readme-hero-dark.png#gh-dark-mode-only\" \u002F>\n  \u003Cimg src=\"https:\u002F\u002Fraw.githubusercontent.com\u002Foramasearch\u002Forama\u002Frefs\u002Fheads\u002Fmain\u002Fmisc\u002Freadme\u002Forama-readme-hero-light.png#gh-light-mode-only\" \u002F>\n\u003C\u002Fp>\n\n[![Tests](https:\u002F\u002Fgithub.com\u002Foramasearch\u002Forama\u002Factions\u002Fworkflows\u002Fturbo.yml\u002Fbadge.svg)](https:\u002F\u002Fgithub.com\u002Foramasearch\u002Forama\u002Factions\u002Fworkflows\u002Fturbo.yml)\n\nIf you need more info, help, or want to provide general feedback on Orama, join the [Orama Slack channel](https:\u002F\u002Forama.to\u002Fslack)\n\n# Highlighted features\n\n- [Full-Text search](https:\u002F\u002Fdocs.orama.com\u002Fdocs\u002Forama-js\u002Fsearch)\n- [Vector Search](https:\u002F\u002Fdocs.orama.com\u002Fdocs\u002Forama-js\u002Fsearch\u002Fvector-search)\n- [Hybrid Search](https:\u002F\u002Fdocs.orama.com\u002Fdocs\u002Forama-js\u002Fsearch\u002Fhybrid-search)\n- [GenAI Chat Sessions](https:\u002F\u002Fdocs.orama.com\u002Fdocs\u002Forama-js\u002Fanswer-engine)\n- [Search Filters](https:\u002F\u002Fdocs.orama.com\u002Fdocs\u002Forama-js\u002Fsearch\u002Ffilters)\n- [Geosearch](https:\u002F\u002Fdocs.orama.com\u002Fdocs\u002Forama-js\u002Fsearch\u002Fgeosearch)\n- [Pinning Rules (Merchandising)](https:\u002F\u002Fdocs.orama.com\u002Fdocs\u002Forama-js\u002Fresults-pinning)\n- [Facets](https:\u002F\u002Fdocs.orama.com\u002Fdocs\u002Forama-js\u002Fsearch\u002Ffacets)\n- [Fields Boosting](https:\u002F\u002Fdocs.orama.com\u002Fdocs\u002Forama-js\u002Fsearch\u002Ffields-boosting)\n- [Typo Tolerance](https:\u002F\u002Fdocs.orama.com\u002Fdocs\u002Forama-js\u002Fsearch#typo-tolerance)\n- [Exact Match](https:\u002F\u002Fdocs.orama.com\u002Fdocs\u002Forama-js\u002Fsearch#exact-match)\n- [BM25](https:\u002F\u002Fdocs.orama.com\u002Fdocs\u002Forama-js\u002Fsearch\u002Fbm25)\n- [Stemming and tokenization in 30 languages](https:\u002F\u002Fdocs.orama.com\u002Fdocs\u002Forama-js\u002Ftext-analysis\u002Fstemming)\n- [Plugin System](https:\u002F\u002Fdocs.orama.com\u002Fdocs\u002Forama-js\u002Fplugins)\n\n# Installation\n\nYou can install Orama using `npm`, `yarn`, `pnpm`, `bun`:\n\n```sh\nnpm i @orama\u002Forama\n```\n\nOr import it directly in a browser module:\n\n```html\n\u003Chtml>\n  \u003Cbody>\n    \u003Cscript type=\"module\">\n      import { create, insert, search } from 'https:\u002F\u002Fcdn.jsdelivr.net\u002Fnpm\u002F@orama\u002Forama@latest\u002F+esm'\n    \u003C\u002Fscript>\n  \u003C\u002Fbody>\n\u003C\u002Fhtml>\n```\n\nWith Deno, you can just use the same CDN URL or use npm specifiers:\n\n```js\nimport { create, search, insert } from 'npm:@orama\u002Forama'\n```\n\nRead the complete documentation at [https:\u002F\u002Fdocs.orama.com](https:\u002F\u002Fdocs.orama.com).\n\n# Orama Features\n\n\u003Cp align=\"center\">\n  \u003Cimg src=\"https:\u002F\u002Fraw.githubusercontent.com\u002Foramasearch\u002Forama\u002Frefs\u002Fheads\u002Fmain\u002Fmisc\u002Freadme\u002Ffeatures-dark.png#gh-dark-mode-only\" \u002F>\n  \u003Cimg src=\"https:\u002F\u002Fraw.githubusercontent.com\u002Foramasearch\u002Forama\u002Frefs\u002Fheads\u002Fmain\u002Fmisc\u002Freadme\u002Ffeatures-light.png#gh-light-mode-only\" \u002F>\n\u003C\u002Fp>\n\n# Usage\n\nOrama is quite simple to use. The first thing to do is to create a new database\ninstance and set an indexing schema:\n\n```js\nimport { create, insert, remove, search, searchVector } from '@orama\u002Forama'\n\nconst db = create({\n  schema: {\n    name: 'string',\n    description: 'string',\n    price: 'number',\n    embedding: 'vector[1536]', \u002F\u002F Vector size must be expressed during schema initialization\n    meta: {\n      rating: 'number',\n    },\n  },\n})\n\ninsert(db, {\n  name: 'Noise cancelling headphones',\n  description: 'Best noise cancelling headphones on the market',\n  price: 99.99,\n  embedding: [0.2432, 0.9431, 0.5322, 0.4234, ...],\n  meta: {\n    rating: 4.5\n  }\n})\n\nconst results = search(db, {\n  term: 'Best headphones'\n})\n\n\u002F\u002F {\n\u002F\u002F   elapsed: {\n\u002F\u002F     raw: 21492,\n\u002F\u002F     formatted: '21μs',\n\u002F\u002F   },\n\u002F\u002F   hits: [\n\u002F\u002F     {\n\u002F\u002F       id: '41013877-56',\n\u002F\u002F       score: 0.925085832971998432,\n\u002F\u002F       document: {\n\u002F\u002F         name: 'Noise cancelling headphones',\n\u002F\u002F         description: 'Best noise cancelling headphones on the market',\n\u002F\u002F         price: 99.99,\n\u002F\u002F         embedding: [0.2432, 0.9431, 0.5322, 0.4234, ...],\n\u002F\u002F         meta: {\n\u002F\u002F           rating: 4.5\n\u002F\u002F         }\n\u002F\u002F       }\n\u002F\u002F     }\n\u002F\u002F   ],\n\u002F\u002F   count: 1\n\u002F\u002F }\n```\n\nOrama currently supports 10 different data types:\n\n| Type             | Description                                                                 | Example                                                                     |\n| ---------------- | --------------------------------------------------------------------------- | --------------------------------------------------------------------------- |\n| `string`         | A string of characters.                                                     | `'Hello world'`                                                             |\n| `number`         | A numeric value, either float or integer.                                   | `42`                                                                        |\n| `boolean`        | A boolean value.                                                            | `true`                                                                      |\n| `enum`           | An enum value.                                                              | `'drama'`                                                                   |\n| `geopoint`       | A geopoint value.                                                           | `{ lat: 40.7128, lon: 74.0060 }`                                            |\n| `string[]`       | An array of strings.                                                        | `['red', 'green', 'blue']`                                                  |\n| `number[]`       | An array of numbers.                                                        | `[42, 91, 28.5]`                                                            |\n| `boolean[]`      | An array of booleans.                                                       | `[true, false, false]`                                                      |\n| `enum[]`         | An array of enums.                                                          | `['comedy', 'action', 'romance']`                                           |\n| `vector[\u003Csize>]` | A vector of numbers to perform vector search on.                            | `[0.403, 0.192, 0.830]`                                                     |\n\n# Vector and Hybrid Search Support\n\nOrama supports both vector and hybrid search by just setting `mode: 'vector'` when performing search.\n\nTo perform this kind of search, you'll need to provide [text embeddings](https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FWord_embedding) at search time:\n\n```js\nimport { create, insertMultiple, search } from '@orama\u002Forama'\n\nconst db = create({\n  schema: {\n    title: 'string',\n    embedding: 'vector[5]', \u002F\u002F we are using a 5-dimensional vector.\n  },\n});\n\ninsertMultiple(db, [\n  { title: 'The Prestige', embedding: [0.938293, 0.284951, 0.348264, 0.948276, 0.56472] },\n  { title: 'Barbie', embedding: [0.192839, 0.028471, 0.284738, 0.937463, 0.092827] },\n  { title: 'Oppenheimer', embedding: [0.827391, 0.927381, 0.001982, 0.983821, 0.294841] },\n])\n\nconst results = search(db, {\n  \u002F\u002F Search mode. Can be 'vector', 'hybrid', or 'fulltext'\n  mode: 'vector',\n  vector: {\n    \u002F\u002F The vector (text embedding) to use for search\n    value: [0.938292, 0.284961, 0.248264, 0.748276, 0.26472],\n    \u002F\u002F The schema property where Orama should compare embeddings\n    property: 'embedding',\n  },\n  \u002F\u002F Minimum similarity to determine a match. Defaults to `0.8`\n  similarity: 0.85,\n  \u002F\u002F Defaults to `false`. Setting to 'true' will return the embeddings in the response (which can be very large).\n  includeVectors: true,\n})\n```\n\nHave trouble generating embeddings for vector and hybrid search? Try our `@orama\u002Fplugin-embeddings` plugin!\n\n```js\nimport { create } from '@orama\u002Forama'\nimport { pluginEmbeddings } from '@orama\u002Fplugin-embeddings'\nimport '@tensorflow\u002Ftfjs-node' \u002F\u002F Or any other appropriate TensorflowJS backend, like @tensorflow\u002Ftfjs-backend-webgl\n\nconst plugin = await pluginEmbeddings({\n  embeddings: {\n    \u002F\u002F Schema property used to store generated embeddings\n    defaultProperty: 'embeddings',\n    onInsert: {\n      \u002F\u002F Generate embeddings at insert-time\n      generate: true,\n      \u002F\u002F properties to use for generating embeddings at insert time.\n      \u002F\u002F Will be concatenated to generate a unique embedding.\n      properties: ['description'],\n      verbose: true,\n    }\n  }\n})\n\nconst db = create({\n  schema: {\n    description: 'string',\n    \u002F\u002F Orama generates 512-dimensions vectors.\n    \u002F\u002F When using @orama\u002Fplugin-embeddings, set the property where you want to store embeddings as `vector[512]`.\n    embeddings: 'vector[512]'\n  },\n  plugins: [plugin]\n})\n\n\u002F\u002F Orama will generate and store embeddings at insert-time!\nawait insert(db, { description: 'Classroom Headphones Bulk 5 Pack, Student On Ear Color Varieties' })\nawait insert(db, { description: 'Kids Wired Headphones for School Students K-12' })\nawait insert(db, { description: 'Kids Headphones Bulk 5-Pack for K-12 School' })\nawait insert(db, { description: 'Bose QuietComfort Bluetooth Headphones' })\n\n\u002F\u002F Orama will also generate and use embeddings at search time when search mode is set to \"vector\" or \"hybrid\"!\nconst searchResults = await search(db, {\n  term: 'Headphones for 12th grade students',\n  mode: 'vector',\n  similarity: 0.75,\n})\n```\n\nWant to use OpenAI embedding models? Use our [Secure Proxy](https:\u002F\u002Fdocs.orama.com\u002Fdocs\u002Forama-js\u002Fplugins\u002Fplugin-secure-proxy) plugin to call OpenAI from the client-side securely.\n\n# RAG and Chat Experiences with Orama\n\nSince `v3.0.0`, Orama allows you to create your own ChatGPT\u002FPerplexity\u002FSearchGPT-like experience. You will need to call the OpenAI APIs, so we strongly recommend using the [Secure Proxy Plugin](https:\u002F\u002Fdocs.orama.com\u002Fdocs\u002Forama-js\u002Fplugins\u002Fplugin-secure-proxy) to do that securely from your client side. It's free!\n\n```js\nimport { create, insert } from '@orama\u002Forama'\nimport { pluginSecureProxy } from '@orama\u002Fplugin-secure-proxy'\n\nconst secureProxy = await pluginSecureProxy({\n  apiKey: 'my-api-key',\n  defaultProperty: 'embeddings',\n  models: {\n    \u002F\u002F The chat model to use to generate the chat answer\n    chat: 'openai\u002Fgpt-4o-mini'\n  }\n})\n\nconst db = create({\n  schema: {\n    name: 'string'\n  },\n  plugins: [secureProxy]\n})\n\ninsert(db, { name: 'John Doe' })\ninsert(db, { name: 'Jane Doe' })\n\nconst session = new AnswerSession(db, {\n  \u002F\u002F Customize the prompt for the system\n  systemPrompt: 'You will get a name as context, please provide a greeting message',\n  events: {\n    \u002F\u002F Log all state changes. Useful to reactively update a UI on a new message chunk, sources, etc.\n    onStateChange: console.log,\n  }\n})\n\nconst response = await session.ask({\n  term: 'john'\n})\n\nconsole.log(response) \u002F\u002F Hello, John Doe! How are you doing?\n```\n\nRead the complete [documentation](https:\u002F\u002Fdocs.orama.com\u002Fdocs\u002Forama-js\u002Fanswer-engine).\n\n# Official Docs\n\nRead the complete documentation at [https:\u002F\u002Fdocs.orama.com\u002Fopen-source](https:\u002F\u002Fdocs.orama.com\u002Fopen-source).\n\n# Official Orama Plugins\n\n- [Plugin Embeddings](https:\u002F\u002Fdocs.orama.com\u002Fdocs\u002Forama-js\u002Fplugins\u002Fplugin-embeddings)\n- [Plugin Secure Proxy](https:\u002F\u002Fdocs.orama.com\u002Fdocs\u002Forama-js\u002Fplugins\u002Fplugin-secure-proxy)\n- [Plugin Analytics](https:\u002F\u002Fdocs.orama.com\u002Fdocs\u002Forama-js\u002Fplugins\u002Fplugin-analytics)\n- [Plugin Data Persistence](https:\u002F\u002Fdocs.orama.com\u002Fdocs\u002Forama-js\u002Fplugins\u002Fplugin-data-persistence)\n- [Plugin QPS](https:\u002F\u002Fdocs.orama.com\u002Fdocs\u002Forama-js\u002Fplugins\u002Fplugin-qps)\n- [Plugin PT15](https:\u002F\u002Fdocs.orama.com\u002Fdocs\u002Forama-js\u002Fplugins\u002Fplugin-pt15)\n- [Plugin Vitepress](https:\u002F\u002Fdocs.orama.com\u002Fdocs\u002Forama-js\u002Fplugins\u002Fplugin-vitepress)\n- [Plugin Docusaurus](https:\u002F\u002Fdocs.orama.com\u002Fdocs\u002Forama-js\u002Fplugins\u002Fplugin-docusaurus)\n- [Plugin Astro](https:\u002F\u002Fdocs.orama.com\u002Fdocs\u002Forama-js\u002Fplugins\u002Fplugin-astro)\n- [Plugin Nextra](https:\u002F\u002Fdocs.orama.com\u002Fdocs\u002Forama-js\u002Fplugins\u002Fplugin-nextra)\n\nWrite your own plugin: [https:\u002F\u002Fdocs.orama.com\u002Fdocs\u002Forama-js\u002Fplugins\u002Fwriting-your-own-plugins](https:\u002F\u002Fdocs.orama.com\u002Fdocs\u002Forama-js\u002Fplugins\u002Fwriting-your-own-plugins)\n\n# License\n\nOrama is licensed under the [Apache 2.0](\u002FLICENSE.md) license.\n\n\u003Cimg referrerpolicy=\"no-referrer-when-downgrade\" src=\"https:\u002F\u002Fstatic.scarf.sh\u002Fa.png?x-pxid=16782f89-15fb-4e03-8e9c-2a06106542f7\" \u002F>","Orama 是一个轻量级的完整搜索引擎和检索增强生成（RAG）管道，支持在浏览器、服务器或边缘网络中进行全文、向量及混合搜索。其核心功能包括全文搜索、向量搜索、混合搜索、地理搜索以及插件系统等，并具备拼写容错、字段加权等功能，同时支持30种语言的词干提取与分词处理。该引擎以TypeScript编写，体积小于2KB，易于集成到各种应用环境中。适用于需要高效且灵活搜索能力的场景，如电商网站的商品检索、文档管理系统的内容查找或是任何对文本和向量数据有复杂查询需求的应用场合。",2,"2026-06-11 03:36:59","high_star"]