mirror of
https://github.com/simon987/sist2.git
synced 2025-12-15 08:19:06 +00:00
Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d221e08d67 | ||
|
|
bcab40783c | ||
|
|
ea23bf01e3 | ||
|
|
f5d070496f |
@@ -224,6 +224,6 @@ docker run --rm --entrypoint cat my-sist2-image /root/sist2 > sist2-x64-linux
|
|||||||
git clone --recursive https://github.com/sist2app/sist2/
|
git clone --recursive https://github.com/sist2app/sist2/
|
||||||
(cd sist2-vue; npm install; npm run build)
|
(cd sist2-vue; npm install; npm run build)
|
||||||
(cd sist2-admin/frontend; npm install; npm run build)
|
(cd sist2-admin/frontend; npm install; npm run build)
|
||||||
cmake -DSIST_DEBUG=off -DCMAKE_TOOLCHAIN_FILE=<VCPKG_ROOT>/scripts/buildsystems/vcpkg.cmake .
|
cmake -DSIST_DEBUG=off -G "Unix Makefiles" -DCMAKE_TOOLCHAIN_FILE=<VCPKG_ROOT>/scripts/buildsystems/vcpkg.cmake .
|
||||||
make
|
make
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -93,7 +93,9 @@ export default {
|
|||||||
threads: "Number of threads",
|
threads: "Number of threads",
|
||||||
batchSize: "Index batch size",
|
batchSize: "Index batch size",
|
||||||
script: "User script",
|
script: "User script",
|
||||||
searchIndex: "Search index file location"
|
searchIndex: "Search index file location",
|
||||||
|
esMappings: "Elasticsearch mappings file override",
|
||||||
|
esSettings: "Elasticsearch settings file override"
|
||||||
},
|
},
|
||||||
scanOptions: {
|
scanOptions: {
|
||||||
title: "Scanning options",
|
title: "Scanning options",
|
||||||
|
|||||||
@@ -44,6 +44,12 @@
|
|||||||
|
|
||||||
<label>{{ $t("backendOptions.batchSize") }}</label>
|
<label>{{ $t("backendOptions.batchSize") }}</label>
|
||||||
<b-form-input v-model="backend.batch_size" type="number" min="1" @change="update()"></b-form-input>
|
<b-form-input v-model="backend.batch_size" type="number" min="1" @change="update()"></b-form-input>
|
||||||
|
|
||||||
|
<label>{{ $t("backendOptions.esMappings") }}</label>
|
||||||
|
<b-form-textarea v-model="backend.es_mappings" rows="4" @change="update()"></b-form-textarea>
|
||||||
|
|
||||||
|
<label>{{ $t("backendOptions.esSettings") }}</label>
|
||||||
|
<b-form-textarea v-model="backend.es_settings" rows="4" @change="update()"></b-form-textarea>
|
||||||
</template>
|
</template>
|
||||||
<template v-else>
|
<template v-else>
|
||||||
<label>{{ $t("backendOptions.searchIndex") }}</label>
|
<label>{{ $t("backendOptions.searchIndex") }}</label>
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ from logging import FileHandler, StreamHandler
|
|||||||
from subprocess import Popen, PIPE
|
from subprocess import Popen, PIPE
|
||||||
from tempfile import NamedTemporaryFile
|
from tempfile import NamedTemporaryFile
|
||||||
from threading import Thread
|
from threading import Thread
|
||||||
from typing import List
|
from typing import List, Optional
|
||||||
|
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
|
|
||||||
@@ -40,6 +40,8 @@ class Sist2SearchBackend(BaseModel):
|
|||||||
|
|
||||||
es_url: str = "http://elasticsearch:9200"
|
es_url: str = "http://elasticsearch:9200"
|
||||||
es_insecure_ssl: bool = False
|
es_insecure_ssl: bool = False
|
||||||
|
es_mappings: Optional[str] = None
|
||||||
|
es_settings: Optional[str] = None
|
||||||
es_index: str = "sist2"
|
es_index: str = "sist2"
|
||||||
threads: int = 1
|
threads: int = 1
|
||||||
batch_size: int = 70
|
batch_size: int = 70
|
||||||
@@ -57,6 +59,8 @@ class IndexOptions(BaseModel):
|
|||||||
path: str = None
|
path: str = None
|
||||||
incremental_index: bool = True
|
incremental_index: bool = True
|
||||||
search_backend: str = None
|
search_backend: str = None
|
||||||
|
es_mappings_file: Optional[str] = None
|
||||||
|
es_settings_file: Optional[str] = None
|
||||||
|
|
||||||
def __init__(self, **kwargs):
|
def __init__(self, **kwargs):
|
||||||
super().__init__(**kwargs)
|
super().__init__(**kwargs)
|
||||||
@@ -75,6 +79,12 @@ class IndexOptions(BaseModel):
|
|||||||
|
|
||||||
if search_backend.es_insecure_ssl:
|
if search_backend.es_insecure_ssl:
|
||||||
args.append(f"--es-insecure-ssl")
|
args.append(f"--es-insecure-ssl")
|
||||||
|
|
||||||
|
if self.es_mappings_file:
|
||||||
|
args.append(f"--mappings-file={self.es_mappings_file}")
|
||||||
|
if self.es_settings_file:
|
||||||
|
args.append(f"--settings-file={self.es_settings_file}")
|
||||||
|
|
||||||
if self.incremental_index:
|
if self.incremental_index:
|
||||||
args.append(f"--incremental-index")
|
args.append(f"--incremental-index")
|
||||||
|
|
||||||
@@ -249,6 +259,20 @@ class Sist2:
|
|||||||
|
|
||||||
def index(self, options: IndexOptions, search_backend: Sist2SearchBackend, logs_cb, set_pid_cb):
|
def index(self, options: IndexOptions, search_backend: Sist2SearchBackend, logs_cb, set_pid_cb):
|
||||||
|
|
||||||
|
if search_backend.es_mappings:
|
||||||
|
with NamedTemporaryFile("w", prefix="sist2-admin", suffix=".txt", delete=False) as f:
|
||||||
|
f.write(search_backend.es_mappings)
|
||||||
|
options.es_mappings_file = f.name
|
||||||
|
else:
|
||||||
|
options.es_mappings_file = None
|
||||||
|
|
||||||
|
if search_backend.es_settings:
|
||||||
|
with NamedTemporaryFile("w", prefix="sist2-admin", suffix=".txt", delete=False) as f:
|
||||||
|
f.write(search_backend.es_settings)
|
||||||
|
options.es_settings_file = f.name
|
||||||
|
else:
|
||||||
|
options.es_settings_file = None
|
||||||
|
|
||||||
args = [
|
args = [
|
||||||
self.bin_path,
|
self.bin_path,
|
||||||
*options.args(search_backend),
|
*options.args(search_backend),
|
||||||
|
|||||||
@@ -69,7 +69,8 @@ class Sist2Api {
|
|||||||
hit._props.isImage = true;
|
hit._props.isImage = true;
|
||||||
}
|
}
|
||||||
if ("width" in hit._source && !hit._props.isSubDocument && hit._source.videoc !== "tiff"
|
if ("width" in hit._source && !hit._props.isSubDocument && hit._source.videoc !== "tiff"
|
||||||
&& hit._source.videoc !== "raw" && hit._source.videoc !== "ppm") {
|
&& hit._source.videoc !== "raw" && hit._source.videoc !== "ppm"
|
||||||
|
&& hit._source.mime !== "image/jp2") {
|
||||||
hit._props.isPlayableImage = true;
|
hit._props.isPlayableImage = true;
|
||||||
}
|
}
|
||||||
if ("width" in hit._source && "height" in hit._source) {
|
if ("width" in hit._source && "height" in hit._source) {
|
||||||
|
|||||||
@@ -238,7 +238,7 @@ class Sist2ElasticsearchQuery {
|
|||||||
pre_tags: ["<mark>"],
|
pre_tags: ["<mark>"],
|
||||||
post_tags: ["</mark>"],
|
post_tags: ["</mark>"],
|
||||||
fragment_size: getters.optFragmentSize,
|
fragment_size: getters.optFragmentSize,
|
||||||
number_of_fragments: 1,
|
number_of_fragments: getters.optFragmentCount,
|
||||||
order: "score",
|
order: "score",
|
||||||
fields: {
|
fields: {
|
||||||
content: {},
|
content: {},
|
||||||
|
|||||||
@@ -3,6 +3,8 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
const FRAGMENT_SEPARATOR = "<br /><i style='line-height: 2.4'>[…]</i><br/>";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "ContentDiv",
|
name: "ContentDiv",
|
||||||
props: ["doc"],
|
props: ["doc"],
|
||||||
@@ -13,10 +15,10 @@ export default {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (this.doc.highlight["content.nGram"]) {
|
if (this.doc.highlight["content.nGram"]) {
|
||||||
return this.doc.highlight["content.nGram"][0];
|
return this.doc.highlight["content.nGram"].join(FRAGMENT_SEPARATOR);
|
||||||
}
|
}
|
||||||
if (this.doc.highlight.content) {
|
if (this.doc.highlight.content) {
|
||||||
return this.doc.highlight.content[0];
|
return this.doc.highlight.content.join(FRAGMENT_SEPARATOR);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -59,6 +59,7 @@ export default {
|
|||||||
searchInPath: "Enable matching query against document path",
|
searchInPath: "Enable matching query against document path",
|
||||||
suggestPath: "Enable auto-complete in path filter bar",
|
suggestPath: "Enable auto-complete in path filter bar",
|
||||||
fragmentSize: "Highlight context size",
|
fragmentSize: "Highlight context size",
|
||||||
|
fragmentCount: "Number of highlight snippets",
|
||||||
queryMode: "Search mode",
|
queryMode: "Search mode",
|
||||||
displayMode: "Display",
|
displayMode: "Display",
|
||||||
columns: "Column count",
|
columns: "Column count",
|
||||||
@@ -242,6 +243,7 @@ export default {
|
|||||||
searchInPath: "Abgleich der Abfrage mit dem Dokumentpfad aktivieren",
|
searchInPath: "Abgleich der Abfrage mit dem Dokumentpfad aktivieren",
|
||||||
suggestPath: "Aktiviere Auto-Vervollständigung in Pfadfilter-Leiste",
|
suggestPath: "Aktiviere Auto-Vervollständigung in Pfadfilter-Leiste",
|
||||||
fragmentSize: "Kontextgröße",
|
fragmentSize: "Kontextgröße",
|
||||||
|
fragmentCount: "Anzahl der hervorgehobenen Snippets",
|
||||||
queryMode: "Such-Modus",
|
queryMode: "Such-Modus",
|
||||||
displayMode: "Ansicht",
|
displayMode: "Ansicht",
|
||||||
columns: "Anzahl Spalten",
|
columns: "Anzahl Spalten",
|
||||||
@@ -417,6 +419,7 @@ export default {
|
|||||||
searchInPath: "Activer la recherche dans le chemin des documents",
|
searchInPath: "Activer la recherche dans le chemin des documents",
|
||||||
suggestPath: "Activer l'autocomplétion dans la barre de filtre de chemin",
|
suggestPath: "Activer l'autocomplétion dans la barre de filtre de chemin",
|
||||||
fragmentSize: "Longueur du contexte de surlignage",
|
fragmentSize: "Longueur du contexte de surlignage",
|
||||||
|
fragmentCount: "Nombre d'extraits surlignés",
|
||||||
queryMode: "Mode de recherche",
|
queryMode: "Mode de recherche",
|
||||||
displayMode: "Affichage",
|
displayMode: "Affichage",
|
||||||
columns: "Nombre de colonnes",
|
columns: "Nombre de colonnes",
|
||||||
@@ -592,6 +595,7 @@ export default {
|
|||||||
searchInPath: "匹配文档路径",
|
searchInPath: "匹配文档路径",
|
||||||
suggestPath: "搜索框启用自动补全",
|
suggestPath: "搜索框启用自动补全",
|
||||||
fragmentSize: "高亮上下文大小",
|
fragmentSize: "高亮上下文大小",
|
||||||
|
fragmentCount: "突出显示的项目数",
|
||||||
queryMode: "搜索模式",
|
queryMode: "搜索模式",
|
||||||
displayMode: "显示",
|
displayMode: "显示",
|
||||||
columns: "列数",
|
columns: "列数",
|
||||||
@@ -767,6 +771,7 @@ export default {
|
|||||||
searchInPath: "Włącz szukanie również w ścieżce dokumentu",
|
searchInPath: "Włącz szukanie również w ścieżce dokumentu",
|
||||||
suggestPath: "Włącz auto-uzupełnianie w filtrze ścieżek",
|
suggestPath: "Włącz auto-uzupełnianie w filtrze ścieżek",
|
||||||
fragmentSize: "Podświetl wielkość kontekstu w znakach",
|
fragmentSize: "Podświetl wielkość kontekstu w znakach",
|
||||||
|
fragmentCount: "Liczba wyróżnionych fragmentów",
|
||||||
queryMode: "Tryb szukania",
|
queryMode: "Tryb szukania",
|
||||||
displayMode: "Wyświetlanie",
|
displayMode: "Wyświetlanie",
|
||||||
columns: "Liczba kolumn",
|
columns: "Liczba kolumn",
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import Vuex from "vuex"
|
|||||||
import {deserializeMimes, randomSeed, serializeMimes} from "@/util";
|
import {deserializeMimes, randomSeed, serializeMimes} from "@/util";
|
||||||
import {getInstance} from "@/plugins/auth0.js";
|
import {getInstance} from "@/plugins/auth0.js";
|
||||||
|
|
||||||
const CONF_VERSION = 3;
|
const CONF_VERSION = 4;
|
||||||
|
|
||||||
Vue.use(Vuex);
|
Vue.use(Vuex);
|
||||||
|
|
||||||
@@ -41,6 +41,7 @@ export default new Vuex.Store({
|
|||||||
optTagOrOperator: false,
|
optTagOrOperator: false,
|
||||||
optFuzzy: true,
|
optFuzzy: true,
|
||||||
optFragmentSize: 200,
|
optFragmentSize: 200,
|
||||||
|
optFragmentCount: 1,
|
||||||
optQueryMode: "simple",
|
optQueryMode: "simple",
|
||||||
optSearchInPath: false,
|
optSearchInPath: false,
|
||||||
optColumns: "auto",
|
optColumns: "auto",
|
||||||
@@ -170,6 +171,7 @@ export default new Vuex.Store({
|
|||||||
setOptSearchInPath: (state, val) => state.optSearchInPath = val,
|
setOptSearchInPath: (state, val) => state.optSearchInPath = val,
|
||||||
setOptSuggestPath: (state, val) => state.optSuggestPath = val,
|
setOptSuggestPath: (state, val) => state.optSuggestPath = val,
|
||||||
setOptFragmentSize: (state, val) => state.optFragmentSize = val,
|
setOptFragmentSize: (state, val) => state.optFragmentSize = val,
|
||||||
|
setOptFragmentCount: (state, val) => state.optFragmentCount = val,
|
||||||
setOptQueryMode: (state, val) => state.optQueryMode = val,
|
setOptQueryMode: (state, val) => state.optQueryMode = val,
|
||||||
setOptResultSize: (state, val) => state.optSize = val,
|
setOptResultSize: (state, val) => state.optSize = val,
|
||||||
setOptTagOrOperator: (state, val) => state.optTagOrOperator = val,
|
setOptTagOrOperator: (state, val) => state.optTagOrOperator = val,
|
||||||
@@ -430,6 +432,7 @@ export default new Vuex.Store({
|
|||||||
optSearchInPath: state => state.optSearchInPath,
|
optSearchInPath: state => state.optSearchInPath,
|
||||||
optSuggestPath: state => state.optSuggestPath,
|
optSuggestPath: state => state.optSuggestPath,
|
||||||
optFragmentSize: state => state.optFragmentSize,
|
optFragmentSize: state => state.optFragmentSize,
|
||||||
|
optFragmentCount: state => state.optFragmentCount,
|
||||||
optQueryMode: state => state.optQueryMode,
|
optQueryMode: state => state.optQueryMode,
|
||||||
optTreemapType: state => state.optTreemapType,
|
optTreemapType: state => state.optTreemapType,
|
||||||
optTreemapTiling: state => state.optTreemapTiling,
|
optTreemapTiling: state => state.optTreemapTiling,
|
||||||
|
|||||||
@@ -151,6 +151,10 @@
|
|||||||
<b-form-input :value="optFragmentSize" step="10" type="number" min="0"
|
<b-form-input :value="optFragmentSize" step="10" type="number" min="0"
|
||||||
@input="setOptFragmentSize"></b-form-input>
|
@input="setOptFragmentSize"></b-form-input>
|
||||||
|
|
||||||
|
<label :class="{'text-muted': uiSqliteMode}">{{ $t("opt.fragmentCount") }}</label>
|
||||||
|
<b-form-input :value="optFragmentCount" :disabled="uiSqliteMode" step="1" type="number" min="1"
|
||||||
|
@input="setOptFragmentCount"></b-form-input>
|
||||||
|
|
||||||
<label>{{ $t("opt.resultSize") }}</label>
|
<label>{{ $t("opt.resultSize") }}</label>
|
||||||
<b-form-input :value="optResultSize" type="number" min="10"
|
<b-form-input :value="optResultSize" type="number" min="10"
|
||||||
@input="setOptResultSize"></b-form-input>
|
@input="setOptResultSize"></b-form-input>
|
||||||
@@ -314,6 +318,7 @@ export default {
|
|||||||
"optSearchInPath",
|
"optSearchInPath",
|
||||||
"optSuggestPath",
|
"optSuggestPath",
|
||||||
"optFragmentSize",
|
"optFragmentSize",
|
||||||
|
"optFragmentCount",
|
||||||
"optQueryMode",
|
"optQueryMode",
|
||||||
"optTreemapType",
|
"optTreemapType",
|
||||||
"optTreemapTiling",
|
"optTreemapTiling",
|
||||||
@@ -360,6 +365,7 @@ export default {
|
|||||||
"setOptSearchInPath",
|
"setOptSearchInPath",
|
||||||
"setOptSuggestPath",
|
"setOptSuggestPath",
|
||||||
"setOptFragmentSize",
|
"setOptFragmentSize",
|
||||||
|
"setOptFragmentCount",
|
||||||
"setOptQueryMode",
|
"setOptQueryMode",
|
||||||
"setOptTreemapType",
|
"setOptTreemapType",
|
||||||
"setOptTreemapTiling",
|
"setOptTreemapTiling",
|
||||||
|
|||||||
@@ -51,11 +51,11 @@
|
|||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include "git_hash.h"
|
#include "git_hash.h"
|
||||||
|
|
||||||
#define VERSION "3.4.5"
|
#define VERSION "3.4.7"
|
||||||
static const char *const Version = VERSION;
|
static const char *const Version = VERSION;
|
||||||
static const int VersionMajor = 3;
|
static const int VersionMajor = 3;
|
||||||
static const int VersionMinor = 4;
|
static const int VersionMinor = 4;
|
||||||
static const int VersionPatch = 5;
|
static const int VersionPatch = 7;
|
||||||
|
|
||||||
#ifndef SIST_PLATFORM
|
#ifndef SIST_PLATFORM
|
||||||
#define SIST_PLATFORM unknown
|
#define SIST_PLATFORM unknown
|
||||||
|
|||||||
Reference in New Issue
Block a user