Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 23 additions & 29 deletions src/handlers/osAutoSuggestHandler.js
Original file line number Diff line number Diff line change
@@ -1,41 +1,35 @@
const { getOpenSearchClient } = require("../lib/opensearch-client");
const { wrapResponse } = require("../lib/wrap-response");

const client = getOpenSearchClient();
const { buildAutoSuggestQuery } = require("../utils/esHelpers");

module.exports.index = async (event) => {
try {
const body = event.queryStringParameters;
const queryText = body.query || body.q || "";
const index = body.index;
const size = 10;
const langId = body.langId ? parseInt(body.langId, 10) : 1;
if (!queryText) {
return {
statusCode: 400,
body: JSON.stringify({ error: "Missing query parameter" }),
};
}
return wrapResponse(async () => {
try {
const body = event.queryStringParameters;
const queryText = body.query || body.q || "";
const index = body.index;
const size = 10;
const langId = body.langId ? parseInt(body.langId, 10) : 1;
if (!queryText) {
throw new Error("Missing query parameter");
}

// Use the new buildAutoSuggestQuery for powerful autosuggestion
const suggestQuery = buildAutoSuggestQuery(queryText, langId, size);
console.log("suggestQuery", suggestQuery);
// Use the new buildAutoSuggestQuery for powerful autosuggestion
const suggestQuery = buildAutoSuggestQuery(queryText, langId, size);
console.log("suggestQuery", suggestQuery);

const results = await client.search(index, suggestQuery, 0, size);
const suggestions = results.results.map((hit) => hit._source);
const results = await client.search(index, suggestQuery, 0, size);
const suggestions = results.results.map((hit) => hit._source);

return {
statusCode: 200,
body: JSON.stringify({
return {
suggestions,
total: results.total,
}),
};
} catch (error) {
console.error("AutoSuggest error:", error);
return {
statusCode: 500,
body: JSON.stringify({ error: error.message || "Internal Server Error" }),
};
}
};
} catch (error) {
console.error("AutoSuggest error:", error);
throw new Error("Error processing auto-suggest request");
}
});
};
128 changes: 60 additions & 68 deletions src/handlers/osSearchHandler.js
Original file line number Diff line number Diff line change
@@ -1,79 +1,71 @@
const OpenSearchClient = require('../engines/OpenSearch/openSearchClient');
const { buildQuery } = require('../utils/esHelpers');
const { getOpenSearchClient } = require('../lib/opensearch-client');
const OpenSearchClient = require("../engines/OpenSearch/openSearchClient");
const { buildQuery } = require("../utils/esHelpers");
const { getOpenSearchClient } = require("../lib/opensearch-client");
const { wrapResponse } = require("../lib/wrap-response");

const osClient = getOpenSearchClient();

module.exports.index = async (event) => {
let body;
if (event.body) {
try {
body = JSON.parse(event.body);
} catch (parseError) {
console.log('Invalid JSON in event.body:', parseError);
return {
statusCode: 400,
body: JSON.stringify({ error: 'Invalid JSON in request body' }),
};
}
} else {
body = event;
}
const { index, query, project, filters, aggs, from, size, langId } = body;
console.log('Request body:', body);

try {
if (!index) {
throw new Error('Index should be present');
return wrapResponse(async () => {
let body;
if (event.body) {
try {
body = JSON.parse(event.body);
} catch (parseError) {
console.log("Invalid JSON in event.body:", parseError);
throw new Error("Invalid JSON in request body");
}
} else {
body = event;
}
const {query: builtQuery, ...rest} = buildQuery(query, project, langId);
const { index, query, project, filters, aggs, from, size, langId } = body;
console.log("Request body:", body);

const mustClause = [
builtQuery
]
try {
if (!index) {
throw new Error("Index should be present");
}
const { query: builtQuery, ...rest } = buildQuery(query, project, langId);

if (filters && Object.keys(filters).length) {
const terms = Object.entries(filters).map(([field, value]) => ({
term: { [field]: value }
}));
mustClause.push(...terms);
}

const finalQuery = {
query: {
bool: {
must: [
{
bool: {
must: mustClause
}
}
]
}
},
...rest
}
const mustClause = [builtQuery];

if (aggs && Object.keys(aggs).length) {
finalQuery.aggs = aggs;
}
if (filters && Object.keys(filters).length) {
const terms = Object.entries(filters).map(([field, value]) => ({
term: { [field]: value },
}));
mustClause.push(...terms);
}

const finalQuery = {
query: {
bool: {
must: [
{
bool: {
must: mustClause,
},
},
],
},
},
...rest,
};

const results = await osClient.search(
index,
finalQuery,
parseInt(from, 10),
parseInt(size, 10)
);
if (aggs && Object.keys(aggs).length) {
finalQuery.aggs = aggs;
}

return {
statusCode: 200,
body: JSON.stringify(results),
};
} catch (error) {
console.log('OpenSearch index error:', error)
return {
statusCode: 500,
body: JSON.stringify({ error: error.message }),
};
}
const results = await osClient.search(
index,
finalQuery,
parseInt(from, 10),
parseInt(size, 10),
);

return results;
} catch (error) {
console.log("OpenSearch index error:", error);
throw error;
}
});
};
26 changes: 26 additions & 0 deletions src/lib/wrap-response.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
const wrapResponse = async (handler) => {
try {
const result = await handler();
return {
statusCode: result.statusCode || 200,
body: JSON.stringify(result),
headers: {
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Credentials": true,
},
};
} catch (error) {
console.error("Error in wrapResponse:", error);
return {
statusCode: 500,
body: JSON.stringify({
message: "Internal Server Error",
}),
headers: {
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Credentials": true,
},
};
}
};
module.exports = { wrapResponse };
Loading