@@ -202,6 +202,7 @@ module Database.V5.Bloodhound.Types
202 , ZeroTermsQuery(..)
202 , ZeroTermsQuery(..)
203 , CutoffFrequency(..)
203 , CutoffFrequency(..)
204 , Analyzer(..)
204 , Analyzer(..)
205 , MaxExpansions(..)
206 , MaxExpansions(..)
206 , Lenient(..)
207 , Lenient(..)
207 , MatchQueryType(..)
208 , MatchQueryType(..)
@@ -376,6 +377,12 @@ module Database.V5.Bloodhound.Types
377 , EsUsername(..)
378 , EsUsername(..)
378 , EsPassword(..)
379 , EsPassword(..)
382+ , AnalyzerDefinition(..)
383+ , TokenizerDefinition(..)
381import Control.Applicative as A
388import Control.Applicative as A
@@ -583,8 +590,89 @@ data UpdatableIndexSetting = NumberOfReplicas ReplicaCount
583 | IndexCompoundOnFlush Bool
590 | IndexCompoundOnFlush Bool
584 | WarmerEnabled Bool
591 | WarmerEnabled Bool
585 | MappingTotalFieldsLimit Int
592 | MappingTotalFieldsLimit Int
593+ | AnalysisSetting Analysis
594+ -- ^ Analysis is not a dynamic setting and can only be performed on a closed index.
586 deriving (Eq, Show, Generic, Typeable)
595 deriving (Eq, Show, Generic, Typeable)
597+data Analysis = Analysis
598+ { analysisAnalyzer :: M.Map Text AnalyzerDefinition
599+ , analysisTokenizer :: M.Map Text TokenizerDefinition
600+ } deriving (Eq,Show,Generic,Typeable)
602+instance ToJSON Analysis where
603+ toJSON (Analysis analyzer tokenizer) = object
604+ [ "analyzer" .= analyzer
605+ , "tokenizer" .= tokenizer
608+instance FromJSON Analysis where
609+ parseJSON = withObject "Analysis" $ \m -> Analysis
611+ <*> m .: "tokenizer"
613+data AnalyzerDefinition = AnalyzerDefinition
614+ { analyzerDefinitionTokenizer :: Maybe Tokenizer
615+ } deriving (Eq,Show,Generic,Typeable)
617+instance ToJSON AnalyzerDefinition where
618+ toJSON (AnalyzerDefinition tokenizer) = object $ catMaybes
619+ [ fmap ("tokenizer" .=) tokenizer
622+instance FromJSON AnalyzerDefinition where
623+ parseJSON = withObject "AnalyzerDefinition" $ \m -> AnalyzerDefinition
624+ <$> m .:? "tokenizer"
627+data TokenizerDefinition
628+ = TokenizerDefinitionNgram Ngram
629+ deriving (Eq,Show,Generic,Typeable)
631+instance ToJSON TokenizerDefinition where
632+ toJSON x = case x of
633+ TokenizerDefinitionNgram (Ngram minGram maxGram tokenChars) -> object
634+ [ "type" .= ("ngram" :: Text)
635+ , "min_gram" .= minGram
636+ , "max_gram" .= maxGram
637+ , "token_chars" .= tokenChars
640+instance FromJSON TokenizerDefinition where
641+ parseJSON = withObject "TokenizerDefinition" $ \m -> do
642+ typ <- m .: "type" :: Parser Text
644+ "ngram" -> fmap TokenizerDefinitionNgram $ Ngram
645+ <$> (fmap unStringlyTypedInt (m .: "min_gram"))
646+ <*> (fmap unStringlyTypedInt (m .: "max_gram"))
647+ <*> m .: "token_chars"
648+ _ -> fail "invalid TokenizerDefinition"
651+ { ngramMinGram :: Int
652+ , ngramMaxGram :: Int
653+ , ngramTokenChars :: [TokenChar]
654+ } deriving (Eq,Show,Generic,Typeable)
656+data TokenChar = TokenLetter | TokenDigit | TokenWhitespace | TokenPunctuation | TokenSymbol
657+ deriving (Eq,Read,Show,Generic,Typeable)
659+instance ToJSON TokenChar where
660+ toJSON t = String $ case t of
661+ TokenLetter -> "letter"
662+ TokenDigit -> "digit"
663+ TokenWhitespace -> "whitespace"
664+ TokenPunctuation -> "punctuation"
665+ TokenSymbol -> "symbol"
667+instance FromJSON TokenChar where
668+ parseJSON = withText "TokenChar" $ \t -> case t of
669+ "letter" -> return TokenLetter
670+ "digit" -> return TokenDigit
671+ "whitespace" -> return TokenWhitespace
672+ "punctuation" -> return TokenPunctuation
673+ "symbol" -> return TokenSymbol
674+ _ -> fail "invalid TokenChar"
588data AllocationPolicy = AllocAll
676data AllocationPolicy = AllocAll
589 -- ^ Allows shard allocation for all shards.
677 -- ^ Allows shard allocation for all shards.
590 | AllocPrimaries
678 | AllocPrimaries
@@ -1020,6 +1108,8 @@ newtype CutoffFrequency =
1020 CutoffFrequency Double deriving (Eq, Read, Show, Generic, ToJSON, FromJSON, Typeable)
1108 CutoffFrequency Double deriving (Eq, Read, Show, Generic, ToJSON, FromJSON, Typeable)
1021newtype Analyzer =
1109newtype Analyzer =
1022 Analyzer Text deriving (Eq, Read, Show, Generic, ToJSON, FromJSON, Typeable)
1110 Analyzer Text deriving (Eq, Read, Show, Generic, ToJSON, FromJSON, Typeable)
1112+ Tokenizer Text deriving (Eq, Read, Show, Generic, ToJSON, FromJSON, Typeable)
1023newtype MaxExpansions =
1113newtype MaxExpansions =
1024 MaxExpansions Int deriving (Eq, Read, Show, Generic, ToJSON, FromJSON, Typeable)
1114 MaxExpansions Int deriving (Eq, Read, Show, Generic, ToJSON, FromJSON, Typeable)
@@ -2990,6 +3080,7 @@ instance ToJSON UpdatableIndexSetting where
2990 toJSON (BlocksWrite x) = oPath ("blocks" :| ["write"]) x
3080 toJSON (BlocksWrite x) = oPath ("blocks" :| ["write"]) x
2991 toJSON (BlocksMetaData x) = oPath ("blocks" :| ["metadata"]) x
3081 toJSON (BlocksMetaData x) = oPath ("blocks" :| ["metadata"]) x
2992 toJSON (MappingTotalFieldsLimit x) = oPath ("index" :| ["mapping","total_fields","limit"]) x
3082 toJSON (MappingTotalFieldsLimit x) = oPath ("index" :| ["mapping","total_fields","limit"]) x
3083+ toJSON (AnalysisSetting x) = oPath ("index" :| ["analysis"]) x
2994instance FromJSON UpdatableIndexSetting where
3085instance FromJSON UpdatableIndexSetting where
2995 parseJSON = withObject "UpdatableIndexSetting" parse
3086 parseJSON = withObject "UpdatableIndexSetting" parse
@@ -3022,6 +3113,7 @@ instance FromJSON UpdatableIndexSetting where
3022 <|> blocksWrite `taggedAt` ["blocks", "write"]
3113 <|> blocksWrite `taggedAt` ["blocks", "write"]
3023 <|> blocksMetaData `taggedAt` ["blocks", "metadata"]
3114 <|> blocksMetaData `taggedAt` ["blocks", "metadata"]
3024 <|> mappingTotalFieldsLimit `taggedAt` ["index", "mapping", "total_fields", "limit"]
3115 <|> mappingTotalFieldsLimit `taggedAt` ["index", "mapping", "total_fields", "limit"]
3116+ <|> analysisSetting `taggedAt` ["index", "analysis"]
3025 where taggedAt f ks = taggedAt' f (Object o) ks
3117 where taggedAt f ks = taggedAt' f (Object o) ks
3026 taggedAt' f v [] = f =<< (parseJSON v <|> (parseJSON (unStringlyTypeJSON v)))
3118 taggedAt' f v [] = f =<< (parseJSON v <|> (parseJSON (unStringlyTypeJSON v)))
3027 taggedAt' f v (k:ks) = withObject "Object" (\o -> do v' <- o .: k
3119 taggedAt' f v (k:ks) = withObject "Object" (\o -> do v' <- o .: k
@@ -3055,6 +3147,7 @@ instance FromJSON UpdatableIndexSetting where
3055 blocksWrite = pure . BlocksWrite
3147 blocksWrite = pure . BlocksWrite
3056 blocksMetaData = pure . BlocksMetaData
3148 blocksMetaData = pure . BlocksMetaData
3057 mappingTotalFieldsLimit = pure . MappingTotalFieldsLimit
3149 mappingTotalFieldsLimit = pure . MappingTotalFieldsLimit
3150+ analysisSetting = pure . AnalysisSetting
3059instance FromJSON IndexSettingsSummary where
3152instance FromJSON IndexSettingsSummary where
3060 parseJSON = withObject "IndexSettingsSummary" parse
3153 parseJSON = withObject "IndexSettingsSummary" parse
@@ -4643,10 +4736,13 @@ instance FromJSON NodeDataPathStats where
4644newtype StringlyTypedDouble = StringlyTypedDouble { unStringlyTypedDouble :: Double }
4737newtype StringlyTypedDouble = StringlyTypedDouble { unStringlyTypedDouble :: Double }
4647instance FromJSON StringlyTypedDouble where
4739instance FromJSON StringlyTypedDouble where
4648 parseJSON = fmap StringlyTypedDouble . parseJSON . unStringlyTypeJSON
4740 parseJSON = fmap StringlyTypedDouble . parseJSON . unStringlyTypeJSON
4742+newtype StringlyTypedInt = StringlyTypedInt { unStringlyTypedInt :: Int }
4744+instance FromJSON StringlyTypedInt where
4745+ parseJSON = fmap StringlyTypedInt . parseJSON . unStringlyTypeJSON
4651instance FromJSON NodeFSTotalStats where
4747instance FromJSON NodeFSTotalStats where
4652 parseJSON = withObject "NodeFSTotalStats" parse
4748 parseJSON = withObject "NodeFSTotalStats" parse