@usereactify/search 5.60.0-beta.0 → 5.60.0-beta.1
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/CHANGELOG.md +16 -2
- package/dist/package.json +1 -1
- package/dist/src/components/Sensor/SensorSearchTerm.d.ts +1 -2
- package/dist/src/components/Sensor/SensorSearchTerm.js +38 -120
- package/dist/src/components/Sensor/SensorSearchTerm.js.map +1 -1
- package/dist/src/components/Sensor/Sensors.d.ts +1 -3
- package/dist/src/components/Sensor/Sensors.js +10 -29
- package/dist/src/components/Sensor/Sensors.js.map +1 -1
- package/dist/src/components/Sensor/index.d.ts +0 -2
- package/dist/src/components/Sensor/index.js +0 -4
- package/dist/src/components/Sensor/index.js.map +1 -1
- package/dist/src/search-request-builder/base-builders.d.ts +18 -0
- package/dist/src/search-request-builder/base-builders.js +184 -0
- package/dist/src/search-request-builder/base-builders.js.map +1 -0
- package/dist/src/search-request-builder/curation-builders.d.ts +2 -0
- package/dist/src/search-request-builder/curation-builders.js +44 -0
- package/dist/src/search-request-builder/curation-builders.js.map +1 -0
- package/dist/src/search-request-builder/index.d.ts +3 -0
- package/dist/src/search-request-builder/index.js +12 -0
- package/dist/src/search-request-builder/index.js.map +1 -0
- package/dist/src/search-request-builder/search-request-builder.d.ts +3 -0
- package/dist/src/search-request-builder/search-request-builder.js +54 -0
- package/dist/src/search-request-builder/search-request-builder.js.map +1 -0
- package/dist/src/search-request-builder/types.d.ts +105 -0
- package/dist/src/search-request-builder/types.js +30 -0
- package/dist/src/search-request-builder/types.js.map +1 -0
- package/dist/src/search-request-builder/utils.d.ts +27 -0
- package/dist/src/search-request-builder/utils.js +144 -0
- package/dist/src/search-request-builder/utils.js.map +1 -0
- package/dist/src/types/elastic.d.ts +6 -9
- package/dist/src/types/elastic.js.map +1 -1
- package/dist/src/types/firestore.d.ts +2 -2
- package/dist/src/types/firestore.js.map +1 -1
- package/dist/src/utility/config.d.ts +2 -2
- package/dist/src/utility/config.js +5 -8
- package/dist/src/utility/config.js.map +1 -1
- package/dist/src/utility/props.d.ts +5 -224
- package/dist/src/utility/props.js +54 -101
- package/dist/src/utility/props.js.map +1 -1
- package/dist/src/utility/server.js +1 -1
- package/dist/src/utility/server.js.map +1 -1
- package/package.json +1 -1
- package/dist/src/components/Sensor/SensorCollectionWeighted.d.ts +0 -1
- package/dist/src/components/Sensor/SensorCollectionWeighted.js +0 -21
- package/dist/src/components/Sensor/SensorCollectionWeighted.js.map +0 -1
- package/dist/src/components/Sensor/SensorSearchWeighted.d.ts +0 -1
- package/dist/src/components/Sensor/SensorSearchWeighted.js +0 -22
- package/dist/src/components/Sensor/SensorSearchWeighted.js.map +0 -1
- package/dist/src/utility/queries.d.ts +0 -393
- package/dist/src/utility/queries.js +0 -197
- package/dist/src/utility/queries.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,12 +2,26 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
|
4
4
|
|
|
5
|
-
## [5.60.0-beta.
|
|
5
|
+
## [5.60.0-beta.1](///compare/beta-v5.59.0-beta.8...beta-v5.60.0-beta.1) (2026-01-15)
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
### Features
|
|
9
9
|
|
|
10
|
-
* add configBaseUrl
|
|
10
|
+
* add configBaseUrl prop to ReactifySearchProvider d585de4
|
|
11
|
+
* Implement modular search request builder 2975d84
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
### Bug Fixes
|
|
15
|
+
|
|
16
|
+
* reposition product card weight component to card level 4a387eb
|
|
17
|
+
|
|
18
|
+
## [5.60.0-beta.0](///compare/beta-v5.59.0-beta.8...beta-v5.60.0-beta.0) (2026-01-15)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
### Features
|
|
22
|
+
|
|
23
|
+
* add configBaseUrl prop to ReactifySearchProvider d585de4
|
|
24
|
+
* Implement modular search request builder 2975d84
|
|
11
25
|
|
|
12
26
|
|
|
13
27
|
### Bug Fixes
|
package/dist/package.json
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
export declare const SensorSearchTerm: React.FC;
|
|
1
|
+
export declare function SensorSearchTerm(): JSX.Element | null;
|
|
@@ -1,28 +1,42 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
2
25
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
26
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
27
|
};
|
|
5
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.SensorSearchTerm =
|
|
7
|
-
const react_1 =
|
|
29
|
+
exports.SensorSearchTerm = SensorSearchTerm;
|
|
30
|
+
const react_1 = __importStar(require("react"));
|
|
8
31
|
const ahooks_1 = require("ahooks");
|
|
9
32
|
const DataSearch_1 = __importDefault(require("@usereactify/search-internals/lib/components/search/DataSearch"));
|
|
10
33
|
const hooks_1 = require("../../hooks");
|
|
11
|
-
const
|
|
34
|
+
const props_1 = require("../../utility/props");
|
|
35
|
+
function SensorSearchTerm() {
|
|
12
36
|
const { options, config } = (0, hooks_1.useReactifySearchContext)();
|
|
13
37
|
const { track } = (0, hooks_1.useAnalytics)();
|
|
14
38
|
const { searchTerm } = (0, hooks_1.useSearch)();
|
|
15
|
-
const [searchTermDebounced, setSearchTermDebounced] = react_1.
|
|
16
|
-
// ignore search fields only set for instant search
|
|
17
|
-
const searchFields = react_1.default.useMemo(() => {
|
|
18
|
-
if (options.mode === "search") {
|
|
19
|
-
return config.fields.filter((field) => ["always_search", "search_page"].includes(field.searchType));
|
|
20
|
-
}
|
|
21
|
-
if (options.mode === "instant-search") {
|
|
22
|
-
return config.fields.filter((field) => ["always_search", "instant_search"].includes(field.searchType));
|
|
23
|
-
}
|
|
24
|
-
return [];
|
|
25
|
-
}, [config.fields]);
|
|
39
|
+
const [searchTermDebounced, setSearchTermDebounced] = (0, react_1.useState)(searchTerm);
|
|
26
40
|
const { run: runDebouncedTriggerQuery, cancel: cancelDebouncedTriggerQuery } = (0, ahooks_1.useDebounceFn)((value) => {
|
|
27
41
|
setSearchTermDebounced(value);
|
|
28
42
|
let trimmedSearchTerm = searchTerm.trim();
|
|
@@ -30,114 +44,18 @@ const SensorSearchTerm = () => {
|
|
|
30
44
|
return;
|
|
31
45
|
track({ eventName: "search", payload: { searchTerm: trimmedSearchTerm } });
|
|
32
46
|
}, { wait: 300 });
|
|
33
|
-
react_1.
|
|
47
|
+
(0, react_1.useEffect)(() => {
|
|
34
48
|
runDebouncedTriggerQuery(searchTerm);
|
|
35
49
|
}, [searchTerm]);
|
|
36
|
-
|
|
50
|
+
const reactiveProps = (0, props_1.getPropsSensorSearchTerm)({
|
|
51
|
+
config: config,
|
|
52
|
+
provider: options,
|
|
53
|
+
searchTerm: searchTermDebounced,
|
|
54
|
+
});
|
|
55
|
+
if (!reactiveProps) {
|
|
37
56
|
return null;
|
|
57
|
+
}
|
|
38
58
|
return (react_1.default.createElement(react_1.default.Fragment, null,
|
|
39
|
-
react_1.default.createElement(DataSearch_1.default, { fuzziness: 1, queryFormat: "and", autosuggest: false, value: searchTermDebounced, componentId: "SensorSearchTerm", style: { display: "none" }, dataField:
|
|
40
|
-
|
|
41
|
-
const conditions = [];
|
|
42
|
-
if (valueNormal) {
|
|
43
|
-
if (options.market) {
|
|
44
|
-
conditions.push({
|
|
45
|
-
nested: {
|
|
46
|
-
path: "curations",
|
|
47
|
-
query: {
|
|
48
|
-
bool: {
|
|
49
|
-
must: [
|
|
50
|
-
{
|
|
51
|
-
term: {
|
|
52
|
-
"curations.searchTerm.keyword": valueNormal,
|
|
53
|
-
},
|
|
54
|
-
},
|
|
55
|
-
{
|
|
56
|
-
term: {
|
|
57
|
-
"curations.markets.keyword": options.market,
|
|
58
|
-
},
|
|
59
|
-
},
|
|
60
|
-
],
|
|
61
|
-
},
|
|
62
|
-
},
|
|
63
|
-
},
|
|
64
|
-
});
|
|
65
|
-
}
|
|
66
|
-
else {
|
|
67
|
-
conditions.push({
|
|
68
|
-
nested: {
|
|
69
|
-
path: "curations",
|
|
70
|
-
query: {
|
|
71
|
-
term: {
|
|
72
|
-
"curations.searchTerm.keyword": valueNormal,
|
|
73
|
-
},
|
|
74
|
-
},
|
|
75
|
-
},
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
const fieldsPhrase = props.dataField.map((field, index) => `${field}^${props.fieldWeights[index]}`);
|
|
80
|
-
if (fieldsPhrase.length > 0) {
|
|
81
|
-
conditions.push({
|
|
82
|
-
multi_match: {
|
|
83
|
-
query: valueNormal,
|
|
84
|
-
fields: fieldsPhrase,
|
|
85
|
-
type: "phrase",
|
|
86
|
-
operator: "and",
|
|
87
|
-
},
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
|
-
const fieldsPhrasePrefix = props.dataField
|
|
91
|
-
.map((field, index) => `${field}^${props.fieldWeights[index]}`)
|
|
92
|
-
.filter((field) => !field.includes("."));
|
|
93
|
-
if (fieldsPhrasePrefix.length > 0) {
|
|
94
|
-
conditions.push({
|
|
95
|
-
multi_match: {
|
|
96
|
-
query: valueNormal,
|
|
97
|
-
fields: fieldsPhrasePrefix,
|
|
98
|
-
type: "phrase_prefix",
|
|
99
|
-
operator: "and",
|
|
100
|
-
},
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
const fieldsCrossFields = props.dataField.map((field, index) => `${field}^${props.fieldWeights[index]}`);
|
|
104
|
-
if (fieldsCrossFields.length > 0) {
|
|
105
|
-
conditions.push({
|
|
106
|
-
multi_match: {
|
|
107
|
-
query: valueNormal,
|
|
108
|
-
fields: fieldsCrossFields,
|
|
109
|
-
type: "cross_fields",
|
|
110
|
-
operator: "and",
|
|
111
|
-
},
|
|
112
|
-
});
|
|
113
|
-
}
|
|
114
|
-
const fieldsSpanFirst = props.dataField
|
|
115
|
-
.filter((field) => {
|
|
116
|
-
if (field.endsWith(".keyword")) {
|
|
117
|
-
return false;
|
|
118
|
-
}
|
|
119
|
-
return true;
|
|
120
|
-
})
|
|
121
|
-
.map((field) => ({
|
|
122
|
-
span_first: {
|
|
123
|
-
match: {
|
|
124
|
-
span_term: { [`${field}`]: valueNormal },
|
|
125
|
-
},
|
|
126
|
-
end: 1,
|
|
127
|
-
},
|
|
128
|
-
}));
|
|
129
|
-
if (fieldsSpanFirst.length > 0) {
|
|
130
|
-
conditions.push(...fieldsSpanFirst);
|
|
131
|
-
}
|
|
132
|
-
return {
|
|
133
|
-
query: {
|
|
134
|
-
bool: {
|
|
135
|
-
should: conditions,
|
|
136
|
-
minimum_should_match: "1",
|
|
137
|
-
},
|
|
138
|
-
},
|
|
139
|
-
};
|
|
140
|
-
} })));
|
|
141
|
-
};
|
|
142
|
-
exports.SensorSearchTerm = SensorSearchTerm;
|
|
59
|
+
react_1.default.createElement(DataSearch_1.default, { fuzziness: 1, queryFormat: "and", autosuggest: false, value: searchTermDebounced, componentId: "SensorSearchTerm", style: { display: "none" }, dataField: reactiveProps.dataField, fieldWeights: reactiveProps.fieldWeights, customQuery: reactiveProps.customQuery })));
|
|
60
|
+
}
|
|
143
61
|
//# sourceMappingURL=SensorSearchTerm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SensorSearchTerm.js","sourceRoot":"","sources":["../../../../src/components/Sensor/SensorSearchTerm.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"SensorSearchTerm.js","sourceRoot":"","sources":["../../../../src/components/Sensor/SensorSearchTerm.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,4CA8CC;AArDD,+CAAmD;AACnD,mCAAuC;AACvC,gHAAwF;AAExF,uCAAgF;AAChF,+CAA+D;AAE/D,SAAgB,gBAAgB;IAC9B,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAA,gCAAwB,GAAE,CAAC;IACvD,MAAM,EAAE,KAAK,EAAE,GAAG,IAAA,oBAAY,GAAE,CAAC;IACjC,MAAM,EAAE,UAAU,EAAE,GAAG,IAAA,iBAAS,GAAE,CAAC;IAEnC,MAAM,CAAC,mBAAmB,EAAE,sBAAsB,CAAC,GAAG,IAAA,gBAAQ,EAAS,UAAU,CAAC,CAAC;IAEnF,MAAM,EAAE,GAAG,EAAE,wBAAwB,EAAE,MAAM,EAAE,2BAA2B,EAAE,GAAG,IAAA,sBAAa,EAC1F,CAAC,KAAa,EAAE,EAAE;QAChB,sBAAsB,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAI,iBAAiB,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC;QAC1C,IAAI,CAAC,iBAAiB,IAAI,CAAC,iBAAiB,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC;YAAE,OAAO;QACtF,KAAK,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,iBAAiB,EAAE,EAAE,CAAC,CAAC;IAC7E,CAAC,EACD,EAAE,IAAI,EAAE,GAAG,EAAE,CACd,CAAC;IAEF,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,wBAAwB,CAAC,UAAU,CAAC,CAAC;IACvC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAEjB,MAAM,aAAa,GAAG,IAAA,gCAAwB,EAAC;QAC7C,MAAM,EAAE,MAAM;QACd,QAAQ,EAAE,OAAO;QACjB,UAAU,EAAE,mBAAmB;KAChC,CAAC,CAAC;IAEH,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CACL;QACE,8BAAC,oBAAU,IACT,SAAS,EAAE,CAAC,EACZ,WAAW,EAAC,KAAK,EACjB,WAAW,EAAE,KAAK,EAClB,KAAK,EAAE,mBAAmB,EAC1B,WAAW,EAAC,kBAAkB,EAC9B,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAC1B,SAAS,EAAE,aAAa,CAAC,SAAS,EAClC,YAAY,EAAE,aAAa,CAAC,YAAY,EACxC,WAAW,EAAE,aAAa,CAAC,WAAW,GACtC,CACD,CACJ,CAAC;AACJ,CAAC","sourcesContent":["import React, { useEffect, useState } from \"react\";\nimport { useDebounceFn } from \"ahooks\";\nimport DataSearch from \"@usereactify/search-internals/lib/components/search/DataSearch\";\n\nimport { useAnalytics, useReactifySearchContext, useSearch } from \"../../hooks\";\nimport { getPropsSensorSearchTerm } from \"../../utility/props\";\n\nexport function SensorSearchTerm() {\n const { options, config } = useReactifySearchContext();\n const { track } = useAnalytics();\n const { searchTerm } = useSearch();\n\n const [searchTermDebounced, setSearchTermDebounced] = useState<string>(searchTerm);\n\n const { run: runDebouncedTriggerQuery, cancel: cancelDebouncedTriggerQuery } = useDebounceFn(\n (value: string) => {\n setSearchTermDebounced(value);\n let trimmedSearchTerm = searchTerm.trim();\n if (!trimmedSearchTerm || (trimmedSearchTerm && trimmedSearchTerm.length < 3)) return;\n track({ eventName: \"search\", payload: { searchTerm: trimmedSearchTerm } });\n },\n { wait: 300 }\n );\n\n useEffect(() => {\n runDebouncedTriggerQuery(searchTerm);\n }, [searchTerm]);\n\n const reactiveProps = getPropsSensorSearchTerm({\n config: config,\n provider: options,\n searchTerm: searchTermDebounced,\n });\n\n if (!reactiveProps) {\n return null;\n }\n\n return (\n <>\n <DataSearch\n fuzziness={1}\n queryFormat=\"and\"\n autosuggest={false}\n value={searchTermDebounced}\n componentId=\"SensorSearchTerm\"\n style={{ display: \"none\" }}\n dataField={reactiveProps.dataField}\n fieldWeights={reactiveProps.fieldWeights}\n customQuery={reactiveProps.customQuery}\n />\n </>\n );\n}\n"]}
|
|
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.Sensors =
|
|
6
|
+
exports.Sensors = Sensors;
|
|
7
7
|
const react_1 = __importDefault(require("react"));
|
|
8
8
|
const hooks_1 = require("../../hooks");
|
|
9
9
|
const SensorSort_1 = require("./SensorSort");
|
|
@@ -12,49 +12,30 @@ const SensorCollection_1 = require("./SensorCollection");
|
|
|
12
12
|
const SensorSearchTerm_1 = require("./SensorSearchTerm");
|
|
13
13
|
const SensorInventoryAvailable_1 = require("./SensorInventoryAvailable");
|
|
14
14
|
const SensorCustom_1 = require("./SensorCustom");
|
|
15
|
-
const SensorCollectionWeighted_1 = require("./SensorCollectionWeighted");
|
|
16
|
-
const SensorSearchWeighted_1 = require("./SensorSearchWeighted");
|
|
17
15
|
const SensorExplain_1 = require("./SensorExplain");
|
|
18
|
-
|
|
19
|
-
var _a, _b
|
|
16
|
+
function Sensors() {
|
|
17
|
+
var _a, _b;
|
|
20
18
|
const { config, options } = (0, hooks_1.useReactifySearchContext)();
|
|
21
|
-
const
|
|
22
|
-
|
|
19
|
+
const isWeighted = ((_a = config.featureFlags) === null || _a === void 0 ? void 0 : _a.includes("use_weighted_base_search_request")) ||
|
|
20
|
+
((_b = config.featureFlags) === null || _b === void 0 ? void 0 : _b.includes("use_weighted_curation_search_request"));
|
|
23
21
|
if (options.mode === "search" || options.mode === "instant-search") {
|
|
24
|
-
if (useWeightedBaseSearchRequest) {
|
|
25
|
-
return (react_1.default.createElement(react_1.default.Fragment, null,
|
|
26
|
-
react_1.default.createElement(SensorSort_1.SensorSort, null),
|
|
27
|
-
react_1.default.createElement(SensorPublished_1.SensorPublished, null),
|
|
28
|
-
react_1.default.createElement(SensorSearchWeighted_1.SensorSearchWeighted, null),
|
|
29
|
-
react_1.default.createElement(SensorInventoryAvailable_1.SensorInventoryAvailable, null),
|
|
30
|
-
react_1.default.createElement(SensorCustom_1.SensorCustom, null),
|
|
31
|
-
react_1.default.createElement(SensorExplain_1.SensorExplain, null)));
|
|
32
|
-
}
|
|
33
22
|
return (react_1.default.createElement(react_1.default.Fragment, null,
|
|
34
23
|
react_1.default.createElement(SensorSort_1.SensorSort, null),
|
|
35
24
|
react_1.default.createElement(SensorPublished_1.SensorPublished, null),
|
|
36
25
|
react_1.default.createElement(SensorSearchTerm_1.SensorSearchTerm, null),
|
|
37
26
|
react_1.default.createElement(SensorInventoryAvailable_1.SensorInventoryAvailable, null),
|
|
38
|
-
react_1.default.createElement(SensorCustom_1.SensorCustom, null)
|
|
27
|
+
react_1.default.createElement(SensorCustom_1.SensorCustom, null),
|
|
28
|
+
isWeighted && react_1.default.createElement(SensorExplain_1.SensorExplain, null)));
|
|
39
29
|
}
|
|
40
30
|
if (options.mode === "collection") {
|
|
41
|
-
if (useWeightedCurationSearchRequest) {
|
|
42
|
-
return (react_1.default.createElement(react_1.default.Fragment, null,
|
|
43
|
-
react_1.default.createElement(SensorSort_1.SensorSort, null),
|
|
44
|
-
react_1.default.createElement(SensorPublished_1.SensorPublished, null),
|
|
45
|
-
react_1.default.createElement(SensorCollectionWeighted_1.SensorCollectionWeighted, null),
|
|
46
|
-
react_1.default.createElement(SensorInventoryAvailable_1.SensorInventoryAvailable, null),
|
|
47
|
-
react_1.default.createElement(SensorCustom_1.SensorCustom, null),
|
|
48
|
-
react_1.default.createElement(SensorExplain_1.SensorExplain, null)));
|
|
49
|
-
}
|
|
50
31
|
return (react_1.default.createElement(react_1.default.Fragment, null,
|
|
51
32
|
react_1.default.createElement(SensorSort_1.SensorSort, null),
|
|
52
33
|
react_1.default.createElement(SensorPublished_1.SensorPublished, null),
|
|
53
34
|
react_1.default.createElement(SensorCollection_1.SensorCollection, null),
|
|
54
35
|
react_1.default.createElement(SensorInventoryAvailable_1.SensorInventoryAvailable, null),
|
|
55
|
-
react_1.default.createElement(SensorCustom_1.SensorCustom, null)
|
|
36
|
+
react_1.default.createElement(SensorCustom_1.SensorCustom, null),
|
|
37
|
+
isWeighted && react_1.default.createElement(SensorExplain_1.SensorExplain, null)));
|
|
56
38
|
}
|
|
57
39
|
return null;
|
|
58
|
-
}
|
|
59
|
-
exports.Sensors = Sensors;
|
|
40
|
+
}
|
|
60
41
|
//# sourceMappingURL=Sensors.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Sensors.js","sourceRoot":"","sources":["../../../../src/components/Sensor/Sensors.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Sensors.js","sourceRoot":"","sources":["../../../../src/components/Sensor/Sensors.tsx"],"names":[],"mappings":";;;;;AAaA,0BAkCC;AA/CD,kDAA0B;AAE1B,uCAAuD;AAEvD,6CAA0C;AAC1C,uDAAoD;AACpD,yDAAsD;AACtD,yDAAsD;AACtD,yEAAsE;AACtE,iDAA8C;AAE9C,mDAAgD;AAEhD,SAAgB,OAAO;;IACrB,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAA,gCAAwB,GAAE,CAAC;IAEvD,MAAM,UAAU,GACd,CAAA,MAAA,MAAM,CAAC,YAAY,0CAAE,QAAQ,CAAC,kCAAkC,CAAC;SACjE,MAAA,MAAM,CAAC,YAAY,0CAAE,QAAQ,CAAC,sCAAsC,CAAC,CAAA,CAAC;IAExE,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;QACnE,OAAO,CACL;YACE,8BAAC,uBAAU,OAAG;YACd,8BAAC,iCAAe,OAAG;YACnB,8BAAC,mCAAgB,OAAG;YACpB,8BAAC,mDAAwB,OAAG;YAC5B,8BAAC,2BAAY,OAAG;YACf,UAAU,IAAI,8BAAC,6BAAa,OAAG,CAC/B,CACJ,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QAClC,OAAO,CACL;YACE,8BAAC,uBAAU,OAAG;YACd,8BAAC,iCAAe,OAAG;YACnB,8BAAC,mCAAgB,OAAG;YACpB,8BAAC,mDAAwB,OAAG;YAC5B,8BAAC,2BAAY,OAAG;YACf,UAAU,IAAI,8BAAC,6BAAa,OAAG,CAC/B,CACJ,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC","sourcesContent":["import React from \"react\";\n\nimport { useReactifySearchContext } from \"../../hooks\";\n\nimport { SensorSort } from \"./SensorSort\";\nimport { SensorPublished } from \"./SensorPublished\";\nimport { SensorCollection } from \"./SensorCollection\";\nimport { SensorSearchTerm } from \"./SensorSearchTerm\";\nimport { SensorInventoryAvailable } from \"./SensorInventoryAvailable\";\nimport { SensorCustom } from \"./SensorCustom\";\n\nimport { SensorExplain } from \"./SensorExplain\";\n\nexport function Sensors() {\n const { config, options } = useReactifySearchContext();\n\n const isWeighted =\n config.featureFlags?.includes(\"use_weighted_base_search_request\") ||\n config.featureFlags?.includes(\"use_weighted_curation_search_request\");\n\n if (options.mode === \"search\" || options.mode === \"instant-search\") {\n return (\n <>\n <SensorSort />\n <SensorPublished />\n <SensorSearchTerm />\n <SensorInventoryAvailable />\n <SensorCustom />\n {isWeighted && <SensorExplain />}\n </>\n );\n }\n\n if (options.mode === \"collection\") {\n return (\n <>\n <SensorSort />\n <SensorPublished />\n <SensorCollection />\n <SensorInventoryAvailable />\n <SensorCustom />\n {isWeighted && <SensorExplain />}\n </>\n );\n }\n\n return null;\n}\n"]}
|
|
@@ -5,8 +5,6 @@ export * from "./SensorPublished";
|
|
|
5
5
|
export * from "./SensorCollection";
|
|
6
6
|
export * from "./SensorSearchTerm";
|
|
7
7
|
export * from "./SensorInventoryAvailable";
|
|
8
|
-
export * from "./SensorCollectionWeighted";
|
|
9
|
-
export * from "./SensorSearchWeighted";
|
|
10
8
|
export * from "./SensorExplain";
|
|
11
9
|
export * from "./Sensors";
|
|
12
10
|
export declare const SENSOR_IDS: (mode: ReactifySearchMode, config: Config, variation?: string) => string[];
|
|
@@ -20,8 +20,6 @@ __exportStar(require("./SensorPublished"), exports);
|
|
|
20
20
|
__exportStar(require("./SensorCollection"), exports);
|
|
21
21
|
__exportStar(require("./SensorSearchTerm"), exports);
|
|
22
22
|
__exportStar(require("./SensorInventoryAvailable"), exports);
|
|
23
|
-
__exportStar(require("./SensorCollectionWeighted"), exports);
|
|
24
|
-
__exportStar(require("./SensorSearchWeighted"), exports);
|
|
25
23
|
__exportStar(require("./SensorExplain"), exports);
|
|
26
24
|
__exportStar(require("./Sensors"), exports);
|
|
27
25
|
// This is consumed by the react prop in various components
|
|
@@ -32,8 +30,6 @@ const SENSOR_IDS = (mode, config, variation) => {
|
|
|
32
30
|
"SensorCollection",
|
|
33
31
|
"SensorSearchTerm",
|
|
34
32
|
"SensorInventoryAvailable",
|
|
35
|
-
"SensorCollectionWeighted",
|
|
36
|
-
"SensorSearchWeighted",
|
|
37
33
|
"SensorExplain",
|
|
38
34
|
];
|
|
39
35
|
const sensorType = mode === "collection" ? "collection" : "search";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/Sensor/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAGA,+CAA6B;AAC7B,oDAAkC;AAClC,qDAAmC;AACnC,qDAAmC;AACnC,6DAA2C;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/Sensor/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAGA,+CAA6B;AAC7B,oDAAkC;AAClC,qDAAmC;AACnC,qDAAmC;AACnC,6DAA2C;AAE3C,kDAAgC;AAEhC,4CAA0B;AAE1B,2DAA2D;AACpD,MAAM,UAAU,GAAG,CAAC,IAAwB,EAAE,MAAc,EAAE,SAAkB,EAAE,EAAE;IACzF,MAAM,SAAS,GAAG;QAChB,YAAY;QACZ,iBAAiB;QACjB,kBAAkB;QAClB,kBAAkB;QAClB,0BAA0B;QAC1B,eAAe;KAChB,CAAC;IAEF,MAAM,UAAU,GAAG,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC;IAEnE,MAAM,aAAa,GAAG,UAAU,KAAK,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;IACtG,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,SAAS,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,gBAAgB,KAAK,EAAE,CAAC,CAAC,CAAC;IACjF,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAlBW,QAAA,UAAU,cAkBrB","sourcesContent":["import { ReactifySearchMode } from \"../../hooks\";\nimport { Config } from \"../../types\";\n\nexport * from \"./SensorSort\";\nexport * from \"./SensorPublished\";\nexport * from \"./SensorCollection\";\nexport * from \"./SensorSearchTerm\";\nexport * from \"./SensorInventoryAvailable\";\n\nexport * from \"./SensorExplain\";\n\nexport * from \"./Sensors\";\n\n// This is consumed by the react prop in various components\nexport const SENSOR_IDS = (mode: ReactifySearchMode, config: Config, variation?: string) => {\n const sensorIds = [\n \"SensorSort\",\n \"SensorPublished\",\n \"SensorCollection\",\n \"SensorSearchTerm\",\n \"SensorInventoryAvailable\",\n \"SensorExplain\",\n ];\n\n const sensorType = mode === \"collection\" ? \"collection\" : \"search\";\n\n const customSensors = sensorType === \"collection\" ? config.sensors.collection : config.sensors.search;\n if (customSensors.length > 0) {\n sensorIds.push(...customSensors.map((item, index) => `SensorCustom_${index}`));\n }\n\n return sensorIds;\n};\n"]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Boosting, SearchableField } from "../types/firestore";
|
|
2
|
+
import { FunctionScoreQuery, GenerateSearchRequestOptions, QueryContainer, SearchRequest, CollectionSearchRequestOptions } from "./types";
|
|
3
|
+
export declare function generateBaseSearchRequest(options: GenerateSearchRequestOptions): SearchRequest;
|
|
4
|
+
export declare function generateCollectionSearchRequest(options: CollectionSearchRequestOptions): SearchRequest;
|
|
5
|
+
export declare function generateCollectionBaseQuery(options: CollectionSearchRequestOptions): QueryContainer;
|
|
6
|
+
export declare function generateWeightedSearchQuery(options: {
|
|
7
|
+
searchTerm: string;
|
|
8
|
+
searchableFields: SearchableField[];
|
|
9
|
+
boostingRules: Boosting[];
|
|
10
|
+
markets: string[];
|
|
11
|
+
market?: string;
|
|
12
|
+
}): FunctionScoreQuery;
|
|
13
|
+
export declare function generateWeightedCollectionQuery(options: {
|
|
14
|
+
collectionHandle: string;
|
|
15
|
+
boostingRules: Boosting[];
|
|
16
|
+
markets: string[];
|
|
17
|
+
market?: string;
|
|
18
|
+
}): FunctionScoreQuery;
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateBaseSearchRequest = generateBaseSearchRequest;
|
|
4
|
+
exports.generateCollectionSearchRequest = generateCollectionSearchRequest;
|
|
5
|
+
exports.generateCollectionBaseQuery = generateCollectionBaseQuery;
|
|
6
|
+
exports.generateWeightedSearchQuery = generateWeightedSearchQuery;
|
|
7
|
+
exports.generateWeightedCollectionQuery = generateWeightedCollectionQuery;
|
|
8
|
+
const types_1 = require("./types");
|
|
9
|
+
const utils_1 = require("./utils");
|
|
10
|
+
// Base Search Request Generation
|
|
11
|
+
function generateBaseSearchRequest(options) {
|
|
12
|
+
var _a, _b, _c, _d;
|
|
13
|
+
if ((0, types_1.isCollectionOptions)(options)) {
|
|
14
|
+
// Collection search mode
|
|
15
|
+
const markets = (_b = (_a = options.curation) === null || _a === void 0 ? void 0 : _a.markets) !== null && _b !== void 0 ? _b : [];
|
|
16
|
+
return generateCollectionSearchRequest({
|
|
17
|
+
collectionHandle: options.collectionHandle,
|
|
18
|
+
markets: markets,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
if ((0, types_1.isSearchOptions)(options)) {
|
|
22
|
+
// Term search mode
|
|
23
|
+
const markets = (_d = (_c = options.curation) === null || _c === void 0 ? void 0 : _c.markets) !== null && _d !== void 0 ? _d : [];
|
|
24
|
+
return generateTermSearchRequest({
|
|
25
|
+
searchTerm: options.searchTerm,
|
|
26
|
+
baseSearchRequestMode: options.baseSearchRequestMode,
|
|
27
|
+
relevanceFields: options.relevanceFields,
|
|
28
|
+
searchableFields: options.searchableFields,
|
|
29
|
+
markets: markets,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
throw new Error("Invalid options: must be either search or collection options");
|
|
33
|
+
}
|
|
34
|
+
// Term Search Request Generation
|
|
35
|
+
function generateTermSearchRequest(options) {
|
|
36
|
+
(0, utils_1.validateSearchInputs)(options);
|
|
37
|
+
if (options.baseSearchRequestMode === types_1.BaseSearchRequestMode.Weighted) {
|
|
38
|
+
return generateWeightedTermSearchRequest(options);
|
|
39
|
+
}
|
|
40
|
+
return generateRelevanceTermSearchRequest(options);
|
|
41
|
+
}
|
|
42
|
+
function generateWeightedTermSearchRequest(options) {
|
|
43
|
+
if (!options.searchableFields) {
|
|
44
|
+
throw new Error("SearchableFields required for weighted search");
|
|
45
|
+
}
|
|
46
|
+
const functionScoreQuery = generateWeightedSearchQuery({
|
|
47
|
+
searchTerm: options.searchTerm,
|
|
48
|
+
searchableFields: options.searchableFields,
|
|
49
|
+
boostingRules: [],
|
|
50
|
+
markets: options.markets,
|
|
51
|
+
});
|
|
52
|
+
return { query: { function_score: functionScoreQuery } };
|
|
53
|
+
}
|
|
54
|
+
function generateRelevanceTermSearchRequest(options) {
|
|
55
|
+
const fieldMappings = (0, utils_1.prepareRelevanceFields)(options.relevanceFields);
|
|
56
|
+
const multiMatchQueries = (0, utils_1.generateMultiMatchQueries)(options.searchTerm, fieldMappings);
|
|
57
|
+
const query = buildRelevanceQueryStructure(multiMatchQueries, options.markets);
|
|
58
|
+
return { query };
|
|
59
|
+
}
|
|
60
|
+
function buildRelevanceQueryStructure(multiMatchQueries, markets) {
|
|
61
|
+
return {
|
|
62
|
+
bool: {
|
|
63
|
+
must: [{ bool: { should: multiMatchQueries, minimum_should_match: "1" } }],
|
|
64
|
+
filter: (0, utils_1.generateMarketsFilter)(markets),
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
// Collection Search Request Generation
|
|
69
|
+
function generateCollectionSearchRequest(options) {
|
|
70
|
+
const query = generateCollectionBaseQuery(options);
|
|
71
|
+
return { query };
|
|
72
|
+
}
|
|
73
|
+
function generateCollectionBaseQuery(options) {
|
|
74
|
+
const mustClauses = [
|
|
75
|
+
{
|
|
76
|
+
nested: {
|
|
77
|
+
path: "collections",
|
|
78
|
+
query: {
|
|
79
|
+
term: { ["collections.handle"]: options.collectionHandle },
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
];
|
|
84
|
+
const marketClause = (0, utils_1.generateMarketsFilter)(options.markets);
|
|
85
|
+
if (marketClause.length > 0) {
|
|
86
|
+
mustClauses.push(...marketClause);
|
|
87
|
+
}
|
|
88
|
+
return { bool: { must: mustClauses } };
|
|
89
|
+
}
|
|
90
|
+
// Weighted Search Implementation - using corrected property names
|
|
91
|
+
function generateWeightedSearchQuery(options) {
|
|
92
|
+
var _a, _b;
|
|
93
|
+
const searchTerms = (_b = (_a = options.searchTerm) === null || _a === void 0 ? void 0 : _a.split(" ")) !== null && _b !== void 0 ? _b : [];
|
|
94
|
+
const searchQueries = [];
|
|
95
|
+
for (const searchableField of options.searchableFields) {
|
|
96
|
+
const baseField = searchableField.field;
|
|
97
|
+
const maxEdits = searchableField.maxEdits;
|
|
98
|
+
for (const searchTerm of searchTerms) {
|
|
99
|
+
searchQueries.push({
|
|
100
|
+
match: { [baseField]: { query: searchTerm, fuzziness: maxEdits, analyzer: "regular_analyzer" } },
|
|
101
|
+
});
|
|
102
|
+
if (searchableField.synonymEnabled) {
|
|
103
|
+
searchQueries.push({
|
|
104
|
+
match: { [baseField]: { query: searchTerm, fuzziness: maxEdits, analyzer: "synonym_analyzer" } },
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
const searchScores = [];
|
|
110
|
+
for (const field of options.searchableFields) {
|
|
111
|
+
const baseField = field.field;
|
|
112
|
+
const maxPoints = field.points;
|
|
113
|
+
const maxEdits = field.maxEdits;
|
|
114
|
+
for (let edits = 0; edits <= maxEdits; edits++) {
|
|
115
|
+
const weightMaxEdits = Math.max(maxPoints - maxEdits * (maxPoints / (100 / field.mistakePenaltyPercent)), 0);
|
|
116
|
+
const weightSomeEdits = maxPoints / (100 / field.mistakePenaltyPercent);
|
|
117
|
+
const weightBase = edits === maxEdits ? weightMaxEdits : weightSomeEdits;
|
|
118
|
+
for (const searchTerm of searchTerms) {
|
|
119
|
+
searchScores.push({
|
|
120
|
+
filter: {
|
|
121
|
+
match: { [baseField]: { query: searchTerm, fuzziness: edits, analyzer: "regular_analyzer" } },
|
|
122
|
+
},
|
|
123
|
+
weight: weightBase,
|
|
124
|
+
});
|
|
125
|
+
if (field.synonymEnabled && field.synonymPenaltyPercent > 0) {
|
|
126
|
+
const weightSynonyms = weightBase * (1 - field.synonymPenaltyPercent / 100);
|
|
127
|
+
searchScores.push({
|
|
128
|
+
filter: {
|
|
129
|
+
bool: {
|
|
130
|
+
must_not: {
|
|
131
|
+
match: { [baseField]: { query: searchTerm, fuzziness: edits, analyzer: "regular_analyzer" } },
|
|
132
|
+
},
|
|
133
|
+
must: {
|
|
134
|
+
match: { [baseField]: { query: searchTerm, fuzziness: edits, analyzer: "synonym_analyzer" } },
|
|
135
|
+
},
|
|
136
|
+
},
|
|
137
|
+
},
|
|
138
|
+
weight: weightSynonyms,
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
const marketClause = (0, utils_1.generateMarketsClause)(options.markets);
|
|
145
|
+
const boolQuery = { should: [...searchQueries] };
|
|
146
|
+
if (marketClause) {
|
|
147
|
+
boolQuery.filter = [marketClause];
|
|
148
|
+
}
|
|
149
|
+
return {
|
|
150
|
+
query: {
|
|
151
|
+
bool: boolQuery,
|
|
152
|
+
},
|
|
153
|
+
functions: [
|
|
154
|
+
...searchScores,
|
|
155
|
+
...(0, utils_1.generateBoostingRules)({ boostingRules: options.boostingRules, market: options.market }),
|
|
156
|
+
],
|
|
157
|
+
score_mode: "sum",
|
|
158
|
+
boost_mode: "replace",
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
function generateWeightedCollectionQuery(options) {
|
|
162
|
+
const mustClauses = [
|
|
163
|
+
{
|
|
164
|
+
nested: {
|
|
165
|
+
path: "collections",
|
|
166
|
+
query: {
|
|
167
|
+
term: { ["collections.handle"]: options.collectionHandle },
|
|
168
|
+
},
|
|
169
|
+
},
|
|
170
|
+
},
|
|
171
|
+
];
|
|
172
|
+
const marketClause = (0, utils_1.generateMarketsClause)(options.markets);
|
|
173
|
+
if (marketClause)
|
|
174
|
+
mustClauses.push(marketClause);
|
|
175
|
+
return {
|
|
176
|
+
query: {
|
|
177
|
+
bool: { must: mustClauses },
|
|
178
|
+
},
|
|
179
|
+
functions: (0, utils_1.generateBoostingRules)({ boostingRules: options.boostingRules, market: options.market }),
|
|
180
|
+
score_mode: "sum",
|
|
181
|
+
boost_mode: "replace",
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=base-builders.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-builders.js","sourceRoot":"","sources":["../../../src/search-request-builder/base-builders.ts"],"names":[],"mappings":"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","sourcesContent":["import { Boosting, SearchableField } from \"../types/firestore\";\nimport {\n BaseSearchRequestMode,\n FunctionScoreContainer,\n FunctionScoreQuery,\n GenerateSearchRequestOptions,\n QueryContainer,\n SearchRequest,\n TermSearchRequestOptions,\n CollectionSearchRequestOptions,\n isSearchOptions,\n isCollectionOptions,\n} from \"./types\";\nimport {\n generateBoostingRules,\n generateMarketsClause,\n generateMarketsFilter,\n generateMultiMatchQueries,\n prepareRelevanceFields,\n validateSearchInputs,\n} from \"./utils\";\n\n// Base Search Request Generation\nexport function generateBaseSearchRequest(options: GenerateSearchRequestOptions): SearchRequest {\n if (isCollectionOptions(options)) {\n // Collection search mode\n const markets = options.curation?.markets ?? [];\n return generateCollectionSearchRequest({\n collectionHandle: options.collectionHandle,\n markets: markets,\n });\n }\n\n if (isSearchOptions(options)) {\n // Term search mode\n const markets = options.curation?.markets ?? [];\n return generateTermSearchRequest({\n searchTerm: options.searchTerm,\n baseSearchRequestMode: options.baseSearchRequestMode,\n relevanceFields: options.relevanceFields,\n searchableFields: options.searchableFields,\n markets: markets,\n });\n }\n\n throw new Error(\"Invalid options: must be either search or collection options\");\n}\n\n// Term Search Request Generation\nfunction generateTermSearchRequest(options: TermSearchRequestOptions): SearchRequest {\n validateSearchInputs(options);\n\n if (options.baseSearchRequestMode === BaseSearchRequestMode.Weighted) {\n return generateWeightedTermSearchRequest(options);\n }\n\n return generateRelevanceTermSearchRequest(options);\n}\n\nfunction generateWeightedTermSearchRequest(options: TermSearchRequestOptions): SearchRequest {\n if (!options.searchableFields) {\n throw new Error(\"SearchableFields required for weighted search\");\n }\n\n const functionScoreQuery = generateWeightedSearchQuery({\n searchTerm: options.searchTerm,\n searchableFields: options.searchableFields,\n boostingRules: [],\n markets: options.markets,\n });\n\n return { query: { function_score: functionScoreQuery } };\n}\n\nfunction generateRelevanceTermSearchRequest(options: TermSearchRequestOptions): SearchRequest {\n const fieldMappings = prepareRelevanceFields(options.relevanceFields);\n const multiMatchQueries = generateMultiMatchQueries(options.searchTerm, fieldMappings);\n const query = buildRelevanceQueryStructure(multiMatchQueries, options.markets);\n return { query };\n}\n\nfunction buildRelevanceQueryStructure(multiMatchQueries: QueryContainer[], markets: string[]): QueryContainer {\n return {\n bool: {\n must: [{ bool: { should: multiMatchQueries, minimum_should_match: \"1\" } }],\n filter: generateMarketsFilter(markets),\n },\n };\n}\n\n// Collection Search Request Generation\nexport function generateCollectionSearchRequest(options: CollectionSearchRequestOptions): SearchRequest {\n const query = generateCollectionBaseQuery(options);\n return { query };\n}\n\nexport function generateCollectionBaseQuery(options: CollectionSearchRequestOptions): QueryContainer {\n const mustClauses: QueryContainer[] = [\n {\n nested: {\n path: \"collections\",\n query: {\n term: { [\"collections.handle\"]: options.collectionHandle },\n },\n },\n },\n ];\n\n const marketClause = generateMarketsFilter(options.markets);\n if (marketClause.length > 0) {\n mustClauses.push(...marketClause);\n }\n\n return { bool: { must: mustClauses } };\n}\n\n// Weighted Search Implementation - using corrected property names\nexport function generateWeightedSearchQuery(options: {\n searchTerm: string;\n searchableFields: SearchableField[];\n boostingRules: Boosting[];\n markets: string[];\n market?: string;\n}): FunctionScoreQuery {\n const searchTerms = options.searchTerm?.split(\" \") ?? [];\n\n const searchQueries: QueryContainer[] = [];\n for (const searchableField of options.searchableFields) {\n const baseField = searchableField.field;\n const maxEdits = searchableField.maxEdits;\n for (const searchTerm of searchTerms) {\n searchQueries.push({\n match: { [baseField]: { query: searchTerm, fuzziness: maxEdits, analyzer: \"regular_analyzer\" } },\n });\n if (searchableField.synonymEnabled) {\n searchQueries.push({\n match: { [baseField]: { query: searchTerm, fuzziness: maxEdits, analyzer: \"synonym_analyzer\" } },\n });\n }\n }\n }\n\n const searchScores: FunctionScoreContainer[] = [];\n for (const field of options.searchableFields) {\n const baseField = field.field;\n const maxPoints = field.points;\n const maxEdits = field.maxEdits;\n\n for (let edits = 0; edits <= maxEdits; edits++) {\n const weightMaxEdits = Math.max(maxPoints - maxEdits * (maxPoints / (100 / field.mistakePenaltyPercent)), 0);\n const weightSomeEdits = maxPoints / (100 / field.mistakePenaltyPercent);\n const weightBase = edits === maxEdits ? weightMaxEdits : weightSomeEdits;\n\n for (const searchTerm of searchTerms) {\n searchScores.push({\n filter: {\n match: { [baseField]: { query: searchTerm, fuzziness: edits, analyzer: \"regular_analyzer\" } },\n },\n weight: weightBase,\n });\n\n if (field.synonymEnabled && field.synonymPenaltyPercent > 0) {\n const weightSynonyms = weightBase * (1 - field.synonymPenaltyPercent / 100);\n\n searchScores.push({\n filter: {\n bool: {\n must_not: {\n match: { [baseField]: { query: searchTerm, fuzziness: edits, analyzer: \"regular_analyzer\" } },\n },\n must: {\n match: { [baseField]: { query: searchTerm, fuzziness: edits, analyzer: \"synonym_analyzer\" } },\n },\n },\n },\n weight: weightSynonyms,\n });\n }\n }\n }\n }\n\n const marketClause = generateMarketsClause(options.markets);\n const boolQuery: any = { should: [...searchQueries] };\n\n if (marketClause) {\n boolQuery.filter = [marketClause];\n }\n\n return {\n query: {\n bool: boolQuery,\n },\n functions: [\n ...searchScores,\n ...generateBoostingRules({ boostingRules: options.boostingRules, market: options.market }),\n ],\n score_mode: \"sum\",\n boost_mode: \"replace\",\n };\n}\n\nexport function generateWeightedCollectionQuery(options: {\n collectionHandle: string;\n boostingRules: Boosting[];\n markets: string[];\n market?: string;\n}): FunctionScoreQuery {\n const mustClauses: QueryContainer[] = [\n {\n nested: {\n path: \"collections\",\n query: {\n term: { [\"collections.handle\"]: options.collectionHandle },\n },\n },\n },\n ];\n\n const marketClause = generateMarketsClause(options.markets);\n if (marketClause) mustClauses.push(marketClause);\n\n return {\n query: {\n bool: { must: mustClauses },\n },\n functions: generateBoostingRules({ boostingRules: options.boostingRules, market: options.market }),\n score_mode: \"sum\",\n boost_mode: \"replace\",\n };\n}\n"]}
|