@usereactify/search 5.59.0-beta.5 → 5.59.0-beta.6
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
CHANGED
|
@@ -2,6 +2,13 @@
|
|
|
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.59.0-beta.6](https://bitbucket.org/usereactify/reactify-search-ui/compare/beta-v5.59.0-beta.5...beta-v5.59.0-beta.6) (2025-07-16)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
### Bug Fixes
|
|
9
|
+
|
|
10
|
+
* streamline search scoring and improve weight calculation algorithm ([b6d4e5e](https://bitbucket.org/usereactify/reactify-search-ui/commit/b6d4e5e205e6981a1f6149d695f75bfdb38e5186))
|
|
11
|
+
|
|
5
12
|
## [5.59.0-beta.5](https://bitbucket.org/usereactify/reactify-search-ui/compare/beta-v5.59.0-beta.4...beta-v5.59.0-beta.5) (2025-07-16)
|
|
6
13
|
|
|
7
14
|
|
package/dist/package.json
CHANGED
|
@@ -104,7 +104,7 @@ export declare const generateQuerySearchWeighted: (options: {
|
|
|
104
104
|
};
|
|
105
105
|
};
|
|
106
106
|
};
|
|
107
|
-
|
|
107
|
+
must: {
|
|
108
108
|
match: {
|
|
109
109
|
[x: string]: {
|
|
110
110
|
query: string;
|
|
@@ -301,7 +301,7 @@ export declare const generateSearchFunctionScore: (options: {
|
|
|
301
301
|
};
|
|
302
302
|
};
|
|
303
303
|
};
|
|
304
|
-
|
|
304
|
+
must: {
|
|
305
305
|
match: {
|
|
306
306
|
[x: string]: {
|
|
307
307
|
query: string;
|
|
@@ -98,69 +98,66 @@ const generateSearchFunctionScore = (options) => {
|
|
|
98
98
|
const searchTerms = (_b = (_a = options.searchTerm) === null || _a === void 0 ? void 0 : _a.split(" ")) !== null && _b !== void 0 ? _b : [];
|
|
99
99
|
const searchQueries = [];
|
|
100
100
|
for (const searchableField of options.searchableFields) {
|
|
101
|
-
const
|
|
102
|
-
const
|
|
101
|
+
const baseField = searchableField.field;
|
|
102
|
+
const analyzer = searchableField.synyonymEnabled ? "synonym_analyzer" : "regular_analyzer";
|
|
103
103
|
for (const searchTerm of searchTerms) {
|
|
104
104
|
searchQueries.push({
|
|
105
105
|
match: {
|
|
106
|
-
[baseField]: { query: searchTerm, fuzziness: allowedMistakes, analyzer:
|
|
106
|
+
[baseField]: { query: searchTerm, fuzziness: searchableField.allowedMistakes, analyzer: analyzer },
|
|
107
107
|
},
|
|
108
108
|
});
|
|
109
|
-
if (searchableField.synyonymEnabled) {
|
|
110
|
-
searchQueries.push({
|
|
111
|
-
match: {
|
|
112
|
-
[baseField]: { query: searchTerm, fuzziness: allowedMistakes, analyzer: "synonym_analyzer" },
|
|
113
|
-
},
|
|
114
|
-
});
|
|
115
|
-
}
|
|
116
109
|
}
|
|
117
110
|
}
|
|
118
111
|
const searchScores = [];
|
|
119
|
-
for (const
|
|
120
|
-
const
|
|
121
|
-
const
|
|
122
|
-
const
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
const
|
|
112
|
+
for (const field of options.searchableFields) {
|
|
113
|
+
const baseField = field.field;
|
|
114
|
+
const maxPoints = field.points;
|
|
115
|
+
const maxEdits = field.allowedMistakes;
|
|
116
|
+
for (let edits = 0; edits <= maxEdits; edits++) {
|
|
117
|
+
// The total points (e.g. 1000) minus the total mistakes (e.g. 3) multiplied by the mistakes multiplier (e.g. 10% of 1000) = 1000 - (3 * (1000 / 10)) = 700;
|
|
118
|
+
const weightMaxEdits = Math.max(maxPoints - maxEdits * (maxPoints / (100 / field.mistakePenaltyPercent)), 0);
|
|
119
|
+
// The total points (e.g. 1000) divided by the mistakes multiplier (e.g. 10%) = 1000 / 100 = 100;
|
|
120
|
+
const weightSomeEdits = maxPoints / (100 / field.mistakePenaltyPercent);
|
|
121
|
+
// Which weight to use, weightMaxEdits should be used once and weightSomeEdits every other time
|
|
122
|
+
const weightBase = edits === maxEdits ? weightMaxEdits : weightSomeEdits;
|
|
128
123
|
for (const searchTerm of searchTerms) {
|
|
129
124
|
// Regular match
|
|
130
125
|
searchScores.push({
|
|
131
126
|
filter: {
|
|
132
|
-
match: {
|
|
127
|
+
match: {
|
|
128
|
+
[baseField]: { query: searchTerm, fuzziness: edits, analyzer: "regular_analyzer" },
|
|
129
|
+
},
|
|
133
130
|
},
|
|
134
|
-
weight:
|
|
131
|
+
weight: weightBase,
|
|
135
132
|
});
|
|
136
133
|
// Synonym match _and not_ regular match
|
|
137
|
-
if (synyonymEnabled &&
|
|
138
|
-
|
|
134
|
+
if (field.synyonymEnabled && field.synonymPenaltyPercent > 0) {
|
|
135
|
+
// The weightBase (e.g. weightMaxEdits 700 or weightSomeEdits 100) multiplied by the synonyms multiplier as a percentage of the whole points (e.g. input 5% = output 95%) = 700 * (95%)
|
|
136
|
+
const weightSynonyms = weightBase * (1 - field.synonymPenaltyPercent / 100);
|
|
139
137
|
searchScores.push({
|
|
140
138
|
filter: {
|
|
141
139
|
bool: {
|
|
142
140
|
must_not: {
|
|
143
141
|
match: { [baseField]: { query: searchTerm, fuzziness: edits, analyzer: "regular_analyzer" } },
|
|
144
142
|
},
|
|
145
|
-
|
|
143
|
+
must: {
|
|
146
144
|
match: { [baseField]: { query: searchTerm, fuzziness: edits, analyzer: "synonym_analyzer" } },
|
|
147
145
|
},
|
|
148
146
|
},
|
|
149
147
|
},
|
|
150
|
-
weight:
|
|
148
|
+
weight: weightSynonyms,
|
|
151
149
|
});
|
|
152
150
|
}
|
|
153
151
|
}
|
|
154
152
|
}
|
|
155
153
|
}
|
|
156
154
|
return {
|
|
157
|
-
query: {
|
|
155
|
+
query: {
|
|
156
|
+
bool: Object.assign(Object.assign({}, generateMarketsClause(options.markets)), { should: [...searchQueries] }),
|
|
157
|
+
},
|
|
158
158
|
functions: [
|
|
159
159
|
...searchScores,
|
|
160
|
-
...generateBoostingRules({
|
|
161
|
-
boostingRules: options.boostingRules,
|
|
162
|
-
market: options.market,
|
|
163
|
-
}),
|
|
160
|
+
...generateBoostingRules({ boostingRules: options.boostingRules, market: options.market }),
|
|
164
161
|
],
|
|
165
162
|
score_mode: "sum",
|
|
166
163
|
boost_mode: "replace",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queries.js","sourceRoot":"","sources":["../../../src/utility/queries.ts"],"names":[],"mappings":"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","sourcesContent":["import { Boosting, Curation, CurationType, Operation, SearchableField } from \"../types/firestore\";\n\nexport const generateQuerySearchWeighted = (options: {\n curation: Curation & { type: CurationType.Search };\n searchableFields: SearchableField[];\n market?: string;\n}) => {\n return generateSearchFunctionScore({\n searchTerm: options.curation.searchTerm ?? \"\",\n searchableFields: options.searchableFields,\n boostingRules: options.curation.boostings ?? [],\n markets: options.curation.markets,\n market: options.market,\n });\n};\n\nexport const generateQueryCollectionWeighted = (options: {\n curation: Curation & { type: CurationType.Collection };\n market?: string;\n}) => {\n const collectionFunctionScore = generateCollectionFunctionScore({\n collectionHandle: options.curation.collectionHandle ?? \"\",\n boostingRules: options.curation.boostings ?? [],\n markets: options.curation.markets,\n market: options.market,\n });\n return { function_score: collectionFunctionScore };\n};\n\nconst generateMarketsClause = (markets: string[]) => {\n if (!markets.length) return null;\n return { terms: { markets: markets } };\n};\n\nconst generateQueryField = (options: { fieldName: string; market?: string }) => {\n if (!options.market) {\n if (options.fieldName === \"price\") return \"price_min\";\n return options.fieldName;\n }\n\n if (options.fieldName === \"price\") {\n return `price_min_market_${options.market}`;\n }\n if (options.fieldName === \"price_min\") {\n return `price_min_market_${options.market}`;\n }\n if (options.fieldName === \"price_max\") {\n return `price_max_market_${options.market}`;\n }\n if (options.fieldName === \"inventory_total\") {\n return `inventory_quantity_market_${options.market}`;\n }\n\n return options.fieldName;\n};\n\nconst generateBoostingRule = (options: { boostingRule: Boosting; market?: string }) => {\n const fieldName = generateQueryField({\n fieldName: options.boostingRule.fieldName,\n market: options.market,\n });\n\n if (options.boostingRule.operation === Operation.Contains) {\n return {\n filter: { wildcard: { [fieldName]: `*${options.boostingRule.value}*` } },\n weight: options.boostingRule.points,\n };\n }\n if (options.boostingRule.operation === Operation.NotContains) {\n return {\n filter: {\n bool: { must_not: { wildcard: { [fieldName]: `*${options.boostingRule.value}*` } } },\n },\n weight: options.boostingRule.points,\n };\n }\n if (options.boostingRule.operation === Operation.Equals) {\n return {\n filter: { term: { [fieldName]: options.boostingRule.value } },\n weight: options.boostingRule.points,\n };\n }\n if (options.boostingRule.operation === Operation.GreaterThan) {\n return {\n filter: { range: { [fieldName]: { gt: parseFloat(options.boostingRule.value) } } },\n weight: options.boostingRule.points,\n };\n }\n if (options.boostingRule.operation === Operation.LessThan) {\n return {\n filter: { range: { [fieldName]: { lt: parseFloat(options.boostingRule.value) } } },\n weight: options.boostingRule.points,\n };\n }\n throw new Error(`Unable to process rule`);\n};\n\nconst generateBoostingRules = (options: { boostingRules: Boosting[]; market?: string }) => {\n return options.boostingRules\n .map((boostingRule) => generateBoostingRule({ boostingRule: boostingRule, market: options.market }))\n .filter(Boolean);\n};\n\nexport const generateSearchFunctionScore = (options: {\n searchTerm: string;\n searchableFields: SearchableField[];\n boostingRules: Boosting[];\n markets: string[];\n market?: string;\n}) => {\n const searchTerms = options.searchTerm?.split(\" \") ?? [];\n\n const searchQueries = [];\n for (const searchableField of options.searchableFields) {\n const { allowedMistakes, field } = searchableField;\n const baseField = field.replace(/\\.[^.]*$/, \"\");\n for (const searchTerm of searchTerms) {\n searchQueries.push({\n match: {\n [baseField]: { query: searchTerm, fuzziness: allowedMistakes, analyzer: \"regular_analyzer\" },\n },\n });\n if (searchableField.synyonymEnabled) {\n searchQueries.push({\n match: {\n [baseField]: { query: searchTerm, fuzziness: allowedMistakes, analyzer: \"synonym_analyzer\" },\n },\n });\n }\n }\n }\n\n const searchScores = [];\n for (const searchableField of options.searchableFields) {\n const { field, points, allowedMistakes, mistakePenaltyPercent, synyonymEnabled, synonymPenaltyPercent } =\n searchableField;\n const baseField = field.replace(/\\.[^.]*$/, \"\");\n\n const mistakeWeight = (points * mistakePenaltyPercent) / 100;\n const baseWeight = points - allowedMistakes * mistakeWeight;\n\n const synonymWeight = (points * synonymPenaltyPercent) / 100;\n const synonymBaseWeight = points - allowedMistakes * synonymWeight;\n\n for (let edits = 0; edits <= allowedMistakes; edits++) {\n const weight = edits === 0 ? baseWeight : mistakeWeight;\n\n for (const searchTerm of searchTerms) {\n // Regular match\n searchScores.push({\n filter: {\n match: { [baseField]: { query: searchTerm, fuzziness: edits, analyzer: \"regular_analyzer\" } },\n },\n weight: weight,\n });\n\n // Synonym match _and not_ regular match\n if (synyonymEnabled && searchableField.synonymPenaltyPercent > 0) {\n const weight = edits === 0 ? synonymBaseWeight : synonymWeight;\n searchScores.push({\n filter: {\n bool: {\n must_not: {\n match: { [baseField]: { query: searchTerm, fuzziness: edits, analyzer: \"regular_analyzer\" } },\n },\n should: {\n match: { [baseField]: { query: searchTerm, fuzziness: edits, analyzer: \"synonym_analyzer\" } },\n },\n },\n },\n weight: weight,\n });\n }\n }\n }\n }\n\n return {\n query: { bool: { ...generateMarketsClause(options.markets), should: [...searchQueries] } },\n functions: [\n ...searchScores,\n ...generateBoostingRules({\n boostingRules: options.boostingRules,\n market: options.market,\n }),\n ],\n score_mode: \"sum\",\n boost_mode: \"replace\",\n };\n};\n\nexport const generateCollectionFunctionScore = (options: {\n collectionHandle: string;\n boostingRules: Boosting[];\n markets: string[];\n market?: string;\n}) => {\n const mustClauses: Record<string, any>[] = [\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({\n boostingRules: options.boostingRules,\n market: options.market,\n }),\n score_mode: \"sum\",\n boost_mode: \"replace\",\n };\n};\n"]}
|
|
1
|
+
{"version":3,"file":"queries.js","sourceRoot":"","sources":["../../../src/utility/queries.ts"],"names":[],"mappings":"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","sourcesContent":["import { Boosting, Curation, CurationType, Operation, SearchableField } from \"../types/firestore\";\n\nexport const generateQuerySearchWeighted = (options: {\n curation: Curation & { type: CurationType.Search };\n searchableFields: SearchableField[];\n market?: string;\n}) => {\n return generateSearchFunctionScore({\n searchTerm: options.curation.searchTerm ?? \"\",\n searchableFields: options.searchableFields,\n boostingRules: options.curation.boostings ?? [],\n markets: options.curation.markets,\n market: options.market,\n });\n};\n\nexport const generateQueryCollectionWeighted = (options: {\n curation: Curation & { type: CurationType.Collection };\n market?: string;\n}) => {\n const collectionFunctionScore = generateCollectionFunctionScore({\n collectionHandle: options.curation.collectionHandle ?? \"\",\n boostingRules: options.curation.boostings ?? [],\n markets: options.curation.markets,\n market: options.market,\n });\n return { function_score: collectionFunctionScore };\n};\n\nconst generateMarketsClause = (markets: string[]) => {\n if (!markets.length) return null;\n return { terms: { markets: markets } };\n};\n\nconst generateQueryField = (options: { fieldName: string; market?: string }) => {\n if (!options.market) {\n if (options.fieldName === \"price\") return \"price_min\";\n return options.fieldName;\n }\n\n if (options.fieldName === \"price\") {\n return `price_min_market_${options.market}`;\n }\n if (options.fieldName === \"price_min\") {\n return `price_min_market_${options.market}`;\n }\n if (options.fieldName === \"price_max\") {\n return `price_max_market_${options.market}`;\n }\n if (options.fieldName === \"inventory_total\") {\n return `inventory_quantity_market_${options.market}`;\n }\n\n return options.fieldName;\n};\n\nconst generateBoostingRule = (options: { boostingRule: Boosting; market?: string }) => {\n const fieldName = generateQueryField({\n fieldName: options.boostingRule.fieldName,\n market: options.market,\n });\n\n if (options.boostingRule.operation === Operation.Contains) {\n return {\n filter: { wildcard: { [fieldName]: `*${options.boostingRule.value}*` } },\n weight: options.boostingRule.points,\n };\n }\n if (options.boostingRule.operation === Operation.NotContains) {\n return {\n filter: {\n bool: { must_not: { wildcard: { [fieldName]: `*${options.boostingRule.value}*` } } },\n },\n weight: options.boostingRule.points,\n };\n }\n if (options.boostingRule.operation === Operation.Equals) {\n return {\n filter: { term: { [fieldName]: options.boostingRule.value } },\n weight: options.boostingRule.points,\n };\n }\n if (options.boostingRule.operation === Operation.GreaterThan) {\n return {\n filter: { range: { [fieldName]: { gt: parseFloat(options.boostingRule.value) } } },\n weight: options.boostingRule.points,\n };\n }\n if (options.boostingRule.operation === Operation.LessThan) {\n return {\n filter: { range: { [fieldName]: { lt: parseFloat(options.boostingRule.value) } } },\n weight: options.boostingRule.points,\n };\n }\n throw new Error(`Unable to process rule`);\n};\n\nconst generateBoostingRules = (options: { boostingRules: Boosting[]; market?: string }) => {\n return options.boostingRules\n .map((boostingRule) => generateBoostingRule({ boostingRule: boostingRule, market: options.market }))\n .filter(Boolean);\n};\n\nexport const generateSearchFunctionScore = (options: {\n searchTerm: string;\n searchableFields: SearchableField[];\n boostingRules: Boosting[];\n markets: string[];\n market?: string;\n}) => {\n const searchTerms = options.searchTerm?.split(\" \") ?? [];\n\n const searchQueries = [];\n for (const searchableField of options.searchableFields) {\n const baseField = searchableField.field;\n const analyzer = searchableField.synyonymEnabled ? \"synonym_analyzer\" : \"regular_analyzer\";\n for (const searchTerm of searchTerms) {\n searchQueries.push({\n match: {\n [baseField]: { query: searchTerm, fuzziness: searchableField.allowedMistakes, analyzer: analyzer },\n },\n });\n }\n }\n\n const searchScores = [];\n for (const field of options.searchableFields) {\n const baseField = field.field;\n const maxPoints = field.points;\n const maxEdits = field.allowedMistakes;\n\n for (let edits = 0; edits <= maxEdits; edits++) {\n // The total points (e.g. 1000) minus the total mistakes (e.g. 3) multiplied by the mistakes multiplier (e.g. 10% of 1000) = 1000 - (3 * (1000 / 10)) = 700;\n const weightMaxEdits = Math.max(maxPoints - maxEdits * (maxPoints / (100 / field.mistakePenaltyPercent)), 0);\n // The total points (e.g. 1000) divided by the mistakes multiplier (e.g. 10%) = 1000 / 100 = 100;\n const weightSomeEdits = maxPoints / (100 / field.mistakePenaltyPercent);\n // Which weight to use, weightMaxEdits should be used once and weightSomeEdits every other time\n const weightBase = edits === maxEdits ? weightMaxEdits : weightSomeEdits;\n\n for (const searchTerm of searchTerms) {\n // Regular match\n searchScores.push({\n filter: {\n match: {\n [baseField]: { query: searchTerm, fuzziness: edits, analyzer: \"regular_analyzer\" },\n },\n },\n weight: weightBase,\n });\n\n // Synonym match _and not_ regular match\n if (field.synyonymEnabled && field.synonymPenaltyPercent > 0) {\n // The weightBase (e.g. weightMaxEdits 700 or weightSomeEdits 100) multiplied by the synonyms multiplier as a percentage of the whole points (e.g. input 5% = output 95%) = 700 * (95%)\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 return {\n query: {\n bool: { ...generateMarketsClause(options.markets), should: [...searchQueries] },\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 const generateCollectionFunctionScore = (options: {\n collectionHandle: string;\n boostingRules: Boosting[];\n markets: string[];\n market?: string;\n}) => {\n const mustClauses: Record<string, any>[] = [\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({\n boostingRules: options.boostingRules,\n market: options.market,\n }),\n score_mode: \"sum\",\n boost_mode: \"replace\",\n };\n};\n"]}
|