reactivecore icon indicating copy to clipboard operation
reactivecore copied to clipboard

Mutation of returned _source data in results by highlightResults function

Open mahaffey opened this issue 7 years ago • 2 comments

When a user specifies they want their data to be highlighted the highlighted data returns a truncated portion in the _source.

Please see my comments below. I didn't think a pull request was appropriate as all I would be doing is deleting a function.

Is there a reason for mutating the source of the highlighted data?

Best, Ryan

// src/utils/helper.js


// Why are we mutating the original _source object here?  
// This takes away information for the end-user given by elasticsearch

// My use case of ElasticSearch is to store parsed pdfs as strings 
// These contain 1000+ chars each

// The highlighted information given by elasticsearch have many fewer characters than this. 
// Around 100 chars 

// I want to be able to send the whole of the information to the end-user in the results

// If you remove this function (highlightResults)
// the user still retains the highlighted information in the main result object
//  and the original _source information

const highlightResults = (result) => {
	const data = { ...result };
	if (data.highlight) {
		Object.keys(data.highlight).forEach((highlightItem) => {
			const highlightValue = data.highlight[highlightItem][0];
			data._source = Object.assign({}, data._source, { [highlightItem]: highlightValue });
		});
	}
	return data;
};

export const parseHits = (hits) => {
	let results = null;
	if (hits) {
		results = [...hits].map((item) => {
			const streamProps = {};

			if (item._updated) {
				streamProps._updated = item._updated;
			} else if (item._deleted) {
				streamProps._deleted = item._deleted;
			}



                        // no need to mutate the data! below

			const data = highlightResults(item);

			return {
				_id: data._id,
				_index: data._index,
				...data._source,
				...streamProps,
			};
		});
	}
	return results;
};

mahaffey avatar May 25 '18 21:05 mahaffey

I agree, you have a point here. We only mutate the hits data in order to render the highlighted fields in the result-component directly. This lets users render highlighted results easily without worrying about processing the highlighted fields.

But I believe, we should come up with an approach where either both of these behaviors are feasible by default or it is toggle-able.

metagrover avatar May 28 '18 11:05 metagrover

Left a pull request. :)

mahaffey avatar May 29 '18 15:05 mahaffey