bugfixes more search results and dump restore options

This commit is contained in:
ston1th 2016-11-17 21:21:16 +01:00
commit 3cd460318a
124 changed files with 3915 additions and 9579 deletions

107
engine.go
View file

@ -4,15 +4,17 @@ import (
"errors"
"html/template"
"regexp"
"sort"
"strings"
"time"
"github.com/blevesearch/bleve"
"github.com/blevesearch/bleve/document"
)
const timeFmt = "2006-01-02 15:04:05"
const (
timeFmt = "2006-01-02 15:04:05"
maxAllResult = 1000000
maxSearchResult = 101
)
var titleRe = regexp.MustCompile("[^a-zA-Z0-9+ ]+")
@ -44,12 +46,21 @@ func (e *Engine) Close() error {
return e.index.Close()
}
func (e *Engine) Restore(dumpArt DumpArticle) error {
art := render(dumpArt.MD)
art.Title = dumpArt.Title
art.Created = dumpArt.Created
art.Updated = dumpArt.Updated
art.Public = dumpArt.Public
return e.index.Index(dumpArt.LinkTitle, art)
}
func (e *Engine) Index(title, text, user string, public bool) (string, error) {
if user == "" {
return "", errors.New("engine: user cannot be empty")
}
title = titleRe.ReplaceAllString(title, "")
newTitle := strings.Replace(title, " ", "+", -1)
newTitle := makeLinkTitle(title)
if err := e.Exists(false, newTitle); err == nil {
return "", errors.New("engine: article already exists")
}
@ -57,8 +68,8 @@ func (e *Engine) Index(title, text, user string, public bool) (string, error) {
art.Title = title
art.Created = user + " " + now()
art.Public = public
e.index.Index(newTitle, art)
return newTitle, nil
err := e.index.Index(newTitle, art)
return newTitle, err
}
func (e *Engine) Exists(public bool, title string) error {
@ -100,8 +111,7 @@ func (e *Engine) Update(title, text, user string, public bool) error {
art.Text = rend.Text
art.MD = rend.MD
art.Public = public
err = e.index.Index(title, art)
return err
return e.index.Index(title, art)
}
func (e *Engine) Get(public bool, title string) (Article, error) {
@ -111,7 +121,7 @@ func (e *Engine) Get(public bool, title string) (Article, error) {
return art, err
}
if doc == nil || doc.Fields == nil {
return art, errors.New("engine: article does not esist")
return art, errors.New("engine: article '" + title + "' does not esist")
}
for _, field := range doc.Fields {
switch f := field.(type) {
@ -151,34 +161,33 @@ func (e *Engine) Get(public bool, title string) (Article, error) {
func (e *Engine) Search(public bool, search string) (string, error) {
var (
res *bleve.SearchResult
req *bleve.SearchRequest
err error
)
if public {
req := bleve.NewSearchRequest(bleve.NewConjunctionQuery([]bleve.Query{
req = bleve.NewSearchRequest(bleve.NewConjunctionQuery([]bleve.Query{
bleve.NewBoolFieldQuery(true).SetField("public"),
bleve.NewQueryStringQuery("title:" + search + " search:" + search),
}))
req.Highlight = bleve.NewHighlightWithStyle("html")
res, err = e.index.Search(req)
if err != nil {
return "", err
}
} else {
req := bleve.NewSearchRequest(bleve.NewQueryStringQuery("title:" + search + " search:" + search))
req.Highlight = bleve.NewHighlightWithStyle("html")
res, err = e.index.Search(req)
if err != nil {
return "", err
}
req = bleve.NewSearchRequest(bleve.NewQueryStringQuery("title:" + search + " search:" + search))
}
req.Highlight = bleve.NewHighlightWithStyle("html")
req.Size = maxSearchResult
res, err = e.index.Search(req)
if err != nil {
return "", err
}
if res.Total == 0 {
return "<h4>No search results</h4>", nil
} else if res.Total > 100 {
} else if res.Total == maxSearchResult {
return "", errors.New("engine: too many search results")
}
html := ""
for _, hit := range res.Hits {
if hit == nil {
continue
}
art, err := e.Get(false, hit.ID)
if err != nil {
continue
@ -204,29 +213,26 @@ type Title struct {
LinkTitle string
}
type Titles []Title
func (t Titles) Len() int { return len(t) }
func (t Titles) Swap(i, j int) { t[i], t[j] = t[j], t[i] }
func (t Titles) Less(i, j int) bool { return t[i].Title < t[j].Title }
func (e *Engine) GetAll(public bool) (t Titles, err error) {
var res *bleve.SearchResult
func (e *Engine) GetAll(public bool) (t []Title, err error) {
var (
res *bleve.SearchResult
req *bleve.SearchRequest
)
if public {
req := bleve.NewSearchRequest(bleve.NewBoolFieldQuery(true).SetField("public"))
res, err = e.index.Search(req)
if err != nil {
return
}
req = bleve.NewSearchRequest(bleve.NewBoolFieldQuery(true).SetField("public"))
} else {
req := bleve.NewSearchRequest(bleve.NewMatchAllQuery())
res, err = e.index.Search(req)
if err != nil {
return
}
req = bleve.NewSearchRequest(bleve.NewMatchAllQuery())
}
req.Size = maxAllResult
res, err = e.index.Search(req)
if err != nil {
return
}
for _, v := range res.Hits {
if v.ID == "Index" {
if v == nil {
continue
}
if v.ID == indexName {
continue
}
doc, err := e.index.Document(v.ID)
@ -244,6 +250,21 @@ func (e *Engine) GetAll(public bool) (t Titles, err error) {
}
}
}
sort.Sort(t)
return
}
func (e *Engine) Dump() (titles []string, err error) {
req := bleve.NewSearchRequest(bleve.NewMatchAllQuery())
req.Size = maxAllResult
res, err := e.index.Search(req)
if err != nil {
return
}
for _, v := range res.Hits {
if v == nil {
continue
}
titles = append(titles, v.ID)
}
return
}