ソースを参照

fix(elastic-search): Improve search results (#3284)

Martijn 1 年間 前
コミット
b8112be01a

+ 1 - 1
packages/elasticsearch-plugin/e2e/e2e-helpers.ts

@@ -63,8 +63,8 @@ export async function testMatchSearchTerm(client: SimpleGraphQLClient) {
         },
     );
     expect(result.search.items.map(i => i.productName)).toEqual([
-        'Instant Camera',
         'Camera Lens',
+        'Instant Camera',
         'SLR Camera',
     ]);
 }

+ 2 - 3
packages/elasticsearch-plugin/e2e/elasticsearch-plugin.e2e-spec.ts

@@ -913,9 +913,8 @@ describe('Elasticsearch plugin', () => {
                     groupByProduct: true,
                     term: 'gaming',
                 });
-                expect(result.search.items.map(pick(['productId', 'enabled']))).toEqual([
-                    { productId: 'T_3', enabled: false },
-                ]);
+                const t3 = result.search.items.find(i => i.productId === 'T_3');
+                expect(t3?.enabled).toEqual(false);
             });
 
             // https://github.com/vendure-ecommerce/vendure/issues/295

+ 8 - 4
packages/elasticsearch-plugin/src/build-elastic-body.spec.ts

@@ -21,7 +21,8 @@ describe('buildElasticBody()', () => {
                         multi_match: {
                             query: 'test',
                             type: 'best_fields',
-                            fields: ['productName^1', 'productVariantName^1', 'description^1', 'sku^1'],
+                            fuzziness: 'AUTO',
+                            fields: ['productName^5', 'productVariantName^5', 'description^1', 'sku^1'],
                         },
                     },
                 ],
@@ -389,7 +390,8 @@ describe('buildElasticBody()', () => {
                             multi_match: {
                                 query: 'test',
                                 type: 'best_fields',
-                                fields: ['productName^1', 'productVariantName^1', 'description^1', 'sku^1'],
+                                fuzziness: 'AUTO',
+                                fields: ['productName^5', 'productVariantName^5', 'description^1', 'sku^1'],
                             },
                         },
                     ],
@@ -427,7 +429,8 @@ describe('buildElasticBody()', () => {
                         multi_match: {
                             query: 'test',
                             type: 'phrase',
-                            fields: ['productName^1', 'productVariantName^1', 'description^1', 'sku^1'],
+                            fuzziness: 'AUTO',
+                            fields: ['productName^5', 'productVariantName^5', 'description^1', 'sku^1'],
                         },
                     },
                 ],
@@ -456,6 +459,7 @@ describe('buildElasticBody()', () => {
                         multi_match: {
                             query: 'test',
                             type: 'best_fields',
+                            fuzziness: 'AUTO',
                             fields: ['productName^3', 'productVariantName^4', 'description^2', 'sku^5'],
                         },
                     },
@@ -482,7 +486,7 @@ describe('buildElasticBody()', () => {
         const result = buildElasticBody({ term: 'test' }, config, CHANNEL_ID, LanguageCode.en);
         expect(result.script_fields).toEqual({
             test: {
-                script: 'doc[\'property\'].dummyScript(test)',
+                script: "doc['property'].dummyScript(test)",
             },
         });
     });

+ 4 - 3
packages/elasticsearch-plugin/src/build-elastic-body.ts

@@ -41,6 +41,7 @@ export function buildElasticBody(
             {
                 multi_match: {
                     query: term,
+                    fuzziness: 'AUTO',
                     type: searchConfig.multiMatchType,
                     fields: [
                         `productName^${searchConfig.boostFields.productName}`,
@@ -166,13 +167,13 @@ function createScriptFields(
             for (const name of fields) {
                 const scriptField = scriptFields[name];
                 if (scriptField.context === 'product' && groupByProduct === true) {
-                    (result )[name] = scriptField.scriptFn(input);
+                    result[name] = scriptField.scriptFn(input);
                 }
                 if (scriptField.context === 'variant' && groupByProduct === false) {
-                    (result )[name] = scriptField.scriptFn(input);
+                    result[name] = scriptField.scriptFn(input);
                 }
                 if (scriptField.context === 'both' || scriptField.context === undefined) {
-                    (result )[name] = scriptField.scriptFn(input);
+                    result[name] = scriptField.scriptFn(input);
                 }
             }
             return result;

+ 2 - 2
packages/elasticsearch-plugin/src/options.ts

@@ -728,8 +728,8 @@ export const defaultOptions: ElasticsearchRuntimeOptions = {
         totalItemsMaxSize: 10000,
         multiMatchType: 'best_fields',
         boostFields: {
-            productName: 1,
-            productVariantName: 1,
+            productName: 5,
+            productVariantName: 5,
             description: 1,
             sku: 1,
         },