hermes-client-typescript 1.4.49
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +110 -0
- package/dist/client.d.ts +39 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +368 -0
- package/dist/client.js.map +1 -0
- package/dist/generated/hermes.d.ts +443 -0
- package/dist/generated/hermes.d.ts.map +1 -0
- package/dist/generated/hermes.js +3957 -0
- package/dist/generated/hermes.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +61 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +40 -0
package/README.md
ADDED
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# hermes-client-typescript
|
|
2
|
+
|
|
3
|
+
TypeScript client for [Hermes](https://github.com/SpaceFrontiers/hermes) search server.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pnpm add hermes-client-typescript
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
import { HermesClient } from "hermes-client-typescript";
|
|
15
|
+
|
|
16
|
+
const client = new HermesClient("localhost:50051");
|
|
17
|
+
client.connect();
|
|
18
|
+
|
|
19
|
+
// Create index
|
|
20
|
+
await client.createIndex(
|
|
21
|
+
"articles",
|
|
22
|
+
`
|
|
23
|
+
index articles {
|
|
24
|
+
title: text indexed stored
|
|
25
|
+
body: text indexed stored
|
|
26
|
+
}
|
|
27
|
+
`,
|
|
28
|
+
);
|
|
29
|
+
|
|
30
|
+
// Index documents
|
|
31
|
+
await client.indexDocuments("articles", [
|
|
32
|
+
{ title: "Hello", body: "World" },
|
|
33
|
+
{ title: "Foo", body: "Bar" },
|
|
34
|
+
]);
|
|
35
|
+
await client.commit("articles");
|
|
36
|
+
|
|
37
|
+
// Search
|
|
38
|
+
const results = await client.search("articles", {
|
|
39
|
+
term: ["title", "hello"],
|
|
40
|
+
});
|
|
41
|
+
for (const hit of results.hits) {
|
|
42
|
+
console.log(hit.docId, hit.score, hit.fields);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Clean up
|
|
46
|
+
client.close();
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## API
|
|
50
|
+
|
|
51
|
+
### Index Management
|
|
52
|
+
|
|
53
|
+
- `createIndex(indexName, schema)` — Create a new index with SDL or JSON schema
|
|
54
|
+
- `deleteIndex(indexName)` — Delete an index
|
|
55
|
+
- `listIndexes()` — List all index names
|
|
56
|
+
- `getIndexInfo(indexName)` — Get index metadata (doc count, segments, schema)
|
|
57
|
+
|
|
58
|
+
### Document Indexing
|
|
59
|
+
|
|
60
|
+
- `indexDocuments(indexName, docs)` — Batch index documents, returns `[indexedCount, errorCount]`
|
|
61
|
+
- `indexDocument(indexName, doc)` — Index a single document
|
|
62
|
+
- `indexDocumentsStream(indexName, asyncIterable)` — Stream documents for indexing
|
|
63
|
+
- `commit(indexName)` — Commit pending changes, returns total doc count
|
|
64
|
+
- `forceMerge(indexName)` — Force merge segments
|
|
65
|
+
|
|
66
|
+
### Search
|
|
67
|
+
|
|
68
|
+
- `search(indexName, options)` — Search with term, boolean, sparse/dense vector queries
|
|
69
|
+
- `getDocument(indexName, docId)` — Get document by ID
|
|
70
|
+
|
|
71
|
+
### Search Options
|
|
72
|
+
|
|
73
|
+
```typescript
|
|
74
|
+
await client.search("docs", {
|
|
75
|
+
// Term query
|
|
76
|
+
term: ["field", "value"],
|
|
77
|
+
|
|
78
|
+
// Boolean query
|
|
79
|
+
boolean: {
|
|
80
|
+
must: [["title", "hello"]],
|
|
81
|
+
should: [["body", "world"]],
|
|
82
|
+
},
|
|
83
|
+
|
|
84
|
+
// Sparse vector (pre-tokenized)
|
|
85
|
+
sparseVector: ["embedding", [1, 5, 10], [0.5, 0.3, 0.2]],
|
|
86
|
+
|
|
87
|
+
// Sparse text (server-side tokenization)
|
|
88
|
+
sparseText: ["embedding", "what is machine learning?"],
|
|
89
|
+
|
|
90
|
+
// Dense vector
|
|
91
|
+
denseVector: ["embedding", [0.1, 0.2, 0.3]],
|
|
92
|
+
|
|
93
|
+
// Options
|
|
94
|
+
limit: 10,
|
|
95
|
+
offset: 0,
|
|
96
|
+
fieldsToLoad: ["title", "body"],
|
|
97
|
+
combiner: "sum", // "sum" | "max" | "avg"
|
|
98
|
+
|
|
99
|
+
// L2 reranker: [field, queryVector, l1Limit]
|
|
100
|
+
reranker: ["embedding", [0.1, 0.2], 100],
|
|
101
|
+
});
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## Development
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
pnpm install
|
|
108
|
+
pnpm run generate # regenerate proto stubs
|
|
109
|
+
pnpm run build # compile TypeScript
|
|
110
|
+
```
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Async Hermes client implementation.
|
|
3
|
+
*/
|
|
4
|
+
import { Document, SearchResponse, IndexInfo, SearchOptions } from "./types";
|
|
5
|
+
export declare class HermesClient {
|
|
6
|
+
private address;
|
|
7
|
+
private channel;
|
|
8
|
+
private indexClient;
|
|
9
|
+
private searchClient;
|
|
10
|
+
constructor(address?: string);
|
|
11
|
+
/** Connect to the server. */
|
|
12
|
+
connect(): void;
|
|
13
|
+
/** Close the connection. */
|
|
14
|
+
close(): void;
|
|
15
|
+
private ensureConnected;
|
|
16
|
+
/** Create a new index. */
|
|
17
|
+
createIndex(indexName: string, schema: string): Promise<boolean>;
|
|
18
|
+
/** Delete an index. */
|
|
19
|
+
deleteIndex(indexName: string): Promise<boolean>;
|
|
20
|
+
/** List all indexes on the server. */
|
|
21
|
+
listIndexes(): Promise<string[]>;
|
|
22
|
+
/** Get information about an index. */
|
|
23
|
+
getIndexInfo(indexName: string): Promise<IndexInfo>;
|
|
24
|
+
/** Index multiple documents in batch. Returns [indexedCount, errorCount]. */
|
|
25
|
+
indexDocuments(indexName: string, documents: Record<string, any>[]): Promise<[number, number]>;
|
|
26
|
+
/** Index a single document. */
|
|
27
|
+
indexDocument(indexName: string, document: Record<string, any>): Promise<void>;
|
|
28
|
+
/** Stream documents for indexing. Returns number of indexed documents. */
|
|
29
|
+
indexDocumentsStream(indexName: string, documents: AsyncIterable<Record<string, any>>): Promise<number>;
|
|
30
|
+
/** Commit pending changes. Returns total number of documents. */
|
|
31
|
+
commit(indexName: string): Promise<number>;
|
|
32
|
+
/** Force merge all segments. Returns number of segments after merge. */
|
|
33
|
+
forceMerge(indexName: string): Promise<number>;
|
|
34
|
+
/** Search for documents. */
|
|
35
|
+
search(indexName: string, options?: SearchOptions): Promise<SearchResponse>;
|
|
36
|
+
/** Get a document by ID. Returns null if not found. */
|
|
37
|
+
getDocument(indexName: string, docId: number): Promise<Document | null>;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAeH,OAAO,EACL,QAAQ,EAER,cAAc,EACd,SAAS,EACT,aAAa,EAGd,MAAM,SAAS,CAAC;AAKjB,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,YAAY,CAA6B;gBAErC,OAAO,GAAE,MAA0B;IAI/C,6BAA6B;IAC7B,OAAO,IAAI,IAAI;IAMf,4BAA4B;IAC5B,KAAK,IAAI,IAAI;IASb,OAAO,CAAC,eAAe;IAUvB,0BAA0B;IACpB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAMtE,uBAAuB;IACjB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAMtD,sCAAsC;IAChC,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAMtC,sCAAsC;IAChC,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAezD,6EAA6E;IACvE,cAAc,CAClB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,GAC/B,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAc5B,+BAA+B;IACzB,aAAa,CACjB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC5B,OAAO,CAAC,IAAI,CAAC;IAIhB,0EAA0E;IACpE,oBAAoB,CACxB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,GAC5C,OAAO,CAAC,MAAM,CAAC;IAgBlB,iEAAiE;IAC3D,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAMhD,wEAAwE;IAClE,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAUpD,4BAA4B;IACtB,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,cAAc,CAAC;IA2CrF,uDAAuD;IACjD,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;CAmB9E"}
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Async Hermes client implementation.
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.HermesClient = void 0;
|
|
7
|
+
const grpc_js_1 = require("@grpc/grpc-js");
|
|
8
|
+
const nice_grpc_1 = require("nice-grpc");
|
|
9
|
+
const hermes_1 = require("./generated/hermes");
|
|
10
|
+
class HermesClient {
|
|
11
|
+
constructor(address = "localhost:50051") {
|
|
12
|
+
this.channel = null;
|
|
13
|
+
this.indexClient = null;
|
|
14
|
+
this.searchClient = null;
|
|
15
|
+
this.address = address;
|
|
16
|
+
}
|
|
17
|
+
/** Connect to the server. */
|
|
18
|
+
connect() {
|
|
19
|
+
this.channel = (0, nice_grpc_1.createChannel)(this.address, grpc_js_1.ChannelCredentials.createInsecure());
|
|
20
|
+
this.indexClient = (0, nice_grpc_1.createClient)(hermes_1.IndexServiceDefinition, this.channel);
|
|
21
|
+
this.searchClient = (0, nice_grpc_1.createClient)(hermes_1.SearchServiceDefinition, this.channel);
|
|
22
|
+
}
|
|
23
|
+
/** Close the connection. */
|
|
24
|
+
close() {
|
|
25
|
+
if (this.channel) {
|
|
26
|
+
this.channel.close();
|
|
27
|
+
this.channel = null;
|
|
28
|
+
this.indexClient = null;
|
|
29
|
+
this.searchClient = null;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
ensureConnected() {
|
|
33
|
+
if (!this.indexClient || !this.searchClient) {
|
|
34
|
+
throw new Error("Client not connected. Call connect() first.");
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// =========================================================================
|
|
38
|
+
// Index Management
|
|
39
|
+
// =========================================================================
|
|
40
|
+
/** Create a new index. */
|
|
41
|
+
async createIndex(indexName, schema) {
|
|
42
|
+
this.ensureConnected();
|
|
43
|
+
const response = await this.indexClient.createIndex({ indexName, schema });
|
|
44
|
+
return response.success;
|
|
45
|
+
}
|
|
46
|
+
/** Delete an index. */
|
|
47
|
+
async deleteIndex(indexName) {
|
|
48
|
+
this.ensureConnected();
|
|
49
|
+
const response = await this.indexClient.deleteIndex({ indexName });
|
|
50
|
+
return response.success;
|
|
51
|
+
}
|
|
52
|
+
/** List all indexes on the server. */
|
|
53
|
+
async listIndexes() {
|
|
54
|
+
this.ensureConnected();
|
|
55
|
+
const response = await this.indexClient.listIndexes({});
|
|
56
|
+
return response.indexNames;
|
|
57
|
+
}
|
|
58
|
+
/** Get information about an index. */
|
|
59
|
+
async getIndexInfo(indexName) {
|
|
60
|
+
this.ensureConnected();
|
|
61
|
+
const response = await this.searchClient.getIndexInfo({ indexName });
|
|
62
|
+
return {
|
|
63
|
+
indexName: response.indexName,
|
|
64
|
+
numDocs: response.numDocs,
|
|
65
|
+
numSegments: response.numSegments,
|
|
66
|
+
schema: response.schema,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
// =========================================================================
|
|
70
|
+
// Document Indexing
|
|
71
|
+
// =========================================================================
|
|
72
|
+
/** Index multiple documents in batch. Returns [indexedCount, errorCount]. */
|
|
73
|
+
async indexDocuments(indexName, documents) {
|
|
74
|
+
this.ensureConnected();
|
|
75
|
+
const namedDocs = documents.map((doc) => ({
|
|
76
|
+
fields: toFieldEntries(doc),
|
|
77
|
+
}));
|
|
78
|
+
const response = await this.indexClient.batchIndexDocuments({
|
|
79
|
+
indexName,
|
|
80
|
+
documents: namedDocs,
|
|
81
|
+
});
|
|
82
|
+
return [response.indexedCount, response.errorCount];
|
|
83
|
+
}
|
|
84
|
+
/** Index a single document. */
|
|
85
|
+
async indexDocument(indexName, document) {
|
|
86
|
+
await this.indexDocuments(indexName, [document]);
|
|
87
|
+
}
|
|
88
|
+
/** Stream documents for indexing. Returns number of indexed documents. */
|
|
89
|
+
async indexDocumentsStream(indexName, documents) {
|
|
90
|
+
this.ensureConnected();
|
|
91
|
+
async function* requestIterator() {
|
|
92
|
+
for await (const doc of documents) {
|
|
93
|
+
yield {
|
|
94
|
+
indexName,
|
|
95
|
+
fields: toFieldEntries(doc),
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
const response = await this.indexClient.indexDocuments(requestIterator());
|
|
100
|
+
return response.indexedCount;
|
|
101
|
+
}
|
|
102
|
+
/** Commit pending changes. Returns total number of documents. */
|
|
103
|
+
async commit(indexName) {
|
|
104
|
+
this.ensureConnected();
|
|
105
|
+
const response = await this.indexClient.commit({ indexName });
|
|
106
|
+
return response.numDocs;
|
|
107
|
+
}
|
|
108
|
+
/** Force merge all segments. Returns number of segments after merge. */
|
|
109
|
+
async forceMerge(indexName) {
|
|
110
|
+
this.ensureConnected();
|
|
111
|
+
const response = await this.indexClient.forceMerge({ indexName });
|
|
112
|
+
return response.numSegments;
|
|
113
|
+
}
|
|
114
|
+
// =========================================================================
|
|
115
|
+
// Search
|
|
116
|
+
// =========================================================================
|
|
117
|
+
/** Search for documents. */
|
|
118
|
+
async search(indexName, options = {}) {
|
|
119
|
+
this.ensureConnected();
|
|
120
|
+
const query = buildQuery(options);
|
|
121
|
+
let reranker;
|
|
122
|
+
if (options.reranker) {
|
|
123
|
+
const [field, vector, limit] = options.reranker;
|
|
124
|
+
reranker = {
|
|
125
|
+
field,
|
|
126
|
+
vector,
|
|
127
|
+
limit,
|
|
128
|
+
combiner: rerankerCombinerToProto(options.rerankerCombiner ?? "log_sum_exp"),
|
|
129
|
+
combinerTemperature: 0,
|
|
130
|
+
combinerTopK: 0,
|
|
131
|
+
combinerDecay: 0,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
const response = await this.searchClient.search({
|
|
135
|
+
indexName,
|
|
136
|
+
query,
|
|
137
|
+
limit: options.limit ?? 10,
|
|
138
|
+
offset: options.offset ?? 0,
|
|
139
|
+
fieldsToLoad: options.fieldsToLoad ?? [],
|
|
140
|
+
reranker,
|
|
141
|
+
});
|
|
142
|
+
const hits = response.hits.map((hit) => ({
|
|
143
|
+
docId: hit.docId,
|
|
144
|
+
score: hit.score,
|
|
145
|
+
fields: Object.fromEntries(Object.entries(hit.fields).map(([k, v]) => [k, fromFieldValue(v)])),
|
|
146
|
+
}));
|
|
147
|
+
return {
|
|
148
|
+
hits,
|
|
149
|
+
totalHits: response.totalHits,
|
|
150
|
+
tookMs: response.tookMs,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
/** Get a document by ID. Returns null if not found. */
|
|
154
|
+
async getDocument(indexName, docId) {
|
|
155
|
+
this.ensureConnected();
|
|
156
|
+
try {
|
|
157
|
+
const response = await this.searchClient.getDocument({
|
|
158
|
+
indexName,
|
|
159
|
+
docId,
|
|
160
|
+
});
|
|
161
|
+
const fields = Object.fromEntries(Object.entries(response.fields).map(([k, v]) => [k, fromFieldValue(v)]));
|
|
162
|
+
return { fields };
|
|
163
|
+
}
|
|
164
|
+
catch (err) {
|
|
165
|
+
if (err?.code === 5) {
|
|
166
|
+
// NOT_FOUND
|
|
167
|
+
return null;
|
|
168
|
+
}
|
|
169
|
+
throw err;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
exports.HermesClient = HermesClient;
|
|
174
|
+
// =============================================================================
|
|
175
|
+
// Helper functions
|
|
176
|
+
// =============================================================================
|
|
177
|
+
function isSparseVector(value) {
|
|
178
|
+
if (value.length === 0)
|
|
179
|
+
return false;
|
|
180
|
+
return value.every((item) => Array.isArray(item) &&
|
|
181
|
+
item.length === 2 &&
|
|
182
|
+
typeof item[0] === "number" &&
|
|
183
|
+
typeof item[1] === "number" &&
|
|
184
|
+
Number.isInteger(item[0]));
|
|
185
|
+
}
|
|
186
|
+
function isMultiSparseVector(value) {
|
|
187
|
+
if (value.length === 0)
|
|
188
|
+
return false;
|
|
189
|
+
return value.every((item) => Array.isArray(item) && isSparseVector(item));
|
|
190
|
+
}
|
|
191
|
+
function isDenseVector(value) {
|
|
192
|
+
if (value.length === 0)
|
|
193
|
+
return false;
|
|
194
|
+
return value.every((v) => typeof v === "number" && typeof v !== "boolean");
|
|
195
|
+
}
|
|
196
|
+
function isMultiDenseVector(value) {
|
|
197
|
+
if (value.length === 0)
|
|
198
|
+
return false;
|
|
199
|
+
return value.every((item) => Array.isArray(item) && isDenseVector(item));
|
|
200
|
+
}
|
|
201
|
+
function toFieldEntries(doc) {
|
|
202
|
+
const entries = [];
|
|
203
|
+
for (const [name, value] of Object.entries(doc)) {
|
|
204
|
+
if (Array.isArray(value)) {
|
|
205
|
+
if (isMultiSparseVector(value)) {
|
|
206
|
+
for (const sv of value) {
|
|
207
|
+
const indices = sv.map((item) => item[0]);
|
|
208
|
+
const values = sv.map((item) => item[1]);
|
|
209
|
+
entries.push({
|
|
210
|
+
name,
|
|
211
|
+
value: { sparseVector: { indices, values } },
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
continue;
|
|
215
|
+
}
|
|
216
|
+
if (isMultiDenseVector(value)) {
|
|
217
|
+
for (const dv of value) {
|
|
218
|
+
entries.push({
|
|
219
|
+
name,
|
|
220
|
+
value: { denseVector: { values: dv.map(Number) } },
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
continue;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
entries.push({ name, value: toFieldValue(value) });
|
|
227
|
+
}
|
|
228
|
+
return entries;
|
|
229
|
+
}
|
|
230
|
+
function toFieldValue(value) {
|
|
231
|
+
if (typeof value === "string") {
|
|
232
|
+
return { text: value };
|
|
233
|
+
}
|
|
234
|
+
if (typeof value === "boolean") {
|
|
235
|
+
return { u64: value ? 1 : 0 };
|
|
236
|
+
}
|
|
237
|
+
if (typeof value === "number") {
|
|
238
|
+
if (Number.isInteger(value)) {
|
|
239
|
+
return value >= 0 ? { u64: value } : { i64: value };
|
|
240
|
+
}
|
|
241
|
+
return { f64: value };
|
|
242
|
+
}
|
|
243
|
+
if (value instanceof Uint8Array || Buffer.isBuffer(value)) {
|
|
244
|
+
return { bytesValue: value instanceof Uint8Array ? value : new Uint8Array(value) };
|
|
245
|
+
}
|
|
246
|
+
if (Array.isArray(value)) {
|
|
247
|
+
if (isSparseVector(value)) {
|
|
248
|
+
const indices = value.map((item) => item[0]);
|
|
249
|
+
const values = value.map((item) => item[1]);
|
|
250
|
+
return { sparseVector: { indices, values } };
|
|
251
|
+
}
|
|
252
|
+
if (isDenseVector(value)) {
|
|
253
|
+
return { denseVector: { values: value.map(Number) } };
|
|
254
|
+
}
|
|
255
|
+
return { jsonValue: JSON.stringify(value) };
|
|
256
|
+
}
|
|
257
|
+
if (typeof value === "object" && value !== null) {
|
|
258
|
+
return { jsonValue: JSON.stringify(value) };
|
|
259
|
+
}
|
|
260
|
+
return { text: String(value) };
|
|
261
|
+
}
|
|
262
|
+
function fromFieldValue(fv) {
|
|
263
|
+
if (fv.text !== undefined)
|
|
264
|
+
return fv.text;
|
|
265
|
+
if (fv.u64 !== undefined)
|
|
266
|
+
return fv.u64;
|
|
267
|
+
if (fv.i64 !== undefined)
|
|
268
|
+
return fv.i64;
|
|
269
|
+
if (fv.f64 !== undefined)
|
|
270
|
+
return fv.f64;
|
|
271
|
+
if (fv.bytesValue !== undefined)
|
|
272
|
+
return fv.bytesValue;
|
|
273
|
+
if (fv.jsonValue !== undefined)
|
|
274
|
+
return JSON.parse(fv.jsonValue);
|
|
275
|
+
if (fv.sparseVector !== undefined) {
|
|
276
|
+
return {
|
|
277
|
+
indices: Array.from(fv.sparseVector.indices),
|
|
278
|
+
values: Array.from(fv.sparseVector.values),
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
if (fv.denseVector !== undefined) {
|
|
282
|
+
return Array.from(fv.denseVector.values);
|
|
283
|
+
}
|
|
284
|
+
return null;
|
|
285
|
+
}
|
|
286
|
+
function combinerToProto(combiner) {
|
|
287
|
+
const map = { sum: 0, max: 1, avg: 2 };
|
|
288
|
+
return map[combiner] ?? 0;
|
|
289
|
+
}
|
|
290
|
+
function rerankerCombinerToProto(combiner) {
|
|
291
|
+
const map = {
|
|
292
|
+
log_sum_exp: hermes_1.MultiValueCombiner.COMBINER_LOG_SUM_EXP,
|
|
293
|
+
max: hermes_1.MultiValueCombiner.COMBINER_MAX,
|
|
294
|
+
avg: hermes_1.MultiValueCombiner.COMBINER_AVG,
|
|
295
|
+
sum: hermes_1.MultiValueCombiner.COMBINER_SUM,
|
|
296
|
+
weighted_top_k: hermes_1.MultiValueCombiner.COMBINER_WEIGHTED_TOP_K,
|
|
297
|
+
};
|
|
298
|
+
return map[combiner] ?? hermes_1.MultiValueCombiner.COMBINER_LOG_SUM_EXP;
|
|
299
|
+
}
|
|
300
|
+
function buildQuery(options) {
|
|
301
|
+
if (options.term) {
|
|
302
|
+
const [field, term] = options.term;
|
|
303
|
+
return { term: { field, term } };
|
|
304
|
+
}
|
|
305
|
+
if (options.boolean) {
|
|
306
|
+
const must = (options.boolean.must ?? []).map(([f, t]) => ({
|
|
307
|
+
term: { field: f, term: t },
|
|
308
|
+
}));
|
|
309
|
+
const should = (options.boolean.should ?? []).map(([f, t]) => ({
|
|
310
|
+
term: { field: f, term: t },
|
|
311
|
+
}));
|
|
312
|
+
const mustNot = (options.boolean.mustNot ?? []).map(([f, t]) => ({
|
|
313
|
+
term: { field: f, term: t },
|
|
314
|
+
}));
|
|
315
|
+
return { boolean: { must, should, mustNot } };
|
|
316
|
+
}
|
|
317
|
+
const combiner = combinerToProto(options.combiner ?? "sum");
|
|
318
|
+
if (options.sparseVector) {
|
|
319
|
+
const [field, indices, values] = options.sparseVector;
|
|
320
|
+
return {
|
|
321
|
+
sparseVector: {
|
|
322
|
+
field,
|
|
323
|
+
indices,
|
|
324
|
+
values,
|
|
325
|
+
text: "",
|
|
326
|
+
combiner,
|
|
327
|
+
heapFactor: options.heapFactor ?? 1.0,
|
|
328
|
+
combinerTemperature: 0,
|
|
329
|
+
combinerTopK: 0,
|
|
330
|
+
combinerDecay: 0,
|
|
331
|
+
},
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
if (options.sparseText) {
|
|
335
|
+
const [field, text] = options.sparseText;
|
|
336
|
+
return {
|
|
337
|
+
sparseVector: {
|
|
338
|
+
field,
|
|
339
|
+
indices: [],
|
|
340
|
+
values: [],
|
|
341
|
+
text,
|
|
342
|
+
combiner,
|
|
343
|
+
heapFactor: options.heapFactor ?? 1.0,
|
|
344
|
+
combinerTemperature: 0,
|
|
345
|
+
combinerTopK: 0,
|
|
346
|
+
combinerDecay: 0,
|
|
347
|
+
},
|
|
348
|
+
};
|
|
349
|
+
}
|
|
350
|
+
if (options.denseVector) {
|
|
351
|
+
const [field, vector] = options.denseVector;
|
|
352
|
+
return {
|
|
353
|
+
denseVector: {
|
|
354
|
+
field,
|
|
355
|
+
vector,
|
|
356
|
+
nprobe: options.nprobe ?? 0,
|
|
357
|
+
rerankFactor: options.rerankFactor ?? 0,
|
|
358
|
+
combiner,
|
|
359
|
+
combinerTemperature: 0,
|
|
360
|
+
combinerTopK: 0,
|
|
361
|
+
combinerDecay: 0,
|
|
362
|
+
},
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
// Default: match all (empty boolean query)
|
|
366
|
+
return { boolean: { must: [], should: [], mustNot: [] } };
|
|
367
|
+
}
|
|
368
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|