Now always ignoring short words in the search query to be able to always use index. Adding small search help docs.

This commit is contained in:
Alexey Skobkin 2020-07-20 01:26:58 +03:00
parent 5d94761fae
commit a24d9c0670
3 changed files with 54 additions and 11 deletions

View File

@ -7,6 +7,9 @@ use Doctrine\ORM\{Mapping\ClassMetadata, QueryBuilder};
class TorrentSearcher
{
/** Minimal word length to be used when searching in the database. */
public const MIN_PART_LENGTH = 3;
private const ORDER_DISABLED_FIELDS = ['infoHash'];
/** @var TorrentRepository */
@ -73,6 +76,20 @@ class TorrentSearcher
$query = trim($query);
$query = preg_replace('/\s+/', ' ', $query);
return explode(' ', $query);
$parts = explode(' ', $query);
return $this->removeShortParts($parts);
}
/**
* @param string[] $words
*
* @return string[]
*/
private function removeShortParts(array $words): array
{
return array_filter($words, function (string $word) {
return mb_strlen($word) >= self::MIN_PART_LENGTH;
});
}
}

View File

@ -44,17 +44,24 @@
<main id="content" role="main" class="container">
{% if is_granted('ROLE_USER') %}
<div class id="form-search">
<form class="" action="{{ path('torrents_search') }}" method="get">
<div class="input-group mb-3">
<input name="query" class="form-control" type="text" placeholder="Torrent" aria-label="Search"
value="{% if searchQuery is defined %}{{ searchQuery }}{% endif %}"
{# @var app \Symfony\Bridge\Twig\AppVariable #}
{% if 'index' == app.request.get('_route') %}autofocus{% endif %} />
<div class="input-group-append">
<button class="btn btn-outline-primary my-2 my-sm-0" type="submit"><i class="fas fa-search"></i> Search</button>
</div>
<form class="" action="{{ path('torrents_search') }}" method="get">
<div class="input-group mb-3">
<input name="query" class="form-control" type="text" placeholder="Torrent" aria-label="Search"
value="{% if searchQuery is defined %}{{ searchQuery }}{% endif %}"
{# @var app \Symfony\Bridge\Twig\AppVariable #}
{% if 'index' == app.request.get('_route') %}autofocus{% endif %} />
<div class="input-group-append">
<button class="btn btn-outline-primary my-2 my-sm-0" type="submit"><i class="fas fa-search"></i> Search</button>
<button class="btn btn-outline-info" type="button" data-toggle="collapse" data-target="#search-rules" aria-expanded="false" aria-controls="search-rules">
<i class="fa fa-question-circle"></i>
</button>
</div>
</form>
</div>
</form>
<div class="alert alert-info collapse" role="alert" id="search-rules">
{{ include('search_rules_help.html.twig') }}
</div>
</div>
{% endif %}

View File

@ -0,0 +1,19 @@
<p>
Use words consisting of <strong>{{ constant('\\App\\Search\\TorrentSearcher::MIN_PART_LENGTH') }}+</strong> characters.
Shorter words will be <u>ignored</u>.
</p>
<p>
The search will find torrents containing <strong>all</strong> words you used <u>regardless of their order and case</u>.
</p>
<p>
Examples: <br/>
Use <code>pirates silicon valley</code> if you want to find "Pirates of Silicon Valley". Note that <code>of</code> will be ignored even
if you use it in the query. <br/>
Use <code>some series s08e10</code> if you want to find specific episode of some season of TV show. <br/>
Use <code>some series season</code> if you want to find full season. <br/>
It's also useful to use popular keywords if you want to find specific quality or format: <br/>
<code>some show 2160 265</code> should be enough to find what you need in 4k encoded with H.265 (HEVC).
</p>
<p>
Use your imagination <i class="fas fa-smile-wink"></i>
</p>