mirror of
https://github.com/lancedb/lancedb.git
synced 2026-05-24 23:40:39 +00:00
feat: support a bunch or FTS features in JS SDK (#2431)
- operator for match query - slop for phrase query - boolean query <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit - **New Features** - Introduced support for boolean full-text search queries with AND/OR logic and occurrence conditions. - Added operator options for match and multi-match queries to control term combination logic. - Enabled phrase queries to specify proximity (slop) for flexible phrase matching. - Added new enumerations (`Operator`, `Occur`) and the `BooleanQuery` class for enhanced query expressiveness. - **Bug Fixes** - Improved validation and error handling for invalid operator and occurrence inputs in full-text queries. - **Tests** - Expanded test coverage with new cases for boolean queries and operator-based full-text searches. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Signed-off-by: BubbleCal <bubble-cal@outlook.com>
This commit is contained in:
@@ -64,7 +64,10 @@ export {
|
||||
PhraseQuery,
|
||||
BoostQuery,
|
||||
MultiMatchQuery,
|
||||
BooleanQuery,
|
||||
FullTextQueryType,
|
||||
Operator,
|
||||
Occur,
|
||||
} from "./query";
|
||||
|
||||
export {
|
||||
|
||||
@@ -762,6 +762,29 @@ export enum FullTextQueryType {
|
||||
MatchPhrase = "match_phrase",
|
||||
Boost = "boost",
|
||||
MultiMatch = "multi_match",
|
||||
Boolean = "boolean",
|
||||
}
|
||||
|
||||
/**
|
||||
* Enum representing the logical operators used in full-text queries.
|
||||
*
|
||||
* - `And`: All terms must match.
|
||||
* - `Or`: At least one term must match.
|
||||
*/
|
||||
export enum Operator {
|
||||
And = "AND",
|
||||
Or = "OR",
|
||||
}
|
||||
|
||||
/**
|
||||
* Enum representing the occurrence of terms in full-text queries.
|
||||
*
|
||||
* - `Must`: The term must be present in the document.
|
||||
* - `Should`: The term should contribute to the document score, but is not required.
|
||||
*/
|
||||
export enum Occur {
|
||||
Must = "MUST",
|
||||
Should = "SHOULD",
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -791,6 +814,7 @@ export function instanceOfFullTextQuery(obj: any): obj is FullTextQuery {
|
||||
export class MatchQuery implements FullTextQuery {
|
||||
/** @ignore */
|
||||
public readonly inner: JsFullTextQuery;
|
||||
|
||||
/**
|
||||
* Creates an instance of MatchQuery.
|
||||
*
|
||||
@@ -800,6 +824,7 @@ export class MatchQuery implements FullTextQuery {
|
||||
* - `boost`: The boost factor for the query (default is 1.0).
|
||||
* - `fuzziness`: The fuzziness level for the query (default is 0).
|
||||
* - `maxExpansions`: The maximum number of terms to consider for fuzzy matching (default is 50).
|
||||
* - `operator`: The logical operator to use for combining terms in the query (default is "OR").
|
||||
*/
|
||||
constructor(
|
||||
query: string,
|
||||
@@ -808,6 +833,7 @@ export class MatchQuery implements FullTextQuery {
|
||||
boost?: number;
|
||||
fuzziness?: number;
|
||||
maxExpansions?: number;
|
||||
operator?: Operator;
|
||||
},
|
||||
) {
|
||||
let fuzziness = options?.fuzziness;
|
||||
@@ -820,6 +846,7 @@ export class MatchQuery implements FullTextQuery {
|
||||
options?.boost ?? 1.0,
|
||||
fuzziness,
|
||||
options?.maxExpansions ?? 50,
|
||||
options?.operator ?? Operator.Or,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -836,9 +863,11 @@ export class PhraseQuery implements FullTextQuery {
|
||||
*
|
||||
* @param query - The phrase to search for in the specified column.
|
||||
* @param column - The name of the column to search within.
|
||||
* @param options - Optional parameters for the phrase query.
|
||||
* - `slop`: The maximum number of intervening unmatched positions allowed between words in the phrase (default is 0).
|
||||
*/
|
||||
constructor(query: string, column: string) {
|
||||
this.inner = JsFullTextQuery.phraseQuery(query, column);
|
||||
constructor(query: string, column: string, options?: { slop?: number }) {
|
||||
this.inner = JsFullTextQuery.phraseQuery(query, column, options?.slop ?? 0);
|
||||
}
|
||||
|
||||
queryType(): FullTextQueryType {
|
||||
@@ -889,18 +918,21 @@ export class MultiMatchQuery implements FullTextQuery {
|
||||
* @param columns - An array of column names to search within.
|
||||
* @param options - Optional parameters for the multi-match query.
|
||||
* - `boosts`: An array of boost factors for each column (default is 1.0 for all).
|
||||
* - `operator`: The logical operator to use for combining terms in the query (default is "OR").
|
||||
*/
|
||||
constructor(
|
||||
query: string,
|
||||
columns: string[],
|
||||
options?: {
|
||||
boosts?: number[];
|
||||
operator?: Operator;
|
||||
},
|
||||
) {
|
||||
this.inner = JsFullTextQuery.multiMatchQuery(
|
||||
query,
|
||||
columns,
|
||||
options?.boosts,
|
||||
options?.operator ?? Operator.Or,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -908,3 +940,23 @@ export class MultiMatchQuery implements FullTextQuery {
|
||||
return FullTextQueryType.MultiMatch;
|
||||
}
|
||||
}
|
||||
|
||||
export class BooleanQuery implements FullTextQuery {
|
||||
/** @ignore */
|
||||
public readonly inner: JsFullTextQuery;
|
||||
/**
|
||||
* Creates an instance of BooleanQuery.
|
||||
*
|
||||
* @param queries - An array of (Occur, FullTextQuery objects) to combine.
|
||||
* Occur specifies whether the query must match, or should match.
|
||||
*/
|
||||
constructor(queries: [Occur, FullTextQuery][]) {
|
||||
this.inner = JsFullTextQuery.booleanQuery(
|
||||
queries.map(([occur, query]) => [occur, query.inner]),
|
||||
);
|
||||
}
|
||||
|
||||
queryType(): FullTextQueryType {
|
||||
return FullTextQueryType.Boolean;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user