search: sort by score

Sort by size of the matches compared to the package names

Fixes #46
This commit is contained in:
Christoph Reiter
2021-08-15 17:17:01 +02:00
parent e8b04a4bbc
commit 27f423b5dc
2 changed files with 28 additions and 9 deletions

View File

@@ -56,7 +56,7 @@
</tr>
</thead>
<tbody>
{% for s in results %}
{% for score, s in results %}
<tr>
<td><a href="{{ url_for('base', base_name=s.name) }}">{{ s.name }}</a></td>
<td>{{ s.version }}</td>
@@ -85,7 +85,7 @@
</tr>
</thead>
<tbody>
{% for p in results %}
{% for score, p in results %}
<tr>
<td><a href="{{ package_url(p) }}">{{ package_name(p) }}</td>
<td>{{ p.version }}</td>

View File

@@ -491,21 +491,40 @@ async def search(request: Request, response: Response, q: str = "", t: str = "")
qtype = "pkg"
parts = query.split()
res_pkg: List[Union[Package, Source]] = []
parts_lower = [p.lower() for p in parts]
res_pkg: List[Tuple[float, Union[Package, Source]]] = []
def get_score(name: str, parts: List[str]) -> float:
score = 0.0
for part in parts:
if part not in name:
return -1
score += name.count(part) * len(part) / len(name)
return score
if not query:
pass
elif qtype == "pkg":
for s in state.sources.values():
if [p for p in parts if p.lower() in s.name.lower()] == parts:
res_pkg.append(s)
res_pkg.sort(key=lambda s: s.name.lower())
score = get_score(s.realname.lower(), parts_lower)
if score >= 0:
res_pkg.append((score, s))
continue
score = get_score(s.name.lower(), parts_lower)
if score >= 0:
res_pkg.append((score, s))
res_pkg.sort(key=lambda e: (-e[0], e[1].name.lower()))
elif qtype == "binpkg":
for s in state.sources.values():
for sub in s.packages.values():
if [p for p in parts if p.lower() in sub.name.lower()] == parts:
res_pkg.append(sub)
res_pkg.sort(key=lambda p: p.name.lower())
score = get_score(sub.realname.lower(), parts_lower)
if score >= 0:
res_pkg.append((score, sub))
continue
score = get_score(sub.name.lower(), parts_lower)
if score >= 0:
res_pkg.append((score, sub))
res_pkg.sort(key=lambda e: (-e[0], e[1].name.lower()))
return templates.TemplateResponse("search.html", {
"request": request,