mirror of https://github.com/laurent22/joplin.git
465 lines
14 KiB
HTML
465 lines
14 KiB
HTML
<!doctype html>
|
||
<html>
|
||
|
||
<!--
|
||
|
||
!!! WARNING !!!
|
||
|
||
This file was auto-generated from readme/spec/search_sorting.md and any manual change
|
||
made to it will be overwritten. To make a change to this file please modify
|
||
the source Markdown file:
|
||
|
||
https://github.com/laurent22/joplin/blob/dev/readme/spec/search_sorting.md
|
||
|
||
-->
|
||
|
||
<head>
|
||
<title>Search Engine | Joplin</title>
|
||
<meta charset="utf-8">
|
||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||
<link rel="stylesheet" href="https://joplinapp.org/css/bootstrap.min.css">
|
||
<link rel="shortcut icon" type="image/x-icon" href="https://joplinapp.org/favicon.ico">
|
||
<!-- <link rel="stylesheet" href="https://joplinapp.org/css/fontawesome-all.min.css"> -->
|
||
<link rel="stylesheet" href="https://joplinapp.org/css/fork-awesome.min.css">
|
||
<script src="https://joplinapp.org/js/jquery-3.2.1.slim.min.js"></script>
|
||
<style>
|
||
body {
|
||
background-color: #F1F1F1;
|
||
color: #333333;
|
||
}
|
||
|
||
.root {
|
||
overflow: hidden;
|
||
}
|
||
|
||
a[href^="mailto:"] {
|
||
word-break: break-all;
|
||
}
|
||
|
||
table {
|
||
margin-bottom: 1em;
|
||
}
|
||
td, th {
|
||
padding: .8em;
|
||
border: 1px solid #ccc;
|
||
}
|
||
|
||
.page-markdown table pre,
|
||
.page-markdown table blockquote {
|
||
margin-bottom: 0;
|
||
}
|
||
|
||
.page-markdown table pre,
|
||
.page-markdown table blockquote {
|
||
margin-bottom: 0;
|
||
}
|
||
|
||
.page-markdown table pre {
|
||
background-color: rgba(0,0,0,0);
|
||
border: none;
|
||
margin: 0;
|
||
padding: 0;
|
||
}
|
||
|
||
h1, h2 {
|
||
border-bottom: 1px solid #eaecef;
|
||
padding-bottom: 0.3em;
|
||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
|
||
font-weight: 600;
|
||
font-size: 2em;
|
||
margin-bottom: 16px;
|
||
}
|
||
h2 {
|
||
font-size: 1.6em;
|
||
}
|
||
h3 {
|
||
font-size: 1.3em;
|
||
}
|
||
code {
|
||
color: black;
|
||
background-color: #eee;
|
||
border: 1px solid #ccc;
|
||
font-size: .85em;
|
||
/* word-break: break-all; */
|
||
}
|
||
pre code {
|
||
border: none;
|
||
}
|
||
pre {
|
||
font-size: .85em;
|
||
}
|
||
blockquote {
|
||
font-size: 1em;
|
||
color: #555;
|
||
};
|
||
#toc ul {
|
||
margin-bottom: 10px;
|
||
}
|
||
#toc > ul > li {
|
||
margin-bottom: 10px;
|
||
}
|
||
#toc {
|
||
padding-bottom: 1em;
|
||
}
|
||
.title {
|
||
display: flex;
|
||
align-items: center;
|
||
}
|
||
.title-icon {
|
||
display: flex;
|
||
height: 1em;
|
||
}
|
||
.title-text {
|
||
display: flex;
|
||
font-weight: normal;
|
||
margin-bottom: .2em;
|
||
margin-left: .5em;
|
||
}
|
||
.sub-title {
|
||
font-weight: normal;
|
||
}
|
||
.container {
|
||
background-color: white;
|
||
padding: 0;
|
||
box-shadow: 0 10px 20px #888888;
|
||
}
|
||
table.screenshots {
|
||
margin-top: 2em;
|
||
margin-bottom: 2em;
|
||
}
|
||
table.screenshots th {
|
||
height: 3em;
|
||
text-align: center;
|
||
}
|
||
table.screenshots th,
|
||
table.screenshots td {
|
||
border: 1px solid #C2C2C2;
|
||
}
|
||
img[align="left"] {
|
||
margin-right: 10px;
|
||
margin-bottom: 10px;
|
||
}
|
||
.mobile-screenshot {
|
||
height: 40em;
|
||
padding: 1em;
|
||
}
|
||
.cli-screenshot-wrapper {
|
||
background-color: black;
|
||
vertical-align: top;
|
||
padding: 1em 2em 1em 1em;
|
||
}
|
||
.cli-screenshot {
|
||
font-family: "Monaco", "Inconsolata", "CONSOLAS", "Deja Vu Sans Mono", "Droid Sans Mono", "Andale Mono", monospace;
|
||
background-color: black;
|
||
color: white;
|
||
border: none;
|
||
}
|
||
.cli-screenshot .prompt {
|
||
color: #48C2F0;
|
||
}
|
||
.top-screenshot {
|
||
margin-top: 2em;
|
||
text-align: center;
|
||
}
|
||
.header {
|
||
position: relative;
|
||
padding-left: 2em;
|
||
padding-right: 2em;
|
||
padding-top: 1em;
|
||
padding-bottom: 1em;
|
||
color: white;
|
||
background-color: #2B2B3D;
|
||
}
|
||
.header a h1 {
|
||
color: white;
|
||
}
|
||
.header a:hover {
|
||
text-decoration: none;
|
||
}
|
||
.content {
|
||
padding-left: 2em;
|
||
padding-right: 2em;
|
||
padding-bottom: 2em;
|
||
padding-top: 2em;
|
||
}
|
||
.forkme {
|
||
position: absolute;
|
||
right: 0;
|
||
top:0;
|
||
}
|
||
.nav-wrapper {
|
||
position: relative;
|
||
width: inherit;
|
||
}
|
||
.nav {
|
||
background-color: black;
|
||
display: flex;
|
||
flex-direction: row;
|
||
align-items: center;
|
||
}
|
||
.nav.sticky {
|
||
position:fixed;
|
||
top: 0;
|
||
width: inherit;
|
||
box-shadow: 0 0 10px #000000;
|
||
}
|
||
.nav a {
|
||
color: white;
|
||
display: inline-block;
|
||
padding: .6em .9em .6em .9em;
|
||
}
|
||
.nav ul {
|
||
padding-left: 2em;
|
||
margin-bottom: 0;
|
||
display: table-cell;
|
||
display: flex;
|
||
width: 100%;
|
||
/* For GSoC: */
|
||
min-width: 470px;
|
||
}
|
||
.nav ul li {
|
||
display: inline-block;
|
||
padding: 0;
|
||
}
|
||
.nav li.selected {
|
||
background-color: #222;
|
||
font-weight: bold;
|
||
}
|
||
.nav-right {
|
||
display: flex;
|
||
text-align: right;
|
||
vertical-align: middle;
|
||
line-height: 0;
|
||
margin-right: 10px;
|
||
}
|
||
.nav-right .share-btn {
|
||
display: none;
|
||
}
|
||
.nav-right .small-share-btn {
|
||
display: none;
|
||
}
|
||
.footer {
|
||
padding: 2em;
|
||
border-top: 1px solid #d4d4d4;
|
||
margin-top: 2em;
|
||
color: gray;
|
||
font-size: .9em;
|
||
}
|
||
a.heading-anchor {
|
||
display: inline-block;
|
||
opacity: 0;
|
||
width: 1.3em;
|
||
font-size: 0.7em;
|
||
margin-left: 0.4em;
|
||
line-height: 1em;
|
||
text-decoration: none;
|
||
transition: opacity 0.3s;
|
||
}
|
||
a.heading-anchor:hover,
|
||
h1:hover a.heading-anchor,
|
||
h2:hover a.heading-anchor,
|
||
h3:hover a.heading-anchor,
|
||
h4:hover a.heading-anchor,
|
||
h5:hover a.heading-anchor,
|
||
h6:hover a.heading-anchor {
|
||
opacity: 1;
|
||
}
|
||
|
||
@media (min-width: 992px) {
|
||
.content{
|
||
display: flex;
|
||
}
|
||
|
||
#toc{
|
||
display: block!important;
|
||
align-self: flex-start;
|
||
width: 300px;
|
||
position: sticky; top: 20px; left: 0;
|
||
}
|
||
|
||
.main{
|
||
width: calc(100% - 300px);
|
||
}
|
||
}
|
||
|
||
.bottom-links {
|
||
display: flex;
|
||
justify-content: center;
|
||
border-top: 1px solid #d4d4d4;
|
||
margin-top: 30px;
|
||
padding-top: 25px;
|
||
}
|
||
|
||
@media all and (min-width: 400px) {
|
||
.nav-right .share-btn {
|
||
display: inline-block;
|
||
}
|
||
.nav-right .small-share-btn {
|
||
display: none;
|
||
}
|
||
}
|
||
</style>
|
||
</head>
|
||
|
||
<body>
|
||
|
||
<div class="container root page-search_sorting">
|
||
|
||
<div class="header">
|
||
<a class="forkme" href="https://github.com/laurent22/joplin"><img src="https://joplinapp.org/images/ForkMe.png"/></a>
|
||
<a href="https://joplinapp.org"><h1 class="title"><img class="title-icon" src="https://joplinapp.org/images/Icon512.png"><span class="title-text">Joplin</span></h1></a>
|
||
<p class="sub-title">An open source note taking and to-do application with synchronisation capabilities</p>
|
||
</div>
|
||
|
||
<div class="nav-wrapper">
|
||
<div class="nav">
|
||
<ul>
|
||
<li class=""><a href="https://joplinapp.org/" title="Home"><i class="fa fa-home"></i></a></li>
|
||
<li><a href="https://discourse.joplinapp.org" title="Forum">Forum</a></li>
|
||
<li><a class="gsoc" href="https://joplinapp.org/gsoc2021/index/" title="Google Summer of Code 2021">GSoC 2021</a></li>
|
||
</ul>
|
||
<div class="nav-right">
|
||
<iframe class="share-btn share-btn-github" src="https://ghbtns.com/github-btn.html?user=laurent22&repo=joplin&type=star&count=true" frameborder="0" scrolling="0" width="115px" height="20px"></iframe>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="content">
|
||
<div id="toc"><ul>
|
||
<li>
|
||
<p>Applications</p>
|
||
<ul>
|
||
<li><a href="https://joplinapp.org/desktop/">Desktop application</a></li>
|
||
<li><a href="https://joplinapp.org/mobile/">Mobile applications</a></li>
|
||
<li><a href="https://joplinapp.org/terminal/">Terminal application</a></li>
|
||
<li><a href="https://joplinapp.org/clipper/">Web Clipper</a></li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>Support</p>
|
||
<ul>
|
||
<li><a href="https://discourse.joplinapp.org">Joplin Forum</a></li>
|
||
<li><a href="https://joplinapp.org/markdown/">Markdown Guide</a></li>
|
||
<li><a href="https://joplinapp.org/e2ee/">How to enable end-to-end encryption</a></li>
|
||
<li><a href="https://joplinapp.org/conflict/">What is a conflict?</a></li>
|
||
<li><a href="https://joplinapp.org/debugging/">How to enable debug mode</a></li>
|
||
<li><a href="https://joplinapp.org/rich_text_editor/">About the Rich Text editor limitations</a></li>
|
||
<li><a href="https://joplinapp.org/faq/">FAQ</a></li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>Joplin API - Get Started</p>
|
||
<ul>
|
||
<li><a href="https://joplinapp.org/api/overview/">Joplin API Overview</a></li>
|
||
<li><a href="https://joplinapp.org/api/get_started/plugins/">Plugin development</a></li>
|
||
<li><a href="https://joplinapp.org/api/tutorials/toc_plugin/">Plugin tutorial</a></li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>Joplin API - References</p>
|
||
<ul>
|
||
<li><a href="https://joplinapp.org/api/references/plugin_api/classes/joplin.html">Plugin API</a></li>
|
||
<li><a href="https://joplinapp.org/api/references/rest_api/">Data API</a></li>
|
||
<li><a href="https://joplinapp.org/api/references/plugin_manifest/">Plugin manifest</a></li>
|
||
<li><a href="https://joplinapp.org/api/references/plugin_loading_rules/">Plugin loading rules</a></li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>Development</p>
|
||
<ul>
|
||
<li><a href="https://github.com/laurent22/joplin/blob/dev/BUILD.md">How to build the apps</a></li>
|
||
<li><a href="https://joplinapp.org/spec/e2ee/">End-to-end encryption spec</a></li>
|
||
<li><a href="https://joplinapp.org/spec/history/">Note History spec</a></li>
|
||
<li><a href="https://joplinapp.org/spec/sync_lock/">Sync Lock spec</a></li>
|
||
<li><a href="https://joplinapp.org/spec/plugins/">Plugin Architecture spec</a></li>
|
||
<li><a href="https://joplinapp.org/spec/search_sorting/">Search Sorting spec</a></li>
|
||
<li><a href="https://joplinapp.org/spec/server_file_url_format/">Server: File URL Format</a></li>
|
||
<li><a href="https://joplinapp.org/spec/server_delta_sync/">Server: Delta Sync</a></li>
|
||
<li><a href="https://joplinapp.org/spec/server_sharing/">Server: Sharing</a></li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>Google Summer of Code 2021</p>
|
||
<ul>
|
||
<li><a href="https://joplinapp.org/gsoc2021/index/">Google Summer of Code 2021</a></li>
|
||
<li><a href="https://joplinapp.org/gsoc2021/pull_request_guidelines/">How to submit a GSoC pull request</a></li>
|
||
<li><a href="https://joplinapp.org/gsoc2021/ideas/">Project Ideas</a></li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<p>About</p>
|
||
<ul>
|
||
<li><a href="https://joplinapp.org/changelog/">Changelog (Desktop App)</a></li>
|
||
<li><a href="https://joplinapp.org/changelog_cli/">Changelog (CLI App)</a></li>
|
||
<li><a href="https://joplinapp.org/changelog_server/">Changelog (Server)</a></li>
|
||
<li><a href="https://joplinapp.org/stats/">Stats</a></li>
|
||
<li><a href="https://joplinapp.org/donate/">Donate</a></li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
|
||
<div class="main">
|
||
<p><a href="https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=E8JMYD2LQ8MMA&lc=GB&item_name=Joplin+Development&currency_code=EUR&bn=PP%2dDonationsBF%3abtn_donateCC_LG%2egif%3aNonHosted"><img src="https://joplinapp.org/images/badges/Donate-PayPal-green.svg" alt="Donate using PayPal"></a> <a href="https://github.com/sponsors/laurent22/"><img src="https://joplinapp.org/images/badges/GitHub-Badge.svg" alt="Sponsor on GitHub"></a> <a href="https://www.patreon.com/joplin"><img src="https://joplinapp.org/images/badges/Patreon-Badge.svg" alt="Become a patron"></a> <a href="https://joplinapp.org/donate/#donations"><img src="https://joplinapp.org/images/badges/Donate-IBAN.svg" alt="Donate using IBAN"></a></p>
|
||
<hr>
|
||
<h1>Search Engine<a name="search-engine" href="#search-engine" class="heading-anchor">🔗</a></h1>
|
||
<p>The Search Engine powers the Search input in the note list and the Goto Anything dialog.</p>
|
||
<h2>Search algorithm<a name="search-algorithm" href="#search-algorithm" class="heading-anchor">🔗</a></h2>
|
||
<h3>Discretely using only the most critical parameter in sorting<a name="discretely-using-only-the-most-critical-parameter-in-sorting" href="#discretely-using-only-the-most-critical-parameter-in-sorting" class="heading-anchor">🔗</a></h3>
|
||
<p>Sorting occurs as the Search Engine processes results, after searching for and weighting these results.</p>
|
||
<p>Parameters include fuzziness, title matching, weight (based on BM25 and age), the completed status of to-dos, and the note's age.</p>
|
||
<p>The Search Engine uses only the first relevant parameter to determine the order, rather than a weighted average.<br>
|
||
In effect, this means search results with note title matches will appear above all results that only matched the note body,<br>
|
||
regardless of weight or other parameters.</p>
|
||
<h3>Determining weight as a sorting parameter<a name="determining-weight-as-a-sorting-parameter" href="#determining-weight-as-a-sorting-parameter" class="heading-anchor">🔗</a></h3>
|
||
<p>The Search Engine determines the weight parameter using both <a href="https://en.wikipedia.org/wiki/Okapi_BM25">BM25</a><br>
|
||
and the number of days since last user update.</p>
|
||
<h4>BM25<a name="bm25" href="#bm25" class="heading-anchor">🔗</a></h4>
|
||
<p>The Search Engine determines BM25 based on "term frequency-inverse document frequency."<br>
|
||
The "TF–IDF" value increases proportionally to the number of times a word appears in the document<br>
|
||
and is offset by the number of documents in the corpus that contain the word, which helps to adjust<br>
|
||
for the fact that some words appear more frequently in general.</p>
|
||
<p>BM25 returns weight zero for a search term that occurs in more than half the notes.<br>
|
||
So terms that are abundant in all notes to have zero relevance w.r.t. BM25.</p>
|
||
<h4>Days since last user update<a name="days-since-last-user-update" href="#days-since-last-user-update" class="heading-anchor">🔗</a></h4>
|
||
<p>Sorting increases the BM25 weight by the inverse number of days since the note was updated.<br>
|
||
Recent notes will, therefore, be weighted highly in the search results.<br>
|
||
This time-based weight decays logarithmically, becoming less of a factor than BM25 after months have passed.</p>
|
||
|
||
<div class="bottom-links">
|
||
<a href="https://github.com/laurent22/joplin/blob/dev/readme/spec/search_sorting.md">
|
||
<i class="fa fa-github"></i> Improve this doc
|
||
</a>
|
||
</div>
|
||
<script>
|
||
function stickyHeader() {
|
||
return; // Disabled
|
||
|
||
if ($(window).scrollTop() > 179) {
|
||
$('.nav').addClass('sticky');
|
||
} else {
|
||
$('.nav').removeClass('sticky');
|
||
}
|
||
}
|
||
|
||
$(window).scroll(function() {
|
||
stickyHeader();
|
||
});
|
||
|
||
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
||
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
||
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
||
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
|
||
ga('create', 'UA-103586105-1', 'auto');
|
||
ga('send', 'pageview');
|
||
</script>
|
||
|
||
</div></div>
|
||
|
||
<div class="footer">
|
||
Copyright (C) 2016-2021 Laurent Cozic
|
||
</div>
|
||
</body>
|
||
</html>
|