-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSearchIndex.cs
82 lines (76 loc) · 4.07 KB
/
SearchIndex.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
using System;
using System.Collections.Generic;
using Statiq.Common;
using Statiq.Core;
using Statiq.Lunr;
namespace Statiq.Web.Pipelines
{
public class SearchIndex : Pipeline
{
public SearchIndex()
{
Dependencies.AddRange(nameof(Content));
PostProcessModules = new ModuleList
{
new ExecuteIf(Config.FromSetting("GenerateCustomSearchIndex", false))
{
new ReplaceDocuments(nameof(Content)),
new FilterDocuments(Config.FromDocument(WebKeys.ShouldOutput, true)),
new FilterDocuments("Excerpt"),
new ExecuteConfig(Config.FromContext(ctx =>
{
// Figure out additional search and result fields
Dictionary<string, FieldType> additionalFields = new Dictionary<string, FieldType>(GenerateLunrIndex.DefaultFields, StringComparer.OrdinalIgnoreCase);
additionalFields["tags"] = FieldType.Searchable;
IReadOnlyList<string> additionalSearchableFields = ctx.GetList<string>(WebKeys.AdditionalSearchableFields);
if (additionalSearchableFields is object)
{
foreach (string additionalSearchableField in additionalSearchableFields)
{
additionalFields[additionalSearchableField] = additionalFields.ContainsKey(additionalSearchableField)
? additionalFields[additionalSearchableField] | FieldType.Searchable
: FieldType.Searchable;
}
}
IReadOnlyList<string> additionalSearchResultFields = ctx.GetList<string>(WebKeys.AdditionalSearchResultFields);
if (additionalSearchResultFields is object)
{
foreach (string additionalSearchResultField in additionalSearchResultFields)
{
additionalFields[additionalSearchResultField] = additionalFields.ContainsKey(additionalSearchResultField)
? additionalFields[additionalSearchResultField] | FieldType.Result
: FieldType.Result;
}
}
// Create the module
GenerateLunrIndex generateLunrIndex = new GenerateLunrIndex()
.WithScriptPath(ctx.GetPath(WebKeys.SearchScriptPath))
.ZipIndexFile(ctx.GetBool(WebKeys.ZipSearchIndexFile, true))
.ZipResultsFile(ctx.GetBool(WebKeys.ZipSearchResultsFile, true))
.IncludeHostInLinks(ctx.GetBool(WebKeys.SearchIncludeHost))
.AllowPositionMetadata(ctx.GetBool(WebKeys.SearchAllowPositionMetadata))
.WithoutAnyFields()
.WithFields(additionalFields)
.WithStemming(ctx.GetBool(WebKeys.SearchStemming));
// Set manual stop words
IReadOnlyList<string> stopWords = ctx.GetList<string>(WebKeys.SearchStopWords);
NormalizedPath stopWordsFilePath = ctx.GetPath(WebKeys.SearchStopWordsFilePath);
if (stopWords is object)
{
generateLunrIndex.WithStopWords(Config.FromValue((IEnumerable<string>)stopWords));
}
else if (!stopWordsFilePath.IsNullOrEmpty)
{
generateLunrIndex.WithStopWordsFromFile(stopWordsFilePath);
}
return generateLunrIndex;
}))
}
};
OutputModules = new ModuleList
{
new WriteFiles()
};
}
}
}