create_app.py 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import sqlite3
  2. from functools import lru_cache
  3. from typing import List
  4. import Levenshtein
  5. from fastapi import FastAPI
  6. from starlette.responses import RedirectResponse, FileResponse
  7. from starlette.staticfiles import StaticFiles
  8. from index import TinyIndex, Document
  9. def create(tiny_index: TinyIndex):
  10. app = FastAPI()
  11. @app.get("/search")
  12. def search(s: str):
  13. if '—' in s:
  14. url = s.split('—')[1].strip()
  15. else:
  16. url = f'https://www.google.com/search?q={s}'
  17. return RedirectResponse(url)
  18. def order_results(query, results: List[Document]):
  19. ordered_results = sorted(results, key=lambda result: Levenshtein.distance(query, result.title))
  20. print("Order results", query, ordered_results, sep='\n')
  21. return ordered_results
  22. @app.get("/complete")
  23. def complete(q: str):
  24. terms = [x.lower() for x in q.replace('.', ' ').split()]
  25. # completed = complete_term(terms[-1])
  26. # terms = terms[:-1] + [completed]
  27. pages = []
  28. for term in terms:
  29. items = tiny_index.retrieve(term)
  30. if items is not None:
  31. pages += [item for item in items if term in item.title.lower()]
  32. ordered_results = order_results(q, pages)
  33. results = [item.title.replace("\n", "") + ' — ' +
  34. item.url.replace("\n", "") for item in ordered_results]
  35. if len(results) == 0:
  36. # print("No results")
  37. return []
  38. # print("Results", results)
  39. return [q, results]
  40. @app.get('/')
  41. def index():
  42. return FileResponse('static/index.html')
  43. app.mount('/', StaticFiles(directory="static"), name="static")
  44. return app