1{-# LANGUAGE DeriveGeneric #-}
2{-# LANGUAGE OverloadedStrings #-}
8-------------------------------------------------------------------------------
9import Control.Monad.IO.Class (liftIO)
10import Data.Aeson (FromJSON (..), defaultOptions,
11 genericParseJSON, genericToJSON,
13import Data.List.NonEmpty (NonEmpty (..))
14import Data.Text (Text)
15import Data.Time.Calendar (Day (..))
16import Data.Time.Clock (UTCTime (..), secondsToDiffTime)
17import qualified Data.Vector as V
18import Database.V1.Bloodhound
19import GHC.Generics (Generic)
20import Network.HTTP.Client (defaultManagerSettings)
21-------------------------------------------------------------------------------
24data TweetMapping = TweetMapping deriving (Eq, Show)
26instance ToJSON TweetMapping where
30 object ["location" .= object ["type" .= ("geo_point" :: Text)]]
34-------------------------------------------------------------------------------
35data Location = Location
38 } deriving (Eq, Generic, Show)
41-------------------------------------------------------------------------------
47 , location :: Location
48 } deriving (Eq, Generic, Show)
51-------------------------------------------------------------------------------
56 , postDate = UTCTime (ModifiedJulianDay 55000) (secondsToDiffTime 10)
57 , message = "Use haskell!"
62 loc = Location {locLat = 40.12, locLon = (-71.34)}
64instance ToJSON Tweet where
65 toJSON = genericToJSON defaultOptions
66instance FromJSON Tweet where
67 parseJSON = genericParseJSON defaultOptions
68instance ToJSON Location where
69 toJSON = genericToJSON defaultOptions
70instance FromJSON Location where
71 parseJSON = genericParseJSON defaultOptions
74-------------------------------------------------------------------------------
78 _ <- createIndex indexSettings testIndex
79 True <- indexExists testIndex
80 _ <- putMapping testIndex testMapping TweetMapping
83 resp <- indexDocument testIndex testMapping defaultIndexDocumentSettings exampleTweet (DocId "1")
85 -- Response {responseStatus = Status {statusCode = 201, statusMessage = "Created"}, responseVersion = HTTP/1.1, responseHeaders = [("Content-Type","application/json; charset=UTF-8"),("Content-Length","74")], responseBody = "{\"_index\":\"twitter\",\"_type\":\"tweet\",\"_id\":\"1\",\"_version\":1,\"created\":true}", responseCookieJar = CJ {expose = []}, responseClose' = ResponseClose}
88 let stream = V.fromList [BulkIndex testIndex testMapping (DocId "2") (toJSON exampleTweet)]
90 -- Bulk loads require an index refresh before new data is loaded.
91 _ <- refreshIndex testIndex
93 -- set up some aliases
94 let aliasName = IndexName "twitter-alias"
95 let iAlias = IndexAlias testIndex (IndexAliasName aliasName)
96 let aliasRouting = Nothing
97 let aliasFiltering = Nothing
98 let aliasCreate = IndexAliasCreate aliasRouting aliasFiltering
99 _ <- updateIndexAliases (AddAlias iAlias aliasCreate :| [])
100 True <- indexExists aliasName
102 -- create a template so that if we just write into an index named tweet-2017-01-02, for instance, the index will be automatically created with the given mapping. This is a great idea for any ongoing indices because it makes them much easier to manage and rotate.
103 let idxTpl = IndexTemplate (TemplatePattern "tweet-*") (Just (IndexSettings (ShardCount 1) (ReplicaCount 1))) [toJSON TweetMapping]
104 let templateName = TemplateName "tweet-tpl"
105 _ <- putTemplate idxTpl templateName
106 True <- templateExists templateName
110 let query = TermQuery (Term "user" "bitemyapp") boost
111 let search = mkSearch (Just query) boost
112 _ <- searchByType testIndex testMapping search
115 _ <- deleteTemplate templateName
116 _ <- deleteIndex testIndex
117 False <- indexExists testIndex
121 testServer = (Server "http://localhost:9200")
122 runBH' = withBH defaultManagerSettings testServer
123 testIndex = IndexName "twitter"
124 testMapping = MappingName "tweet"
125 indexSettings = IndexSettings (ShardCount 1) (ReplicaCount 0)
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list