Compare commits

..

4 Commits
3.4.5 ... 3.4.7

Author SHA1 Message Date
Shy
d221e08d67 Fix #534, version bump 2025-07-05 09:56:50 -04:00
Shy
bcab40783c Version bump 2025-07-05 08:51:28 -04:00
Shy
ea23bf01e3 Fixes #536 2025-07-05 08:51:15 -04:00
Shy
f5d070496f Closes #535 2025-07-05 08:17:32 -04:00
11 changed files with 59 additions and 10 deletions

View File

@@ -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
``` ```

View File

@@ -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",

View File

@@ -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>

View File

@@ -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),

View File

@@ -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) {

View File

@@ -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: {},

View File

@@ -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);
} }
} }
} }

View File

@@ -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",

View File

@@ -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,

View File

@@ -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",

View File

@@ -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