/
SearchEngine.hs
59 lines (50 loc) · 1.77 KB
/
SearchEngine.hs
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
module Epicbot.Data.Index.SearchEngine
( SearchEngine,
fromCards,
search,
)
where
import Data.Ix (Ix)
import Data.SearchEngine (NoFeatures, SearchConfig (..), SearchRankParameters (..))
import qualified Data.SearchEngine as SE
import Data.Text (Text)
import qualified Data.Text as Text
import Epicbot.Data.Card (Card)
import qualified Epicbot.Data.Card as Card
newtype SearchEngine = SearchEngine
{ searchEngine :: SE.SearchEngine Card Text SearchField NoFeatures
}
data SearchField = NameField
deriving (Eq, Ord, Enum, Bounded, Ix, Show)
search :: Text -> SearchEngine -> [Text]
search query SearchEngine {searchEngine} =
SE.query searchEngine $ Text.words query
fromCards :: [Card] -> SearchEngine
fromCards cards =
SearchEngine $ SE.insertDocs cards $ SE.initSearchEngine searchConfig searchRankParams
searchConfig :: SearchConfig Card Text SearchField NoFeatures
searchConfig =
SearchConfig
{ documentKey = Card.externalId,
extractDocumentTerms = extractTerms,
transformQueryTerm = transformQuery,
documentFeatureValue = const SE.noFeatures
}
extractTerms :: Card -> SearchField -> [Text]
extractTerms card NameField =
Text.words $ Text.replace "," "" $ Text.toLower $ Card.name card
transformQuery :: Text -> SearchField -> Text
transformQuery query NameField = Text.replace "," "" $ Text.toLower query
searchRankParams :: SearchRankParameters SearchField NoFeatures
searchRankParams =
SearchRankParameters
{ paramK1 = 1.5,
paramB = const 1,
paramFieldWeights = const 1,
paramFeatureWeights = SE.noFeatures,
paramFeatureFunctions = SE.noFeatures,
paramResultsetSoftLimit = 200,
paramResultsetHardLimit = 400,
paramAutosuggestPrefilterLimit = 500,
paramAutosuggestPostfilterLimit = 500
}