1
0
Fork 0
mirror of https://github.com/documize/community.git synced 2025-08-02 20:15:26 +02:00

Install helps docs as part of onboarding process

Our own docs are installed as sample data!

Refactored search reindexing code.
This commit is contained in:
HarveyKandola 2019-06-24 17:01:56 +01:00
parent 411f64c359
commit 3621e2fb79
26 changed files with 1957 additions and 1280 deletions

71
domain/search/endpoint.go Normal file
View file

@ -0,0 +1,71 @@
// Copyright 2016 Documize Inc. <legal@documize.com>. All rights reserved.
//
// This software (Documize Community Edition) is licensed under
// GNU AGPL v3 http://www.gnu.org/licenses/agpl-3.0.en.html
//
// You can operate outside the AGPL restrictions by purchasing
// Documize Enterprise Edition and obtaining a commercial license
// by contacting <sales@documize.com>.
//
// https://documize.com
package search
import (
"fmt"
"net/http"
"github.com/documize/community/core/env"
"github.com/documize/community/core/response"
"github.com/documize/community/domain"
"github.com/documize/community/domain/store"
)
// Handler contains the runtime information such as logging and database.
type Handler struct {
Runtime *env.Runtime
Store *store.Store
Indexer Indexer
}
// Reindex indexes all documents and attachments.
func (h *Handler) Reindex(w http.ResponseWriter, r *http.Request) {
ctx := domain.GetRequestContext(r)
if !ctx.GlobalAdmin {
response.WriteForbiddenError(w)
h.Runtime.Log.Info(fmt.Sprintf("%s attempted search reindex", ctx.UserID))
return
}
go h.Indexer.Rebuild(ctx)
response.WriteEmpty(w)
}
// Status returns state of search index
func (h *Handler) Status(w http.ResponseWriter, r *http.Request) {
method := "meta.SearchStatus"
ctx := domain.GetRequestContext(r)
if !ctx.GlobalAdmin {
response.WriteForbiddenError(w)
h.Runtime.Log.Info(fmt.Sprintf("%s attempted get of search status", ctx.UserID))
return
}
count, err := h.Store.Meta.SearchIndexCount(ctx)
if err != nil {
response.WriteServerError(w, method, err)
h.Runtime.Log.Error(method, err)
return
}
var ss = searchStatus{Entries: count}
response.WriteJSON(w, ss)
}
type searchStatus struct {
Entries int `json:"entries"`
}

View file

@ -13,6 +13,7 @@ package search
import (
"database/sql"
"fmt"
"github.com/documize/community/domain"
"github.com/documize/community/model/attachment"
@ -118,6 +119,53 @@ func (m *Indexer) DeleteContent(ctx domain.RequestContext, pageID string) {
m.runtime.Commit(ctx.Transaction)
}
// Rebuild recreates all search indexes.
func (m *Indexer) Rebuild(ctx domain.RequestContext) {
method := "search.rebuildSearchIndex"
docs, err := m.store.Meta.Documents(ctx)
if err != nil {
m.runtime.Log.Error(method, err)
return
}
m.runtime.Log.Info(fmt.Sprintf("Search re-index started for %d documents", len(docs)))
for i := range docs {
d := docs[i]
dc, err := m.store.Meta.Document(ctx, d)
if err != nil {
m.runtime.Log.Error(method, err)
// continue
}
at, err := m.store.Meta.Attachments(ctx, d)
if err != nil {
m.runtime.Log.Error(method, err)
// continue
}
m.IndexDocument(ctx, dc, at)
pages, err := m.store.Meta.Pages(ctx, d)
if err != nil {
m.runtime.Log.Error(method, err)
// continue
}
for j := range pages {
m.IndexContent(ctx, pages[j])
}
// Log process every N documents.
if i%100 == 0 {
m.runtime.Log.Info(fmt.Sprintf("Search re-indexed %d documents...", i))
}
}
m.runtime.Log.Info(fmt.Sprintf("Search re-index finished for %d documents", len(docs)))
}
// FilterCategoryProtected removes search results that cannot be seen by user
// due to document cateogory viewing permissions.
func FilterCategoryProtected(results []sm.QueryResult, cats []category.Category, members []category.Member) (filtered []sm.QueryResult) {