1
0
Fork 0
mirror of https://github.com/Findus23/cr-search.git synced 2024-09-19 15:23:44 +02:00

add benchmark

This commit is contained in:
Lukas Winkler 2020-08-15 12:27:16 +02:00
parent cc52019e25
commit 2de370a692
Signed by: lukas
GPG key ID: 54DE4D798D244853
2 changed files with 42 additions and 33 deletions

1
.gitignore vendored
View file

@ -122,3 +122,4 @@ data/
runtime/ runtime/
web/data.json web/data.json
benchmark/

View file

@ -2,7 +2,7 @@ import logging
from typing import List from typing import List
from flask import request, jsonify, Response from flask import request, jsonify, Response
from peewee import fn, Alias, SQL, DoesNotExist, Expression from peewee import fn, Alias, SQL, DoesNotExist, Expression, ModelSelect
from playhouse.postgres_ext import TS_MATCH from playhouse.postgres_ext import TS_MATCH
from playhouse.shortcuts import model_to_dict from playhouse.shortcuts import model_to_dict
from psycopg2._psycopg import cursor from psycopg2._psycopg import cursor
@ -10,9 +10,9 @@ from psycopg2._psycopg import cursor
from app import app from app import app
from models import * from models import *
logger = logging.getLogger('peewee') # logger = logging.getLogger('peewee')
logger.addHandler(logging.StreamHandler()) # logger.addHandler(logging.StreamHandler())
logger.setLevel(logging.DEBUG) # logger.setLevel(logging.DEBUG)
def add_cors(response): def add_cors(response):
@ -21,39 +21,18 @@ def add_cors(response):
return response return response
global_excludes = [Line.search_text, Episode.phrases_imported, Episode.text_imported, Person.series, Episode.title] def suggest(query: str, until: int, series: int, limit: int = 10) -> ModelSelect:
return Phrase.select(Phrase.text, Alias(fn.SUM(Phrase.count), "total_count")).join(Episode).where(
@app.route("/api/suggest")
def question():
query: str = request.args.get('query')
until = request.args.get('until')
series = request.args.get('series')
if not query or not until or not series:
return "no suggest query", 400
if len(query) > 50:
return "too long query", 400
phrases = Phrase.select(Phrase.text, Alias(fn.SUM(Phrase.count), "total_count")).join(Episode).where(
(Episode.series == series) & (Episode.series == series) &
(Episode.episode_number <= until) & (Episode.episode_number <= until) &
(Phrase.text.contains(query)) (Phrase.text.contains(query))
).group_by(Phrase.text).order_by(SQL("total_count DESC")).limit(10) ).group_by(Phrase.text).order_by(SQL("total_count DESC")).limit(limit)
return jsonify([p.text for p in phrases])
@app.route("/api/search") def search(query: str, until: int, series: int, limit: int = 50) -> ModelSelect:
def search():
query = request.args.get('query')
until = request.args.get('until')
series = request.args.get('series')
if not query or not until or not series:
return "no suggest query", 400
if len(query) > 50:
return "too long query", 400
a = Alias(fn.ts_rank_cd(Line.search_text, fn.websearch_to_tsquery('english', query), 1 + 4), "rank") a = Alias(fn.ts_rank_cd(Line.search_text, fn.websearch_to_tsquery('english', query), 1 + 4), "rank")
results = Line.select(Line, Person, Episode, Series, a).where( return Line.select(Line, Person, Episode, Series, a).where(
Expression(Line.search_text, TS_MATCH, fn.websearch_to_tsquery('english', query)) Expression(Line.search_text, TS_MATCH, fn.websearch_to_tsquery('english', query))
& &
(Episode.episode_number <= until) (Episode.episode_number <= until)
@ -62,7 +41,36 @@ def search():
).order_by(SQL("rank DESC")) \ ).order_by(SQL("rank DESC")) \
.join(Person).switch(Line) \ .join(Person).switch(Line) \
.join(Episode).join(Series) \ .join(Episode).join(Series) \
.limit(50) .limit(limit)
global_excludes = [Line.search_text, Episode.phrases_imported, Episode.text_imported, Person.series, Episode.title]
@app.route("/api/suggest")
def api_question():
query: str = request.args.get('query')
until = request.args.get('until')
series = request.args.get('series')
if not query or not until or not series:
return "no suggest query", 400
if len(query) > 50:
return "too long query", 400
phrases = suggest(query, until, series)
return jsonify([p.text for p in phrases])
@app.route("/api/search")
def api_search():
query = request.args.get('query')
until = request.args.get('until')
series = request.args.get('series')
if not query or not until or not series:
return "no suggest query", 400
if len(query) > 50:
return "too long query", 400
results = search(query, until, series)
if len(results) == 0: if len(results) == 0:
result: cursor = db.execute_sql("select websearch_to_tsquery('english',%s)", [query]) result: cursor = db.execute_sql("select websearch_to_tsquery('english',%s)", [query])
@ -90,7 +98,7 @@ def search():
@app.route("/api/expand") @app.route("/api/expand")
def expand(): def api_expand():
center_id = request.args.get('centerID') center_id = request.args.get('centerID')
offset = int(request.args.get('offset', 1)) offset = int(request.args.get('offset', 1))
if not center_id: if not center_id:
@ -115,7 +123,7 @@ def expand():
@app.route("/api/episodes") @app.route("/api/episodes")
def episodes(): def api_episodes():
all_series: List[Series] = Series.select().order_by(Series.id) all_series: List[Series] = Series.select().order_by(Series.id)
data = [] data = []
for series in all_series: for series in all_series: