es-gpt / index.html
hunkim's picture
Create index.html
d695a29
<!DOCTYPE html>
<html>
<head>
<title>Summary and Search Example</title>
<script>
function search() {
const resultsElement = document.getElementById("results");
const query = document.getElementById("query").value;
const url = `/search?q=${encodeURIComponent(query)}`;
const eventSource = new EventSource(url);
console.log(eventSource);
eventSource.onerror = function (e) {
if (e.readyState == EventSource.CLOSED) {
// Connection was closed.
}
eventSource.close();
};
eventSource.onmessage = function (event) {
console.log(event);
if (!event.data || event.data == "[DONE]") {
eventSource.close();
return;
}
const result = JSON.parse(event.data);
const item = document.createElement("div");
item.classList.add("search-result");
const title = document.createElement("b");
title.textContent = result._source.title;
item.appendChild(title);
const authors = document.createElement("p");
authors.textContent = `Authors: ${result._source.author}`;
item.appendChild(authors);
const abs = document.createElement("p");
abs.classList.add("abstract");
abs.textContent = `${result._source.abstract.substring(0, 500)}...`;
item.appendChild(abs);
resultsElement.appendChild(item);
};
}
function summarize() {
const summaryElement = document.getElementById("summary");
const query = document.getElementById("query").value;
const url = `summary?q=${encodeURIComponent(query)}`;
const eventSource = new EventSource(url);
eventSource.onmessage = function (event) {
if (!event.data || event.data == "[DONE]") {
eventSource.close();
return;
}
const result = JSON.parse(event.data);
summaryElement.innerHTML += result['choices'][0]['text'];
};
}
function clearResults() {
const resultsElement = document.getElementById("results");
const summaryElement = document.getElementById("summary");
if (summaryElement) {
summaryElement.innerHTML = "";
}
if (resultsElement) {
resultsElement.innerHTML = "";
}
}
function searchAndSummarize() {
clearResults();
search();
summarize();
}
</script>
<style>
body {
display: flex;
flex-wrap: wrap;
}
#search-container {
flex: 0 0 100%;
padding: 20px;
box-sizing: border-box;
}
#results-container {
flex: 0 0 70%;
padding: 20px;
box-sizing: border-box;
}
#summary-container {
flex: 0 0 30%;
padding: 20px;
box-sizing: border-box;
background-color: #f2f2f2;
}
.search-input-container {
display: flex;
margin-bottom: 20px;
}
#query {
flex: 1;
margin-right: 10px;
}
#results {
max-height: 80vh;
overflow-y: scroll;
}
.search-result {
margin-bottom: 10px;
padding-bottom: 10px;
border-bottom: 1px solid #ddd;
}
.search-result a {
font-size: 18px;
font-weight: bold;
color: #1a0dab;
text-decoration: none;
}
.search-result a:hover {
text-decoration: underline;
}
.search-result p {
margin: 10px 0;
font-size: 14px;
}
</style>
</head>
<body>
<div id="search-container">
<h2>Elasticsearch with GPT Summary</h2>
<div class="search-input-container">
<input type="text" id="query" placeholder="Enter a query (e.g., bug, gan)" onkeydown="if (event.key === 'Enter') searchAndSummarize()">
<button onclick="searchAndSummarize()">Search</button>
</div>
</div>
<div id="results-container">
<h3>Search Results</h3>
<div id="results"></div>
</div>
<div id="summary-container">
<h3>GPT Summary</h3>
<div id="summary"></div>
</div>
</body>
</html>