From 469f1b787607f1f0bd436c12f68308c9c7c8af6b Mon Sep 17 00:00:00 2001 From: Sandhya Govindaraju Date: Tue, 17 Mar 2026 12:15:34 -0500 Subject: [PATCH 1/6] ENH: handle exclude and include in highlights --- packages/provider-elasticsearch/package.json | 4 +- .../results/highlighting/request.js | 29 ++++-- .../results/highlighting/request.test.js | 99 +++++++++++++++++++ 3 files changed, 122 insertions(+), 10 deletions(-) diff --git a/packages/provider-elasticsearch/package.json b/packages/provider-elasticsearch/package.json index c5605f47e..4b145d3ca 100644 --- a/packages/provider-elasticsearch/package.json +++ b/packages/provider-elasticsearch/package.json @@ -1,6 +1,6 @@ { "name": "contexture-elasticsearch", - "version": "1.38.1", + "version": "1.39.0", "description": "ElasticSearch Provider for Contexture", "type": "module", "exports": { @@ -53,4 +53,4 @@ "json-stable-stringify": "^1.0.1" }, "packageManager": "yarn@3.2.0" -} +} \ No newline at end of file diff --git a/packages/provider-elasticsearch/src/example-types/results/highlighting/request.js b/packages/provider-elasticsearch/src/example-types/results/highlighting/request.js index 9c76d70b0..635969d99 100644 --- a/packages/provider-elasticsearch/src/example-types/results/highlighting/request.js +++ b/packages/provider-elasticsearch/src/example-types/results/highlighting/request.js @@ -197,14 +197,27 @@ export let getRequestHighlightFields = (schema, node) => { // TODO: `highlightOtherMatches` is an undocumented configuration value that we // are currently using to work around performance issues when highlighting // fields not included in the node. - if (!node.highlight?.highlightOtherMatches && _.isArray(node.include)) { - let subFields = getSchemaSubFields({ - fields: _.pick(node.include, schema.fields), - }) - highlightFields = _.pick( - _.uniq([...node.include, ..._.keys(subFields)]), - highlightFields - ) + if (!node.highlight?.highlightOtherMatches) { + if (_.isArray(node.include)) { + const include = expandGlobs(schema, node.include) + let subFields = getSchemaSubFields({ + fields: _.pick(include, schema.fields), + }) + highlightFields = _.pick( + _.uniq([...include, ..._.keys(subFields)]), + highlightFields + ) + } + if (_.isArray(node.exclude)) { + const exclude = expandGlobs(schema, node.exclude) + let subFields = getSchemaSubFields({ + fields: _.pick(exclude, schema.fields), + }) + highlightFields = _.omit( + _.uniq([...exclude, ..._.keys(subFields)]), + highlightFields + ) + } } return F.mapValuesIndexed( diff --git a/packages/provider-elasticsearch/src/example-types/results/highlighting/request.test.js b/packages/provider-elasticsearch/src/example-types/results/highlighting/request.test.js index d3c2ec77d..77ab61008 100644 --- a/packages/provider-elasticsearch/src/example-types/results/highlighting/request.test.js +++ b/packages/provider-elasticsearch/src/example-types/results/highlighting/request.test.js @@ -464,4 +464,103 @@ describe('getRequestHighlightFields()', () => { }, }) }) + it('should expand include', () => { + const schema = { + fields: { + state: { + elasticsearch: { + dataType: 'text', + mapping: { + fields: { + keyword: { type: 'keyword' }, + subfield: { type: 'text' }, + }, + }, + }, + }, + 'city.street': { + elasticsearch: { + dataType: 'text', + mapping: { + fields: { + keyword: { type: 'keyword' }, + subfield: { type: 'text' }, + }, + }, + }, + }, + }, + } + const node = { include: ['city'] } + const actual = getRequestHighlightFields(schema, node) + expect(actual).toEqual({ + 'city.street': {}, + 'city.street.subfield': {}, + }) + }) + it('should expand exclude', () => { + const schema = { + fields: { + state: { + elasticsearch: { + dataType: 'text', + mapping: { + fields: { + keyword: { type: 'keyword' }, + subfield: { type: 'text' }, + }, + }, + }, + }, + 'city.street': { + elasticsearch: { + dataType: 'text', + mapping: { + fields: { + keyword: { type: 'keyword' }, + subfield: { type: 'text' }, + }, + }, + }, + }, + }, + } + const node = { exclude: ['city'] } + const actual = getRequestHighlightFields(schema, node) + expect(actual).toEqual({ state: {}, 'state.subfield': {} }) + }) + it('should handle both include and exclude', () => { + const schema = { + fields: { + state: { + elasticsearch: { + dataType: 'text', + mapping: { + fields: { + keyword: { type: 'keyword' }, + subfield: { type: 'text' }, + }, + }, + }, + }, + 'city.street': { + elasticsearch: { + dataType: 'text', + mapping: { + fields: { + keyword: { type: 'keyword' }, + subfield: { type: 'text' }, + }, + }, + }, + }, + }, + } + const node = { + include: ['state'], + exclude: ['state'], + } + const actual = getRequestHighlightFields(schema, node) + expect(actual).toEqual({}) + }) }) From a820fae1537d1fa496b561d4bd5d7b839fadf94d Mon Sep 17 00:00:00 2001 From: Sandhya Govindaraju Date: Tue, 17 Mar 2026 12:18:23 -0500 Subject: [PATCH 2/6] FIX: add change log --- .changeset/es_highlight_exclude.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/es_highlight_exclude.md diff --git a/.changeset/es_highlight_exclude.md b/.changeset/es_highlight_exclude.md new file mode 100644 index 000000000..9b454bea8 --- /dev/null +++ b/.changeset/es_highlight_exclude.md @@ -0,0 +1,5 @@ +--- +'contexture-elasticsearch': patch +--- + +Handle node `exclude` while highlighting, that is, remove the excluded fields from highlighting. Also, expand `include` to handle glob expansion for highlighting. \ No newline at end of file From 08094fe0c0c3b66c70cae2fae41318fdfabacd90 Mon Sep 17 00:00:00 2001 From: Lint Action Date: Tue, 17 Mar 2026 17:18:36 +0000 Subject: [PATCH 3/6] Fix code style issues with ESLint --- packages/provider-elasticsearch/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/provider-elasticsearch/package.json b/packages/provider-elasticsearch/package.json index 4b145d3ca..555d478d9 100644 --- a/packages/provider-elasticsearch/package.json +++ b/packages/provider-elasticsearch/package.json @@ -53,4 +53,4 @@ "json-stable-stringify": "^1.0.1" }, "packageManager": "yarn@3.2.0" -} \ No newline at end of file +} From cb9b045e239dc864368eaadf5e6494d0695065fa Mon Sep 17 00:00:00 2001 From: Lint Action Date: Tue, 17 Mar 2026 17:18:43 +0000 Subject: [PATCH 4/6] Fix code style issues with Prettier --- .changeset/es_highlight_exclude.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/es_highlight_exclude.md b/.changeset/es_highlight_exclude.md index 9b454bea8..ae7328abb 100644 --- a/.changeset/es_highlight_exclude.md +++ b/.changeset/es_highlight_exclude.md @@ -2,4 +2,4 @@ 'contexture-elasticsearch': patch --- -Handle node `exclude` while highlighting, that is, remove the excluded fields from highlighting. Also, expand `include` to handle glob expansion for highlighting. \ No newline at end of file +Handle node `exclude` while highlighting, that is, remove the excluded fields from highlighting. Also, expand `include` to handle glob expansion for highlighting. From 0c2b786dfe7cab9d1bc814c0714b638db83b7b72 Mon Sep 17 00:00:00 2001 From: Sandhya Govindaraju Date: Wed, 18 Mar 2026 14:49:07 -0500 Subject: [PATCH 5/6] PR feedback --- packages/provider-elasticsearch/package.json | 4 +- .../results/highlighting/request.js | 40 +++++++++---------- .../results/highlighting/request.test.js | 17 ++++++-- 3 files changed, 34 insertions(+), 27 deletions(-) diff --git a/packages/provider-elasticsearch/package.json b/packages/provider-elasticsearch/package.json index 555d478d9..e411b6bf1 100644 --- a/packages/provider-elasticsearch/package.json +++ b/packages/provider-elasticsearch/package.json @@ -1,6 +1,6 @@ { "name": "contexture-elasticsearch", - "version": "1.39.0", + "version": "1.38.1", "description": "ElasticSearch Provider for Contexture", "type": "module", "exports": { @@ -53,4 +53,4 @@ "json-stable-stringify": "^1.0.1" }, "packageManager": "yarn@3.2.0" -} +} \ No newline at end of file diff --git a/packages/provider-elasticsearch/src/example-types/results/highlighting/request.js b/packages/provider-elasticsearch/src/example-types/results/highlighting/request.js index 635969d99..2c5ddd7b5 100644 --- a/packages/provider-elasticsearch/src/example-types/results/highlighting/request.js +++ b/packages/provider-elasticsearch/src/example-types/results/highlighting/request.js @@ -197,27 +197,25 @@ export let getRequestHighlightFields = (schema, node) => { // TODO: `highlightOtherMatches` is an undocumented configuration value that we // are currently using to work around performance issues when highlighting // fields not included in the node. - if (!node.highlight?.highlightOtherMatches) { - if (_.isArray(node.include)) { - const include = expandGlobs(schema, node.include) - let subFields = getSchemaSubFields({ - fields: _.pick(include, schema.fields), - }) - highlightFields = _.pick( - _.uniq([...include, ..._.keys(subFields)]), - highlightFields - ) - } - if (_.isArray(node.exclude)) { - const exclude = expandGlobs(schema, node.exclude) - let subFields = getSchemaSubFields({ - fields: _.pick(exclude, schema.fields), - }) - highlightFields = _.omit( - _.uniq([...exclude, ..._.keys(subFields)]), - highlightFields - ) - } + if (!node.highlight?.highlightOtherMatches && _.isArray(node.include)) { + const include = expandGlobs(schema, node.include) + let subFields = getSchemaSubFields({ + fields: _.pick(include, schema.fields), + }) + highlightFields = _.pick( + _.uniq([...include, ..._.keys(subFields)]), + highlightFields + ) + } + if (_.isArray(node.exclude)) { + const exclude = expandGlobs(schema, node.exclude) + let subFields = getSchemaSubFields({ + fields: _.pick(exclude, schema.fields), + }) + highlightFields = _.omit( + _.uniq([...exclude, ..._.keys(subFields)]), + highlightFields + ) } return F.mapValuesIndexed( diff --git a/packages/provider-elasticsearch/src/example-types/results/highlighting/request.test.js b/packages/provider-elasticsearch/src/example-types/results/highlighting/request.test.js index 77ab61008..99fe1d156 100644 --- a/packages/provider-elasticsearch/src/example-types/results/highlighting/request.test.js +++ b/packages/provider-elasticsearch/src/example-types/results/highlighting/request.test.js @@ -498,7 +498,7 @@ describe('getRequestHighlightFields()', () => { 'city.street.subfield': {}, }) }) - it('should expand exclude', () => { + it('should expand exclude, irrespective of highlightOtherMatches', () => { const schema = { fields: { state: { @@ -525,9 +525,18 @@ describe('getRequestHighlightFields()', () => { }, }, } - const node = { exclude: ['city'] } - const actual = getRequestHighlightFields(schema, node) - expect(actual).toEqual({ state: {}, 'state.subfield': {} }) + const node1 = { + exclude: ['city'], + highlight: { highlightOtherMatches: true }, + } + const actual1 = getRequestHighlightFields(schema, node1) + expect(actual1).toEqual({ state: {}, 'state.subfield': {} }) + const node2 = { + exclude: ['city'], + highlight: { highlightOtherMatches: false }, + } + const actual2 = getRequestHighlightFields(schema, node2) + expect(actual2).toEqual({ state: {}, 'state.subfield': {} }) }) it('should handle both include and exclude', () => { const schema = { From 232fdbd666e2c54d2ebb9ee99ae77ceaf3c8e5da Mon Sep 17 00:00:00 2001 From: Lint Action Date: Wed, 18 Mar 2026 19:49:51 +0000 Subject: [PATCH 6/6] Fix code style issues with ESLint --- packages/provider-elasticsearch/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/provider-elasticsearch/package.json b/packages/provider-elasticsearch/package.json index e411b6bf1..c5605f47e 100644 --- a/packages/provider-elasticsearch/package.json +++ b/packages/provider-elasticsearch/package.json @@ -53,4 +53,4 @@ "json-stable-stringify": "^1.0.1" }, "packageManager": "yarn@3.2.0" -} \ No newline at end of file +}