| <!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) { |
| |
| } |
| 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> |