opex792 commited on
Commit
3384d95
·
verified ·
1 Parent(s): 7a48d04

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +61 -38
app.py CHANGED
@@ -152,7 +152,7 @@ def get_embedding_from_db(conn, table_name, crc32_column, crc32_value, model_nam
152
 
153
  def get_movie_data_from_db(conn, movie_ids):
154
  """
155
- Получает данные фильмов из таблицы Movies по списку ID,
156
  включая предположительно URL-адрес постера и рейтинг.
157
  """
158
  movie_data_dict = {}
@@ -290,29 +290,40 @@ def search_movies_internal(query: str, top_k: int = 25, rerank_top_k: Optional[i
290
  # Определяем количество фильмов для запроса из БД
291
  db_limit = rerank_top_k or top_k * 2
292
 
293
- # Используем косинусное расстояние для поиска
294
  try:
295
  with conn.cursor() as cur:
296
- cur.execute(f"""
297
- WITH query_embedding AS (
298
- SELECT embedding
299
- FROM "{query_cache_table}"
300
- WHERE query_crc32 = %s
301
- )
302
- SELECT m.movie_id, 1 - (m.embedding <=> (SELECT embedding FROM query_embedding)) as similarity
303
- FROM "{embeddings_table}" m, query_embedding
304
- ORDER BY similarity DESC
305
- LIMIT %s
306
- """, (query_crc32, int(db_limit)))
307
-
308
- results = cur.fetchall()
309
- logging.info(f"Найдено {len(results)} предварительных результатов поиска.")
 
 
 
 
 
 
 
 
 
 
 
310
  except Exception as e:
311
  logging.error(f"Ошибка при выполнении поискового запроса: {e}")
312
  results = []
313
  finally:
314
  conn.close()
315
-
316
  # Используем реранкер только если rerank_top_k не равен 0
317
  if rerank_top_k != 0:
318
  reranked_results, rerank_success, reranked_count = rerank_with_api(query, results, top_k, rerank_top_k, jina_api_key)
@@ -353,7 +364,6 @@ def search_movies_internal(query: str, top_k: int = 25, rerank_top_k: Optional[i
353
 
354
  formatted_results = []
355
  for movie_id, score in reranked_results:
356
- # Находим данные фильма
357
  movie_data, _, prepared_json = movie_data_dict.get(movie_id, (None, None, None))
358
  if movie_data:
359
  formatted_results.append({
@@ -365,7 +375,7 @@ def search_movies_internal(query: str, top_k: int = 25, rerank_top_k: Optional[i
365
  "poster_preview_url": prepared_json['Постер'],
366
  "rating_kp": prepared_json['Рейтинг'],
367
  "relevance_score": score if rerank_success else (
368
- movie_data_dict.get(movie_id, (None, None))[1] if movie_data_dict.get(movie_id,(None, None)) is not None else 0.0) # Сохраняем similarity, если нет реранжировки
369
  })
370
  else:
371
  logging.warning(f"Данные для фильма с ID {movie_id} не найдены в БД.")
@@ -381,9 +391,9 @@ def search_movies_internal(query: str, top_k: int = 25, rerank_top_k: Optional[i
381
  "search_time": search_time,
382
  "total_movies": total_movies,
383
  "searched_movies": searched_movies,
384
- "returned_movies": len(formatted_results), # Количество возвращенных фильмов
385
- "reranked_movies": reranked_count, # Количество фильмов, обработанных реранкером
386
- "jina_balance": jina_balance # Остаток баланса Jina AI
387
  }, search_time
388
 
389
  except Exception as e:
@@ -555,6 +565,7 @@ async def root():
555
  background-color: #111;
556
  transition: transform 0.1s ease;
557
  cursor: pointer;
 
558
  }
559
  .movie-card:hover,
560
  .movie-card:focus {
@@ -562,7 +573,7 @@ async def root():
562
  }
563
  .movie-poster {
564
  width: 100%;
565
- height: 350px;
566
  object-fit: cover;
567
  }
568
  .movie-info {
@@ -577,21 +588,38 @@ async def root():
577
  }
578
  .movie-title {
579
  width: 100%;
580
- background-color: #111;
581
  font-size: 1.1em;
582
  font-weight: bold;
583
  text-align: center;
584
  padding: 10px;
585
  box-sizing: border-box;
 
586
  }
 
 
 
 
 
 
 
 
 
 
 
587
  .top-info {
588
  display: flex;
589
  justify-content: space-between;
590
  padding: 10px;
 
 
591
  }
592
  .movie-year, .movie-rating {
593
  font-size: 0.8em;
594
  color: #ccc;
 
 
 
595
  }
596
  .movie-details {
597
  display: none;
@@ -643,9 +671,6 @@ async def root():
643
  .movie-grid {
644
  grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
645
  }
646
- .movie-poster {
647
- height: 225px;
648
- }
649
  .logo {
650
  font-size: 1.5em;
651
  }
@@ -654,9 +679,6 @@ async def root():
654
  .movie-grid {
655
  grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
656
  }
657
- .movie-poster {
658
- height: 180px;
659
- }
660
  .logo {
661
  font-size: 1.3em;
662
  }
@@ -706,14 +728,15 @@ async def root():
706
  movieCard.className = 'movie-card';
707
  const ratingColor = getRatingColor(movie.rating_kp);
708
  movieCard.innerHTML = `
709
- <img src="${movie.poster_preview_url}" alt="${movie.name}" class="movie-poster">
710
- <div class="movie-info">
711
- <div class="top-info">
712
- <span class="movie-year">${movie.year}</span>
713
- <span class="movie-rating" style="color: ${ratingColor};">${movie.rating_kp}</span>
 
 
 
714
  </div>
715
- <div class="movie-title">${movie.name}</div>
716
- </div>
717
  `;
718
  movieCard.addEventListener('click', () => {
719
  openMovieDetails(movie.description);
@@ -760,4 +783,4 @@ async def root():
760
 
761
  # Запускаем FastAPI
762
  if __name__ == "__main__":
763
- uvicorn.run(app, host="0.0.0.0", port=7860)
 
152
 
153
  def get_movie_data_from_db(conn, movie_ids):
154
  """
155
+ Получает данные фильмов из таблицы Movies по списку ID,
156
  включая предположительно URL-адрес постера и рейтинг.
157
  """
158
  movie_data_dict = {}
 
290
  # Определяем количество фильмов для запроса из БД
291
  db_limit = rerank_top_k or top_k * 2
292
 
293
+ # Модифицируем запрос для поддержки поиска по числовому идентификатору
294
  try:
295
  with conn.cursor() as cur:
296
+ if query.isdigit():
297
+ # Если запрос является числом, ищем по ID
298
+ cur.execute(f"""
299
+ SELECT m.movie_id, 1.0 as similarity
300
+ FROM "{embeddings_table}" m
301
+ WHERE m.movie_id = %s
302
+ LIMIT 1
303
+ """, (int(query),))
304
+ results = cur.fetchall()
305
+ logging.info(f"Найдено {len(results)} результатов по ID.")
306
+ else:
307
+ cur.execute(f"""
308
+ WITH query_embedding AS (
309
+ SELECT embedding
310
+ FROM "{query_cache_table}"
311
+ WHERE query_crc32 = %s
312
+ )
313
+ SELECT m.movie_id, 1 - (m.embedding <=> (SELECT embedding FROM query_embedding)) as similarity
314
+ FROM "{embeddings_table}" m, query_embedding
315
+ ORDER BY similarity DESC
316
+ LIMIT %s
317
+ """, (query_crc32, int(db_limit)))
318
+
319
+ results = cur.fetchall()
320
+ logging.info(f"Найдено {len(results)} предварительных результатов поиска по тексту.")
321
  except Exception as e:
322
  logging.error(f"Ошибка при выполнении поискового запроса: {e}")
323
  results = []
324
  finally:
325
  conn.close()
326
+
327
  # Используем реранкер только если rerank_top_k не равен 0
328
  if rerank_top_k != 0:
329
  reranked_results, rerank_success, reranked_count = rerank_with_api(query, results, top_k, rerank_top_k, jina_api_key)
 
364
 
365
  formatted_results = []
366
  for movie_id, score in reranked_results:
 
367
  movie_data, _, prepared_json = movie_data_dict.get(movie_id, (None, None, None))
368
  if movie_data:
369
  formatted_results.append({
 
375
  "poster_preview_url": prepared_json['Постер'],
376
  "rating_kp": prepared_json['Рейтинг'],
377
  "relevance_score": score if rerank_success else (
378
+ movie_data_dict.get(movie_id, (None, None, None))[1] if movie_data_dict.get(movie_id, (None, None, None)) is not None else 0.0)
379
  })
380
  else:
381
  logging.warning(f"Данные для фильма с ID {movie_id} не найдены в БД.")
 
391
  "search_time": search_time,
392
  "total_movies": total_movies,
393
  "searched_movies": searched_movies,
394
+ "returned_movies": len(formatted_results),
395
+ "reranked_movies": reranked_count,
396
+ "jina_balance": jina_balance
397
  }, search_time
398
 
399
  except Exception as e:
 
565
  background-color: #111;
566
  transition: transform 0.1s ease;
567
  cursor: pointer;
568
+ aspect-ratio: 6 / 9;
569
  }
570
  .movie-card:hover,
571
  .movie-card:focus {
 
573
  }
574
  .movie-poster {
575
  width: 100%;
576
+ height: 100%;
577
  object-fit: cover;
578
  }
579
  .movie-info {
 
588
  }
589
  .movie-title {
590
  width: 100%;
591
+ background-color: rgba(17, 17, 17, 0.8);
592
  font-size: 1.1em;
593
  font-weight: bold;
594
  text-align: center;
595
  padding: 10px;
596
  box-sizing: border-box;
597
+ z-index: 10;
598
  }
599
+
600
+ .movie-title-bg {
601
+ position: absolute;
602
+ bottom: 0;
603
+ left: 0;
604
+ width: 100%;
605
+ height: 50%;
606
+ background: linear-gradient(to top, rgba(17, 17, 17, 0.8), rgba(17, 17, 17, 0));
607
+ z-index: 1;
608
+ }
609
+
610
  .top-info {
611
  display: flex;
612
  justify-content: space-between;
613
  padding: 10px;
614
+ width: calc(100% - 20px);
615
+ z-index: 10;
616
  }
617
  .movie-year, .movie-rating {
618
  font-size: 0.8em;
619
  color: #ccc;
620
+ padding: 5px 10px;
621
+ background-color: rgba(17, 17, 17, 0.8);
622
+ border-radius: 5px;
623
  }
624
  .movie-details {
625
  display: none;
 
671
  .movie-grid {
672
  grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
673
  }
 
 
 
674
  .logo {
675
  font-size: 1.5em;
676
  }
 
679
  .movie-grid {
680
  grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
681
  }
 
 
 
682
  .logo {
683
  font-size: 1.3em;
684
  }
 
728
  movieCard.className = 'movie-card';
729
  const ratingColor = getRatingColor(movie.rating_kp);
730
  movieCard.innerHTML = `
731
+ <img src="${movie.poster_preview_url}" alt="${movie.name}" class="movie-poster">
732
+ <div class="movie-info">
733
+ <div class="top-info">
734
+ <span class="movie-year">${movie.year}</span>
735
+ <span class="movie-rating" style="color: ${ratingColor};">${movie.rating_kp}</span>
736
+ </div>
737
+ <div class="movie-title-bg"></div>
738
+ <div class="movie-title">${movie.name}</div>
739
  </div>
 
 
740
  `;
741
  movieCard.addEventListener('click', () => {
742
  openMovieDetails(movie.description);
 
783
 
784
  # Запускаем FastAPI
785
  if __name__ == "__main__":
786
+ uvicorn.run(app, host="0.0.0.0")