Filter based Search Form Previously on EE I've used Low Search to generate a filter based search form, based on categories. But with Craft I can't seem to find an add-on - Or even know if I need one!

What I'm trying to achieve is a filer menu with categories e.g.:

[ ] Category 1
[x] Category 2
[ ] Category 3
[x] Category 4
   [ ] Category 4.1
   [ ] Category 4.2
[ ] Category 5


I've been reading over the documentation over at:

https://craftcms.com/docs/searching and https://craftcms.com/docs/templating/search-form

But I'm struggling to see how I can make this work within a search form itself. 

I'm thinking I can generate a query fine to search the categories. But I can't work out how to link what is checked with a query.

Any help would be gooooood :)
I managed to figure this out by looking through a few other posts:


Advanced Search
Building a simple search by multiple categories
Building Results From Advanced Search Form
How to filter entries by clicking multiple categories on front end
Fetching entries from an advanced search form on the front end


Which I then took their knowledge and put together my own form and results template. With the results I wanted the same code &amp; template to be used for search results AND the general "knowledge" page.

Filter Form

&lt;form action="{{ url('knowledge') }}"&gt;

    &lt;ul&gt;

        {% set categoryEntries = craft.entries.limit(null) %}

        {% for category in craft.categories.group('knowledge') %}

            {% set categoriesEntryCount = categoryEntries.relatedTo(category).total() %}

            &lt;li&gt;
              &lt;input type="checkbox" name="category[]" value="{{ category.slug }}" id="{{ category.slug }}"&gt;
              &lt;label for="{{ category.slug }}"&gt;{{ category.title }} ({{ categoriesEntryCount }})&lt;/label&gt;
            &lt;/li&gt;

        {% endfor %}

    &lt;/ul&gt;

&lt;/form&gt;


Results

    {% set parameters =
        {
            section: 'channelKnowledge',
            limit: '1'
        }
    %}

    {% set categoryQuery = craft.request.getParam('category') %}

    {% if categoryQuery %}
        {% set categoryQueryCategories = craft.categories.group('knowledge').slug(categoryQuery) %}
        {% set entries = craft.entries(parameters).relatedTo(categoryQueryCategories).order('score') %}
    {% else %}
        {% set entries = craft.entries(parameters) %}
    {% endif %}

    {% paginate entries as channelKnowledgeEntries %}

    {% if entries|length %}

        {% for entry in channelKnowledgeEntries %}

            {{ entry.title }}

        {% endfor %}

    {% else %}

        &lt;p&gt;No Results&lt;/p&gt;

    {% endif %}

    {% if paginate %}

        &lt;div class="pagination"&gt;
            {% if paginate.prevUrl %}
                &lt;span&gt;
                    &lt;a href="{{ paginate.prevUrl }}" class="back"&gt;Previous&lt;/a&gt;
                &lt;/span&gt;
            {% endif %}
            &lt;ul&gt;
                {% for page, url in paginate.getPrevUrls(5) %}
                    &lt;li&gt;
                        &lt;a href="{{ url }}"&gt;{{ page }}&lt;/a&gt;
                    &lt;/li&gt;
                {% endfor %}
                &lt;li&gt;
                    &lt;a href="" class="active"&gt;
                        {{ paginate.currentPage }}
                    &lt;/a&gt;
                &lt;/li&gt;
                {% for page, url in paginate.getNextUrls(5) %}
                    &lt;li&gt;
                        &lt;a href="{{ url }}"&gt;{{ page }}&lt;/a&gt;
                    &lt;/li&gt;
                {% endfor %}
            &lt;/ul&gt;
            {% if paginate.nextUrl %}
                &lt;span&gt;
                    &lt;a href="{{ paginate.nextUrl }}" class="forward"&gt;Next&lt;/a&gt;
                &lt;/span&gt;
            {% endif %}
        &lt;/div&gt;

    {% endif %}

{% endpaginate %}