https://github.com/ssbc/ssb-search2
Full-text search in SSB using ssb-db2
https://github.com/ssbc/ssb-search2
Last synced: 11 months ago
JSON representation
Full-text search in SSB using ssb-db2
- Host: GitHub
- URL: https://github.com/ssbc/ssb-search2
- Owner: ssbc
- License: lgpl-3.0
- Created: 2021-07-21T15:39:26.000Z (almost 5 years ago)
- Default Branch: main
- Last Pushed: 2024-01-24T22:08:52.000Z (over 2 years ago)
- Last Synced: 2024-05-22T17:20:48.211Z (about 2 years ago)
- Language: TypeScript
- Size: 52.7 KB
- Stars: 8
- Watchers: 4
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: readme.md
- License: LICENSE
Awesome Lists containing this project
README
# ssb-search2
> An SSB secret-stack plugin for **full-text search** using ssb-db2
This is a similar to [ssb-search](https://github.com/ssbc/ssb-search), built with ssb-db2. The differences with ssb-search are:
- Supports only `ssb-db2`
- Supports Unicode, i.e. can search for "Smörgås" or Chinese
- ssb-search ignores small words (2 characters long, e.g. "to", "of"), which hurts the search for terms like "EU" or "VR" as well as Chinese words with one character, but ssb-search2 ignores only lowercase ASCII letters of length 1 or 2, which means it can index "VR" and "EU" and Chinese
## Install
```
npm install ssb-search2
```
## Usage
- Requires **Node.js 12** or higher
- Requires `secret-stack@^6.2.0`
- Requires `ssb-db2@>=3.4.0`
```diff
SecretStack({appKey: require('ssb-caps').shs})
.use(require('ssb-master'))
+ .use(require('ssb-db2'))
+ .use(require('ssb-search2'))
.use(require('ssb-conn'))
.use(require('ssb-blobs'))
.call(null, config)
```
Now, just pluck the ssb-db2 operator at `ssb.search2.operator` and use it like this:
```js
// Pluck the operator and name it whatever you want, e.g. `containsWords`
const containsWords = sbot.search2.operator;
sbot.db.query(
where(containsWords('secure scuttlebutt')),
toCallback((err, msgs) => {
console.log(msgs) // all messages containing "secure" and "scuttlebutt"
// somewhere inside `msg.value.content.text`
})
),
```
"But I get wrong results! I get messages that have 'secure' somewhere and 'scuttlebutt' somewhere else, while in reality I really want 'secure scuttlebutt' together!"
No problem! Just add a post-processing step that ensures the exact expression is together:
```js
pull(
sbot.db.query(
where(containsWords('secure scuttlebutt')),
toPullStream()
),
pull.filter((msg) =>
msg.value.content.text.toLowerCase().includes('secure scuttlebutt'),
),
pull.collect((err, msgs) => {
console.log(msgs); // all messages containing exactly the expression
// "secure scuttlebutt" inside `msg.value.content.text`
}),
);
```
## License
LGPL-3.0