OriginChain
08 · full-text

BM25 relevance. On the same write.

Every posting lands inside the same atomic write as the row it indexes - no separate search cluster to keep in sync. BM25, boolean and phrase modes, Lucene-default scoring, and stemming + lemmatization across 18 languages.

query modes
01 · GA
BM25

Lucene-default scoring (k1=1.2, b=0.75). Ranked hits, best first.

02 · GA
Boolean

AND / OR / NOT term matching. The default mode - a bare array of doc ids.

03 · GA
Phrase

Position-list intersection. Exact, ordered term sequences only.

04 · GA
Multi-field

Index and query any field independently, then combine in one request.

language coverage
01
Snowball stemming

18 languages. Inflected forms reduced to their stem before scoring.

02
Dictionary lemmatization

9 languages - EN, ES, FR, DE, IT, PT, RU, NL, SV. Canonical lemma, not just a stem.

03
UAX #29 tokenizer

Unicode word boundaries across Latin, Cyrillic, CJK, Arabic and Hindi.

04
ICU + geo tokenizer

Mixed-script and location-aware queries in one analyzer.

05
Analyzer pipeline

Optional diacritics fold and stopword removal per field.

one endpoint

Index a field, then rank against it.

Post a document to a field's index and it is searchable the instant the write commits. Query the same field with mode=bm25 for ranked relevance, boolean for set matching, or phrase for exact sequences.

No sidecar search engine, no reindex job, no replication lag between your rows and your postings.

request
GET /v1/tenants/:t/fts/shop.products/description
      ?q=carbon+marathon
      &mode=bm25
      &k=10

# → best-first, one row per hit
[
  { "doc_id": "sku-8842", "score": 7.41 },
  { "doc_id": "sku-1207", "score": 5.96 }
]
measured
18
languages stemmed
9
dictionary-lemmatized
k1 1.2 · b 0.75
Lucene-default BM25
0
index-vs-row consistency lag

Read the full-text docs, then try it.