diff --git a/README.md b/README.md index 9bd48f4..e9371c9 100644 --- a/README.md +++ b/README.md @@ -155,7 +155,6 @@ indices, but it uses much less memory and is easier to set up. | Query syntax | [fts5](https://www.sqlite.org/fts5.html) | [query_string](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html#query-string-syntax) | | Fuzzy search | | ✓ | | Media Types tree real-time updating | | ✓ | -| Search in file `path` | [WIP](https://github.com/simon987/sist2/issues/402) | ✓ | | Manual tagging | ✓ | ✓ | | User scripts | ✓ | ✓ | | Media Type breakdown for search results | | ✓ | diff --git a/sist2-vue/src/Sist2SqliteQuery.js b/sist2-vue/src/Sist2SqliteQuery.js index 1c78886..699f71b 100644 --- a/sist2-vue/src/Sist2SqliteQuery.js +++ b/sist2-vue/src/Sist2SqliteQuery.js @@ -106,6 +106,8 @@ class Sist2ElasticsearchQuery { q["sortAsc"] = true; } + q["searchInPath"] = getters.optSearchInPath; + return q; } } diff --git a/sist2-vue/src/views/Configuration.vue b/sist2-vue/src/views/Configuration.vue index 30b6682..8bc59a4 100644 --- a/sist2-vue/src/views/Configuration.vue +++ b/sist2-vue/src/views/Configuration.vue @@ -136,7 +136,7 @@ {{ $t("opt.fuzzy") }} - {{ + {{ $t("opt.searchInPath") }} diff --git a/src/database/database_fts.c b/src/database/database_fts.c index d03dd9d..d475f18 100644 --- a/src/database/database_fts.c +++ b/src/database/database_fts.c @@ -160,7 +160,8 @@ void database_fts_index(database_t *db) { CRASH_IF_NOT_SQLITE_OK(sqlite3_exec( db->db, - "INSERT INTO search(rowid, name, content, title) SELECT id, name, content, title from document_view", + "INSERT INTO search(rowid, name, content, title, path) " + "SELECT id, name, content, title, path from document_view", NULL, NULL, NULL)); } diff --git a/src/database/database_schema.c b/src/database/database_schema.c index dfde651..5f67ac5 100644 --- a/src/database/database_schema.c +++ b/src/database/database_schema.c @@ -75,23 +75,25 @@ const char *FtsDatabaseSchema = " WHERE id = OLD.id;" " END;" "" - "CREATE VIEW IF NOT EXISTS document_view (id, name, content, title)" + "CREATE VIEW IF NOT EXISTS document_view (id, name, content, title, path)" " AS" " SELECT id," " json_data->>'name'," " json_data->>'content'," - " json_data->>'title'" + " json_data->>'title'," + " json_data->>'path'" " FROM document_index;" "" "CREATE VIRTUAL TABLE IF NOT EXISTS search USING fts5 (" " name," " content," " title," + " path," " content='document_view'," " content_rowid='id'" ");" - // name^8, content^3, title^8 - "INSERT INTO search(search, rank) VALUES('rank', 'bm25(8, 3, 8)');" + // name^8, content^3, title^8, path^5 + "INSERT INTO search(search, rank) VALUES('rank', 'bm25(8, 3, 8, 5)');" ""; const char *IpcDatabaseSchema = diff --git a/src/sist.h b/src/sist.h index ee112f4..8bb2162 100644 --- a/src/sist.h +++ b/src/sist.h @@ -51,11 +51,11 @@ #include #include "git_hash.h" -#define VERSION "3.3.6" +#define VERSION "3.4.0" static const char *const Version = VERSION; static const int VersionMajor = 3; -static const int VersionMinor = 3; -static const int VersionPatch = 6; +static const int VersionMinor = 4; +static const int VersionPatch = 0; #ifndef SIST_PLATFORM #define SIST_PLATFORM unknown diff --git a/src/web/web_fts.c b/src/web/web_fts.c index 6c9c83d..1c2cd34 100644 --- a/src/web/web_fts.c +++ b/src/web/web_fts.c @@ -179,7 +179,8 @@ fts_search_req_t *get_search_req(struct mg_http_message *hm) { json_value req_query, req_path, req_size_min, req_size_max, req_date_min, req_date_max, req_page_size, req_index_ids, req_mime_types, req_tags, req_sort_asc, req_sort, req_seed, req_after, - req_fetch_aggregations, req_highlight, req_highlight_context_size, req_embedding, req_model; + req_fetch_aggregations, req_highlight, req_highlight_context_size, req_embedding, req_model, + req_search_in_path; if (!cJSON_IsObject(json) || (req_query = get_json_string(json, "query")).invalid || @@ -197,6 +198,7 @@ fts_search_req_t *get_search_req(struct mg_http_message *hm) { (req_index_ids = get_json_number_array(json, "indexIds")).invalid || (req_mime_types = get_json_array(json, "mimeTypes")).invalid || (req_highlight = get_json_bool(json, "highlight")).invalid || + (req_search_in_path = get_json_bool(json, "searchInPath")).invalid || (req_highlight_context_size = get_json_number(json, "highlightContextSize")).invalid || (req_embedding = get_json_number_array(json, "embedding")).invalid || (req_model = get_json_number(json, "model")).invalid || @@ -252,7 +254,6 @@ fts_search_req_t *get_search_req(struct mg_http_message *hm) { fts_search_req_t *req = malloc(sizeof(fts_search_req_t)); req->sort = sort; - req->query = req_query.val ? strdup(req_query.val->valuestring) : NULL; req->path = req_path.val ? strdup(req_path.val->valuestring) : NULL; req->size_min = req_size_min.val ? req_size_min.val->valuedouble : 0; req->size_max = req_size_max.val ? req_size_max.val->valuedouble : 0; @@ -271,6 +272,16 @@ fts_search_req_t *get_search_req(struct mg_http_message *hm) { ? req_highlight_context_size.val->valueint : DEFAULT_HIGHLIGHT_CONTEXT_SIZE; req->model = req_model.val ? req_model.val->valueint : 0; + + if (req_search_in_path.val->valueint == FALSE && req_query.val) { + if (asprintf(&req->query, "- path : %s", req_query.val->valuestring) == -1) { + cJSON_Delete(json); + return NULL; + } + } else { + req->query = req_query.val ? strdup(req_query.val->valuestring) : NULL; + } + req->embedding = req_model.val ? get_float_buffer(req_embedding.val, &req->embedding_size) : NULL;