Add explanation for search_index file
This commit is contained in:
@@ -287,17 +287,17 @@ section {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.highlight_green {
|
.highlight_green {
|
||||||
background-color: rgba(0, 255, 0, 0.05);
|
background-color: rgba(0, 255, 0, 0.1);
|
||||||
border-color: #00D000;
|
border-color: #00D000;
|
||||||
}
|
}
|
||||||
|
|
||||||
.highlight_blue {
|
.highlight_blue {
|
||||||
background-color: rgba(32, 32, 255, 0.2);
|
background-color: rgba(0, 0, 255, 0.1);
|
||||||
border-color: #3636FF;
|
border-color: #3636FF;
|
||||||
}
|
}
|
||||||
|
|
||||||
.highlight_yellow {
|
.highlight_yellow {
|
||||||
background-color: rgba(255, 255, 0, 0.05);
|
background-color: rgba(255, 255, 0, 0.1);
|
||||||
border-color: #A0A000;
|
border-color: #A0A000;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -69,8 +69,9 @@ let sort = (field) => {
|
|||||||
<tbody>
|
<tbody>
|
||||||
{#each peers as peer (peer.address)}
|
{#each peers as peer (peer.address)}
|
||||||
<tr style="border: none;"
|
<tr style="border: none;"
|
||||||
class:highlight_red={peer.free_space < peer.min_free_space / 2 || !peer.reachable}
|
class:highlight_red={!peer.reachable}
|
||||||
class:highlight_yellow={peer.free_space < peer.min_free_space}
|
class:highlight_yellow={peer.free_space < peer.min_free_space / 2}
|
||||||
|
class:highlight_blue={peer.free_space < peer.min_free_space}
|
||||||
class:highlight_green={peer.reachable}
|
class:highlight_green={peer.reachable}
|
||||||
animate:flip={{duration: 1000}}
|
animate:flip={{duration: 1000}}
|
||||||
>
|
>
|
||||||
|
@@ -60,6 +60,10 @@ const update_base = async base => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const close_socket = () => {
|
const close_socket = () => {
|
||||||
|
// Clear this path so the update_base function does not instantly return
|
||||||
|
// with the next retry
|
||||||
|
connected_to = ""
|
||||||
|
|
||||||
if (socket !== null) {
|
if (socket !== null) {
|
||||||
// Disable the error handler so it doesn't start retrying the connection
|
// Disable the error handler so it doesn't start retrying the connection
|
||||||
socket.onerror = null
|
socket.onerror = null
|
||||||
|
@@ -41,7 +41,7 @@ onMount(() => {
|
|||||||
|
|
||||||
<FileTitle title={state.base.name}/>
|
<FileTitle title={state.base.name}/>
|
||||||
|
|
||||||
<TextBlock>
|
<TextBlock width="1000px">
|
||||||
<audio
|
<audio
|
||||||
bind:this={player}
|
bind:this={player}
|
||||||
class="player"
|
class="player"
|
||||||
|
@@ -2,6 +2,7 @@
|
|||||||
import { createEventDispatcher } from "svelte";
|
import { createEventDispatcher } from "svelte";
|
||||||
import IconBlock from "../../file_viewer/viewers/IconBlock.svelte";
|
import IconBlock from "../../file_viewer/viewers/IconBlock.svelte";
|
||||||
import { fs_thumbnail_url } from "../FilesystemUtil";
|
import { fs_thumbnail_url } from "../FilesystemUtil";
|
||||||
|
import TextBlock from "../../file_viewer/viewers/TextBlock.svelte";
|
||||||
let dispatch = createEventDispatcher()
|
let dispatch = createEventDispatcher()
|
||||||
|
|
||||||
export let state
|
export let state
|
||||||
@@ -21,6 +22,50 @@ export let state
|
|||||||
</button>
|
</button>
|
||||||
</IconBlock>
|
</IconBlock>
|
||||||
|
|
||||||
|
{#if state.base.path === "/me/.search_index.gz"}
|
||||||
|
<TextBlock>
|
||||||
|
<p>
|
||||||
|
Congratulations! You have found the search index. One of the
|
||||||
|
filesystem's dirty little secrets.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
I needed a place to store an index of each user's files so I could
|
||||||
|
make them searchable. Now, there are search databases like
|
||||||
|
ElasticSearch and such, but that's a lot of work to set up and
|
||||||
|
maintain.. Instead I opted to simply put the full path of every file
|
||||||
|
in your filesystem in a text file. That's what you're looking at
|
||||||
|
here. That can add up to a lot of data, but since the paths usually
|
||||||
|
have a lot of repetitive elements it compresses incredibly well.
|
||||||
|
You'd be hard-pressed to grow this index over even 1 MB. Honestly,
|
||||||
|
this search system is incredibly efficient, I'd be surprised if
|
||||||
|
EleasticSearch could even match it.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
This file is updated 10 minutes after the last time you modify a
|
||||||
|
file on your filesystem. So if you're constantly uploading and
|
||||||
|
deleting files your search index might never update and you will be
|
||||||
|
left with stale search results.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
If you delete this file then search will stop working until the file
|
||||||
|
is regenerated 10 minutes later. If you replace this file with a
|
||||||
|
different file then that file will be overwritten 10 minutes later.
|
||||||
|
And if you replace this file with a directory with the same name
|
||||||
|
then search will stop working completely until you delete the
|
||||||
|
directory (yes, I tested this case).
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Each time you type a search term in the search dialog this file gets
|
||||||
|
decompressed and searched on the fly. There is no trickery here, the
|
||||||
|
file simply gets read line by line. Modern CPUs are incredibly good
|
||||||
|
at searching for text. I benchmarked it once, I don't remember the
|
||||||
|
exact numbers but it was somewhere along the lines of one gigabyte
|
||||||
|
of text per second. Fast enough to be unnoticeable even if you have
|
||||||
|
millions of files in your filesystem.
|
||||||
|
</p>
|
||||||
|
</TextBlock>
|
||||||
|
{/if}
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
h1 {
|
h1 {
|
||||||
text-shadow: 1px 1px 3px var(--shadow_color);
|
text-shadow: 1px 1px 3px var(--shadow_color);
|
||||||
|
@@ -37,8 +37,11 @@ onMount(() => {
|
|||||||
{:else if patreon_result === "error"}
|
{:else if patreon_result === "error"}
|
||||||
<div class="highlight_red">
|
<div class="highlight_red">
|
||||||
<p>
|
<p>
|
||||||
An error occurred while linking Patreon subscription. Please try
|
An error occurred while linking Patreon subscription. Check if
|
||||||
again later.
|
there are any Pixeldrain integrations under "Logged in with
|
||||||
|
Patreon" on this page: <a
|
||||||
|
href="https://www.patreon.com/settings/apps">https://www.patreon.com/settings/apps</a>.
|
||||||
|
Try disconnecting all Pixeldrain logins and try again.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
If it has been more than 30 minutes, your payment is complete and
|
If it has been more than 30 minutes, your payment is complete and
|
||||||
|
Reference in New Issue
Block a user