mirror of
https://github.com/squidfunk/mkdocs-material.git
synced 2024-06-14 11:52:32 +03:00
217 lines
6.7 KiB
Markdown
217 lines
6.7 KiB
Markdown
---
|
||
template: overrides/main.html
|
||
description: >
|
||
How we rebuilt client-side search, delivering a better user experience while
|
||
making it faster and smaller at the same time
|
||
disqus: mkdocs-material
|
||
search:
|
||
exclude: true
|
||
---
|
||
|
||
# Excluding content from search
|
||
|
||
__The latest Insiders release brings three new simple ways to exclude
|
||
dedicated parts of a document from the search index, allowing for more
|
||
fine-grained control.__
|
||
|
||
<aside class="mdx-author" markdown="1">
|
||
![@squidfunk][1]
|
||
|
||
<span>__Martin Donath__ · @squidfunk</span>
|
||
<span>
|
||
:octicons-calendar-24: September 26, 2021 ·
|
||
:octicons-clock-24: 5 min read ·
|
||
[:octicons-tag-24: 7.3.0+insiders-3.1.1](../../insiders/changelog.md#311-_-september-26-2021)
|
||
</span>
|
||
</aside>
|
||
|
||
[1]: https://avatars.githubusercontent.com/u/932156
|
||
|
||
---
|
||
|
||
Two weeks ago, Material for MkDocs Insiders shipped a [brand new search
|
||
plugin][2], yielding [massive improvements in usability][3], but also in [speed
|
||
and size][4] of the search index. Interestingly, as discussed in the previous
|
||
blog article, we only scratched the surface of what's now possible. This
|
||
release brings some useful features that enhance the writing experience,
|
||
allowing for more fine-grained control of what pages, sections and blocks of a
|
||
Markdown file should be indexed by the built-in search functionality.
|
||
|
||
_The following section discusses existing solutions for excluding pages and
|
||
sections from the search index. If you immediately want to learn what's new,
|
||
skip to the [section just after that][5]._
|
||
|
||
[2]: search-better-faster-smaller.md
|
||
[3]: search-better-faster-smaller.md#whats-new
|
||
[4]: search-better-faster-smaller.md#benchmarks
|
||
[5]: #whats-new
|
||
|
||
## Prior art
|
||
|
||
MkDocs has a rich and thriving ecosystem of [plugins][6], and it comes as no
|
||
surprise that there's already a fantastic plugin by @chrieke to exclude specific
|
||
sections of a Markdown file – the [mkdocs-exclude-search][7] plugin. It can be
|
||
installed with:
|
||
|
||
```
|
||
pip install mkdocs-exclude-search
|
||
```
|
||
|
||
__How it works__: the plugin post-processes the `search_index.json` file that
|
||
is generated by the built-in search plugin, giving the author the ability to
|
||
exclude certain pages and sections by adding a few lines of configuration to
|
||
`mkdocs.yml`. An example:
|
||
|
||
``` yaml
|
||
plugins:
|
||
- search
|
||
- exclude-search:
|
||
exclude:
|
||
- page.md
|
||
- page.md#section
|
||
- directory/*
|
||
- /*/page.md
|
||
```
|
||
|
||
It's easy to see that the plugin follows a configuration-centric approach, which
|
||
adds support for advanced filtering techniques like infix- and suffix-filtering
|
||
using wildcards. While this is a very powerful idea, it comes with some
|
||
downsides:
|
||
|
||
1. __Exclusion patterns and content are not co-located__: exclusion patterns
|
||
need to be defined in `mkdocs.yml`, and not as part of the respective
|
||
document or section to be excluded. This might result in stale exclusion
|
||
patterns, leading to unintended behavior:
|
||
|
||
- When a headline is changed, its slug (permalink) also changes, which might
|
||
suddenly match (or unmatch) a pattern, e.g., when an author fixes a typo
|
||
in a headline.
|
||
|
||
- As exclusion patterns support the use of wildcards, different authors
|
||
might overwrite each other's patterns without any immediate feedback since
|
||
the plugin does only report the number of excluded documents – not _what_
|
||
has been excluded.[^1]
|
||
|
||
[^1]:
|
||
When the log level is set to `DEBUG`, the plugin will report exactly which
|
||
pages and sections have been excluded from the search index, but MkDocs will
|
||
now flood the terminal with debug output from its core and other plugins.
|
||
|
||
2. __Exclusion control might be too coarse__: The [mkdocs-exclude-search][7]
|
||
plugin only allows for the exclusion of pages and sections. It's not possible
|
||
to exclude parts of a section, e.g., content that is irrelevant to search but
|
||
must be included as part of the documentation.
|
||
|
||
[6]: https://github.com/mkdocs/mkdocs/wiki/MkDocs-Plugins
|
||
[7]: https://github.com/chrieke/mkdocs-exclude-search
|
||
|
||
## What's new?
|
||
|
||
The latest Insiders release brings fine-grained control for [__excluding pages,
|
||
sections, and blocks__][8] from the search index, implemented through front
|
||
matter, as well as the [Attribute List][9] extension. Note that it doesn't
|
||
replace the [mkdocs-exclude-search][7] plugin but _complements_ it.
|
||
|
||
[8]: ../../setup/setting-up-site-search.md#search-exclusion
|
||
[9]: https://python-markdown.github.io/extensions/attr_list/
|
||
|
||
### Excluding pages
|
||
|
||
An entire page can be excluded from the search index by adding a simple
|
||
directive to the front matter of the respective Markdown file. The good thing
|
||
is that the author now only has to check the top of the document to learn
|
||
whether it is excluded or not:
|
||
|
||
``` bash
|
||
---
|
||
search:
|
||
exclude: true
|
||
---
|
||
|
||
# Document title
|
||
...
|
||
```
|
||
|
||
### Excluding sections
|
||
|
||
If a section should be excluded, the author can use the [Attribute List][9]
|
||
extension to add a __pragma__ called `{ data-search-exclude }` at the end of a
|
||
heading. The pragma is not included in the final HTML, as search pragmas are
|
||
filtered by the search plugin before the page is rendered:
|
||
|
||
=== "`docs/page.md`"
|
||
|
||
``` markdown
|
||
# Document title
|
||
|
||
## Section 1
|
||
|
||
The content of this section is included
|
||
|
||
## Section 2 { data-search-exclude }
|
||
|
||
The content of this section is excluded
|
||
```
|
||
|
||
=== "`search_index.json`"
|
||
|
||
``` json
|
||
{
|
||
...
|
||
"docs": [
|
||
{
|
||
"location":"page/",
|
||
"text":"",
|
||
"title":"Document title"
|
||
},
|
||
{
|
||
"location":"page/#section-1",
|
||
"text":"<p>The content of this section is included</p>",
|
||
"title":"Section 1"
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
### Excluding blocks
|
||
|
||
If even more fine-grained control is desired, the __pragma__ can be added to
|
||
any [block-level element][10] or [inline-level element][11] that is officially
|
||
supported by the [Attribute List][9] extension:
|
||
|
||
=== "`docs/page.md`"
|
||
|
||
``` markdown
|
||
# Document title
|
||
|
||
The content of this block is included
|
||
|
||
The content of this block is excluded
|
||
{ data-search-exclude }
|
||
```
|
||
|
||
=== "`search_index.json`"
|
||
|
||
``` json
|
||
{
|
||
...
|
||
"docs": [
|
||
{
|
||
"location":"page/",
|
||
"text":"<p>The content of this block is included</p>",
|
||
"title":"Document title"
|
||
},
|
||
]
|
||
}
|
||
```
|
||
|
||
[10]: https://python-markdown.github.io/extensions/attr_list/#block-level
|
||
[11]: https://python-markdown.github.io/extensions/attr_list/#inline-level
|
||
|
||
## Conclusion
|
||
|
||
The latest release brings three simple ways to control more precisely what goes
|
||
into the search index and what doesn't. It complements the already very powerful
|
||
[mkdocs-exclude-search][7] plugin, allowing for new methods of shaping the
|
||
structure, size and content of the search index.
|