index.html 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. <!DOCTYPE html>
  2. <html lang="zh-TW">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.0/dist/css/bootstrap.min.css" rel="stylesheet"
  8. integrity="sha384-KyZXEAg3QhqLMpG8r+8fhAXLRk2vvoC2f3B09zVXn8CA5QIVfZOJ3BCsw2P0p/We" crossorigin="anonymous">
  9. <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css">
  10. <script src="https://code.jquery.com/jquery-3.6.0.js"
  11. integrity="sha256-H+K7U5CnXl1h5ywQfKtSj8PCmoN9aaq30gDh27Xc0jk=" crossorigin="anonymous"></script>
  12. <link rel="stylesheet" href="https://cdn.datatables.net/1.11.0/css/dataTables.bootstrap5.min.css">
  13. <script src="https://cdn.datatables.net/1.11.0/js/jquery.dataTables.min.js"></script>
  14. <script src="https://cdn.datatables.net/1.11.0/js/dataTables.bootstrap5.min.js"></script>
  15. <style>
  16. @font-face {
  17. font-family: my_font;
  18. src: local("zh-cn.ttf") format("opentype");
  19. }
  20. *{
  21. font-family: my_font;
  22. }
  23. </style>
  24. <title>iCulture</title>
  25. </head>
  26. <body>
  27. <div class="container">
  28. <div class="p-5 mt-5">
  29. <div class="mb-3">
  30. <div for="search_query" class="form-label fw-bold">iCulture Semantic Search</div>
  31. <hr>
  32. <div class="row mb-3">
  33. <div class="col">
  34. <label for="start_date" class="form-label">Start Date</label>
  35. <input type="date" name="start_date" class="form-control col" id="start_date">
  36. </div>
  37. <div class="col">
  38. <label for="end_date" class="form-label">End Date</label>
  39. <input type="date" name="end_date" class="form-control col" id="end_date">
  40. </div>
  41. </div>
  42. <div class="row mb-3">
  43. <div class="col">
  44. <label for="top_k" class="form-label">Top K</label>
  45. <input type="number" name="top_k" class="form-control col" id="top_k"
  46. placeholder="default: 100">
  47. </div>
  48. <div class="col">
  49. <label for="similarity" class="form-label">Similarity</label>
  50. <input type="number" name="similarity" class="form-control col" id="similarity"
  51. placeholder="-1 - 1 (default: 0)">
  52. </div>
  53. </div>
  54. <label for="search_query" class="form-label">Search Query</label>
  55. <div class="input-group mb-3">
  56. <input type="text" name="query" class="form-control" id="search_query"
  57. placeholder="Search query...">
  58. <button class="btn btn-outline-primary" type="button" id="search"><i
  59. class="fas fa-search"></i></button>
  60. </div>
  61. </div>
  62. </div>
  63. <div class="p-1 text-center" id="wordcloud">
  64. </div>
  65. <div class="p-5 about" id="tag_list">
  66. </div>
  67. <div class="p-5" id="results">
  68. </div>
  69. </div>
  70. <!-- Optional JavaScript; choose one of the two! -->
  71. <!-- Option 1: Bootstrap Bundle with Popper -->
  72. <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.0/dist/js/bootstrap.bundle.min.js"
  73. integrity="sha384-U1DAWAznBHeqEIlVSCgzq+c9gqGAJn5c/t99JyeKa9xxaYpSvHU5awsuZVVFIhvj"
  74. crossorigin="anonymous"></script>
  75. <!-- Option 2: Separate Popper and Bootstrap JS -->
  76. <!-- <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.3/dist/umd/popper.min.js"
  77. integrity="sha384-eMNCOe7tC1doHpGoWe/6oMVemdAVTMs2xqW4mwXrXsW0L84Iytr2wi5v2QjrP/xp"
  78. crossorigin="anonymous"></script>
  79. <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.0/dist/js/bootstrap.min.js"
  80. integrity="sha384-cn7l7gDp0eyniUwwAZgrzD06kc/tftFf19TOAs2zVinnD/C7E91j9yyk5//jjpt/"
  81. crossorigin="anonymous"></script> -->
  82. </body>
  83. <script>
  84. function semantic_search() {
  85. if ($('#search_query').val() != '') {
  86. $('#tag_list').empty()
  87. $('#wordcloud').empty()
  88. $('#results').empty()
  89. $('#wordcloud').append(`
  90. <div class="spinner-border text-primary" role="status">
  91. <span class="visually-hidden">Loading...</span>
  92. </div>`)
  93. top_k = parseInt($("#top_k").val())
  94. if (isNaN(top_k)) {
  95. top_k = 100
  96. }
  97. similarity = parseFloat($("#similarity").val())
  98. if (isNaN(similarity)) {
  99. similarity = 0.0
  100. }
  101. data = {
  102. "query": $("#search_query").val(),
  103. "top_k": top_k,
  104. "similarity": similarity,
  105. "start_date": $("#start_date").val(),
  106. "end_date": $("#end_date").val()
  107. }
  108. data = JSON.stringify(data)
  109. console.log(data);
  110. $.ajax({
  111. url: "/semantic_search",
  112. type: 'post',
  113. dataType: 'json', // 預期從server接收的資料型態
  114. contentType: 'application/json; charset=utf-8', // 要送到server的資料型態
  115. data: data,
  116. }).done(function (data) {
  117. data = JSON.parse(data['semantic_search'])
  118. $('#results').empty()
  119. $('#results').append(`<table class="table table-striped table-hover">
  120. <thead>
  121. <tr>
  122. <th>title</th>
  123. <th>content_tags</th>
  124. <th>descriptionFilterHtml</th>
  125. <th>masterUnit</th>
  126. <th>startDate</th>
  127. <th>endDate</th>
  128. </tr>
  129. </thead>
  130. <tbody>
  131. </tbody>
  132. </table>`)
  133. $.each(data, function (indexInArray, valueOfElement) {
  134. $('tbody').append(`
  135. <tr>
  136. <td>${valueOfElement.title}</td>
  137. <td><details>
  138. <summary>${valueOfElement.content_tags.slice(0, 10) + '...'}</summary>
  139. <p>${valueOfElement.content_tags}</p>
  140. </details>
  141. </td>
  142. <td><details>
  143. <summary>${valueOfElement.descriptionFilterHtml.slice(0, 50) + '...'}</summary>
  144. <p>${valueOfElement.descriptionFilterHtml}</p>
  145. </details>
  146. </td>
  147. <td>${valueOfElement.masterUnit}</td>
  148. <td>${valueOfElement.startDate}</td>
  149. <td>${valueOfElement.endDate}</td>
  150. </tr>
  151. `)
  152. });
  153. $('table').DataTable({
  154. "order": []
  155. });
  156. }).fail(function () {
  157. console.log("error");
  158. });
  159. $.ajax({
  160. url: "/wordcloud",
  161. type: 'post',
  162. dataType: 'json', // 預期從server接收的資料型態
  163. contentType: 'application/json; charset=utf-8', // 要送到server的資料型態
  164. data: data,
  165. }).done(function (data) {
  166. data = JSON.parse(data['wordcloud'])
  167. $('#wordcloud').empty()
  168. $('#wordcloud').append(data)
  169. }).fail(function () {
  170. console.log("error");
  171. });
  172. $.ajax({
  173. url: "/tag_list",
  174. type: 'post',
  175. dataType: 'json', // 預期從server接收的資料型態
  176. contentType: 'application/json; charset=utf-8', // 要送到server的資料型態
  177. data: data,
  178. }).done(function (data) {
  179. data = JSON.parse(data['tag_list'])
  180. $('#tag_list').empty()
  181. if (data.length != 0) {
  182. $('#tag_list').append(`Top 100 Tags<br>`)
  183. $.each(data, function (indexInArray, valueOfElement) {
  184. $('#tag_list').append(`
  185. <span class="badge bg-primary">#${valueOfElement}&nbsp;</span>
  186. `)
  187. });
  188. }
  189. }).fail(function () {
  190. console.log("error");
  191. });
  192. }
  193. }
  194. $('#search').on("click", function () {
  195. semantic_search()
  196. });
  197. $('#search_query').on("keyup", function (event) {
  198. // Number 13 is the "Enter" key on the keyboard
  199. if (event.keyCode === 13) {
  200. // Cancel the default action, if needed
  201. event.preventDefault();
  202. // Trigger the button element with a click
  203. $('#search').click();
  204. }
  205. });
  206. </script>
  207. </html>