create_app.py 1.7 KB

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