Skip to content

Commit 1adf2fd

Browse files
committed
JSCBC-1342: Support FTS like Pre-Filters while doing Vector Search
Changes ======= * Added prefilter option to `VectorQuery` * Updated search unit tests to confirm prefilter must be a `SearchQuery` * Added `TermRangeQuery` * Fixed `GeoDistanceQuery` distance param to be a string * Validated changes with FIT performer Change-Id: I9a5d6c4b998bea66c18a424ecc6673b406aeae4c Reviewed-on: https://review.couchbase.org/c/couchnode/+/232454 Reviewed-by: Mateusz <[email protected]> Tested-by: Jared Casey <[email protected]>
1 parent 655de86 commit 1adf2fd

File tree

3 files changed

+74
-2
lines changed

3 files changed

+74
-2
lines changed

lib/searchquery.ts

Lines changed: 50 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,10 @@ export class SearchQuery {
116116
return new DateRangeSearchQuery()
117117
}
118118

119+
static termRange(): TermRangeSearchQuery {
120+
return new TermRangeSearchQuery()
121+
}
122+
119123
/**
120124
* Creates a ConjunctionSearchQuery from a set of other SearchQuery's.
121125
*
@@ -215,7 +219,7 @@ export class SearchQuery {
215219
static geoDistance(
216220
lon: number,
217221
lat: number,
218-
distance: number
222+
distance: string
219223
): GeoDistanceSearchQuery {
220224
return new GeoDistanceSearchQuery(lon, lat, distance)
221225
}
@@ -461,6 +465,50 @@ export class DateRangeSearchQuery extends SearchQuery {
461465
}
462466
}
463467

468+
/**
469+
* Represents a term-range search query.
470+
*
471+
* @category Full Text Search
472+
*/
473+
export class TermRangeSearchQuery extends SearchQuery {
474+
/**
475+
* @internal
476+
*/
477+
constructor() {
478+
super({})
479+
}
480+
481+
min(min: string, inclusive?: boolean): TermRangeSearchQuery {
482+
if (inclusive === undefined) {
483+
inclusive = true
484+
}
485+
486+
this._data.min = min
487+
this._data.inclusive_min = inclusive
488+
return this
489+
}
490+
491+
max(max: string, inclusive?: boolean): TermRangeSearchQuery {
492+
if (inclusive === undefined) {
493+
inclusive = false
494+
}
495+
496+
this._data.max = max
497+
this._data.inclusive_max = inclusive
498+
return this
499+
}
500+
501+
field(field: string): TermRangeSearchQuery {
502+
this._data.field = field
503+
return this
504+
}
505+
506+
boost(boost: number): TermRangeSearchQuery {
507+
this._data.boost = boost
508+
return this
509+
}
510+
}
511+
464512
/**
465513
* Represents a conjunction search query.
466514
*
@@ -858,7 +906,7 @@ export class GeoDistanceSearchQuery extends SearchQuery {
858906
/**
859907
* @internal
860908
*/
861-
constructor(lon: number, lat: number, distance: number) {
909+
constructor(lon: number, lat: number, distance: string) {
862910
super({
863911
location: [lon, lat],
864912
distance: distance,

lib/vectorsearch.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { InvalidArgumentError } from './errors'
2+
import { SearchQuery } from './searchquery'
23

34
/**
45
* Specifies how multiple vector searches are combined.
@@ -38,6 +39,7 @@ export class VectorQuery {
3839
private _vectorBase64: string | undefined
3940
private _numCandidates: number | undefined
4041
private _boost: number | undefined
42+
private _prefilter: SearchQuery | undefined
4143

4244
constructor(fieldName: string, vector: number[] | string) {
4345
if (!fieldName) {
@@ -83,6 +85,9 @@ export class VectorQuery {
8385
if (this._boost) {
8486
output['boost'] = this._boost
8587
}
88+
if (this._prefilter) {
89+
output['filter'] = this._prefilter.toJSON()
90+
}
8691
return output
8792
}
8893

@@ -111,6 +116,21 @@ export class VectorQuery {
111116
return this
112117
}
113118

119+
/**
120+
* Adds prefilter option to vector query.
121+
*
122+
* @param prefilter A SearchQuery.
123+
*/
124+
prefilter(prefilter: SearchQuery): VectorQuery {
125+
if (!(prefilter instanceof SearchQuery)) {
126+
throw new InvalidArgumentError(
127+
new Error('Provided value for prefilter must be a SearchQuery.')
128+
)
129+
}
130+
this._prefilter = prefilter
131+
return this
132+
}
133+
114134
/**
115135
* Creates a vector query.
116136
*

test/search.test.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -382,6 +382,10 @@ describe('#vectorsearch', function () {
382382
const vQuery = new VectorQuery('vector_field', testVector)
383383
vQuery.numCandidates(-1)
384384
}, H.lib.InvalidArgumentError)
385+
assert.throws(() => {
386+
const vQuery = new VectorQuery('vector_field', testVector)
387+
vQuery.prefilter(new VectorQuery('vector_field1', testVector))
388+
}, H.lib.InvalidArgumentError)
385389
assert.throws(() => {
386390
new VectorQuery('', testVector)
387391
}, H.lib.InvalidArgumentError)

0 commit comments

Comments
 (0)