git.iko.soy/typeable/bloodhound
on master help sign in
QueryQueryStringQuery and QueryStringQuery
d86ee08Chris Allen
Database/Bloodhound/Types.hs+39−11
@@ -17,6 +17,7 @@ module Database.Bloodhound.Types
17 , mkMultiMatchQuery
17 , mkMultiMatchQuery
18 , mkBoolQuery
18 , mkBoolQuery
19 , mkRangeQuery
19 , mkRangeQuery
20+ , mkQueryStringQuery
20 , Version(..)
21 , Version(..)
21 , Status(..)
22 , Status(..)
22 , Existence(..)
23 , Existence(..)
@@ -126,6 +127,12 @@ module Database.Bloodhound.Types
126 , FieldDefinition(..)
127 , FieldDefinition(..)
127 , MappingField(..)
128 , MappingField(..)
128 , Mapping(..)
129 , Mapping(..)
130+ , AllowLeadingWildcard(..)
131+ , LowercaseExpanded(..)
132+ , GeneratePhraseQueries(..)
133+ , Locale(..)
134+ , AnalyzeWildcard(..)
135+ , EnablePositionIncrements(..)
129 ) where
136 ) where
130
137
131import Data.Aeson
138import Data.Aeson
@@ -307,24 +314,30 @@ newtype MappingName = MappingName String deriving (Eq, Generic, Sho
307 at specific documents. -}
314 at specific documents. -}
308newtype DocId = DocId String deriving (Eq, Generic, Show)
315newtype DocId = DocId String deriving (Eq, Generic, Show)
309{-| 'QueryString' is used to wrap query text bodies, be they human written or not. -}
316{-| 'QueryString' is used to wrap query text bodies, be they human written or not. -}
310−newtype QueryString = QueryString Text deriving (Eq, Show)
317+newtype QueryString = QueryString Text deriving (Eq, Generic, Show)
311−{-| 'FieldName' is used all over the place wherever a specific field within a document
318+{-| 'FieldName' is used all over the place wherever a specific field within
312− needs to be specified, usually in 'Query's or 'Filter's. -}
319+ a document needs to be specified, usually in 'Query's or 'Filter's. -}
313newtype FieldName = FieldName Text deriving (Eq, Show)
320newtype FieldName = FieldName Text deriving (Eq, Show)
314{-| 'CacheName' is used in 'RegexpQuery' and 'RegexpFilter' for describing the
321{-| 'CacheName' is used in 'RegexpQuery' and 'RegexpFilter' for describing the
315 'CacheKey' keyed caching behavior. -}
322 'CacheKey' keyed caching behavior. -}
316newtype CacheName = CacheName Text deriving (Eq, Show)
323newtype CacheName = CacheName Text deriving (Eq, Show)
317−{-| 'CacheKey' is used in 'RegexpQuery' and 'RegexpFilter' to key regex caching behavior. -}
324+{-| 'CacheKey' is used in 'RegexpQuery' and 'RegexpFilter' to key regex
325+ caching behavior. -}
318newtype CacheKey = CacheKey Text deriving (Eq, Show)
326newtype CacheKey = CacheKey Text deriving (Eq, Show)
319newtype Existence = Existence Bool deriving (Eq, Show)
327newtype Existence = Existence Bool deriving (Eq, Show)
320newtype NullValue = NullValue Bool deriving (Eq, Show)
328newtype NullValue = NullValue Bool deriving (Eq, Show)
321newtype CutoffFrequency = CutoffFrequency Double deriving (Eq, Show, Generic)
329newtype CutoffFrequency = CutoffFrequency Double deriving (Eq, Show, Generic)
322newtype Analyzer = Analyzer Text deriving (Eq, Show, Generic)
330newtype Analyzer = Analyzer Text deriving (Eq, Show, Generic)
323newtype MaxExpansions = MaxExpansions Int deriving (Eq, Show, Generic)
331newtype MaxExpansions = MaxExpansions Int deriving (Eq, Show, Generic)
332+{-| 'Lenient', if set to true, will cause format based failures to be
333+ ignored. I don't know what the bloody default is, Elasticsearch
334+ documentation didn't say what it was. Let me know if you figure it out. -}
324newtype Lenient = Lenient Bool deriving (Eq, Show, Generic)
335newtype Lenient = Lenient Bool deriving (Eq, Show, Generic)
325newtype Tiebreaker = Tiebreaker Double deriving (Eq, Show, Generic)
336newtype Tiebreaker = Tiebreaker Double deriving (Eq, Show, Generic)
326newtype Boost = Boost Double deriving (Eq, Show, Generic)
337newtype Boost = Boost Double deriving (Eq, Show, Generic)
327newtype BoostTerms = BoostTerms Double deriving (Eq, Show, Generic)
338newtype BoostTerms = BoostTerms Double deriving (Eq, Show, Generic)
339+{-| 'MinimumMatch' controls how many should clauses in the bool query should match.
340+ Can be an absolute value (2) or a percentage (30%) or a combination of both. -}
328newtype MinimumMatch = MinimumMatch Int deriving (Eq, Show, Generic)
341newtype MinimumMatch = MinimumMatch Int deriving (Eq, Show, Generic)
329newtype MinimumMatchText = MinimumMatchText Text deriving (Eq, Show)
342newtype MinimumMatchText = MinimumMatchText Text deriving (Eq, Show)
330newtype DisableCoord = DisableCoord Bool deriving (Eq, Show, Generic)
343newtype DisableCoord = DisableCoord Bool deriving (Eq, Show, Generic)
@@ -332,19 +345,27 @@ newtype IgnoreTermFrequency = IgnoreTermFrequency Bool deriving (Eq, Show,
332newtype MinimumTermFrequency = MinimumTermFrequency Int deriving (Eq, Show, Generic)
345newtype MinimumTermFrequency = MinimumTermFrequency Int deriving (Eq, Show, Generic)
333newtype MaxQueryTerms = MaxQueryTerms Int deriving (Eq, Show, Generic)
346newtype MaxQueryTerms = MaxQueryTerms Int deriving (Eq, Show, Generic)
334newtype Fuzziness = Fuzziness Double deriving (Eq, Show, Generic)
347newtype Fuzziness = Fuzziness Double deriving (Eq, Show, Generic)
348+{-| 'PrefixLength' is the prefix length used in queries, defaults to 0. -}
335newtype PrefixLength = PrefixLength Int deriving (Eq, Show, Generic)
349newtype PrefixLength = PrefixLength Int deriving (Eq, Show, Generic)
336newtype TypeName = TypeName Text deriving (Eq, Show, Generic)
350newtype TypeName = TypeName Text deriving (Eq, Show, Generic)
337newtype PercentMatch = PercentMatch Double deriving (Eq, Show, Generic)
351newtype PercentMatch = PercentMatch Double deriving (Eq, Show, Generic)
338newtype StopWord = StopWord Text deriving (Eq, Show, Generic)
352newtype StopWord = StopWord Text deriving (Eq, Show, Generic)
339newtype QueryPath = QueryPath Text deriving (Eq, Show, Generic)
353newtype QueryPath = QueryPath Text deriving (Eq, Show, Generic)
354+{-| Allowing a wildcard at the beginning of a word (eg "*ing") is particularly heavy, because all terms in the index need to be examined, just in case they match. Leading wildcards can be disabled by setting 'AllowLeadingWildcard' to false. -}
340−newtype AllowLeadingWildcard = AllowLeadingWildcard Bool deriving (Eq, Show)
355+newtype AllowLeadingWildcard = AllowLeadingWildcard Bool deriving (Eq, Show, Generic)
341−newtype LowercaseExpanded = LowercaseExpanded Bool deriving (Eq, Show)
356+newtype LowercaseExpanded = LowercaseExpanded Bool deriving (Eq, Show, Generic)
342−newtype EnablePositionIncrements = EnablePositionIncrements Bool deriving (Eq, Show)
357+newtype EnablePositionIncrements = EnablePositionIncrements Bool deriving (Eq, Show, Generic)
358+{-| By default, wildcard terms in a query are not analyzed.
359+ Setting 'AnalyzeWildcard' to true enables best-effort analysis. -}
343−newtype AnalyzeWildcard = AnalyzeWildcard Bool deriving (Eq, Show)
360+newtype AnalyzeWildcard = AnalyzeWildcard Bool deriving (Eq, Show, Generic)
361+{-| 'GeneratePhraseQueries' defaults to false. -}
344−newtype GeneratePhraseQueries = GeneratePhraseQueries Bool deriving (Eq, Show)
362+newtype GeneratePhraseQueries = GeneratePhraseQueries Bool deriving (Eq, Show, Generic)
363+{-| 'Locale' is used for string conversions - defaults to ROOT. -}
345−newtype Locale = Locale Text deriving (Eq, Show)
364+newtype Locale = Locale Text deriving (Eq, Show, Generic)
346newtype MaxWordLength = MaxWordLength Int deriving (Eq, Show, Generic)
365newtype MaxWordLength = MaxWordLength Int deriving (Eq, Show, Generic)
347newtype MinWordLength = MinWordLength Int deriving (Eq, Show, Generic)
366newtype MinWordLength = MinWordLength Int deriving (Eq, Show, Generic)
367+{-| 'PhraseSlop' sets the default slop for phrases, 0 means exact
368+ phrase matches. Default is 0. -}
348newtype PhraseSlop = PhraseSlop Int deriving (Eq, Show, Generic)
369newtype PhraseSlop = PhraseSlop Int deriving (Eq, Show, Generic)
349newtype MinDocFrequency = MinDocFrequency Int deriving (Eq, Show, Generic)
370newtype MinDocFrequency = MinDocFrequency Int deriving (Eq, Show, Generic)
350newtype MaxDocFrequency = MaxDocFrequency Int deriving (Eq, Show, Generic)
371newtype MaxDocFrequency = MaxDocFrequency Int deriving (Eq, Show, Generic)
@@ -438,7 +459,7 @@ data SimpleQueryFlag =
438-- use_dis_max and tie_breaker when fields are plural?
459-- use_dis_max and tie_breaker when fields are plural?
439data QueryStringQuery =
460data QueryStringQuery =
440 QueryStringQuery { queryStringQuery :: QueryString
461 QueryStringQuery { queryStringQuery :: QueryString
441− , queryStringDefaultField :: Maybe FieldOrFields
462+ , queryStringDefaultField :: Maybe FieldName
442 , queryStringOperator :: Maybe BooleanOperator
463 , queryStringOperator :: Maybe BooleanOperator
443 , queryStringAnalyzer :: Maybe Analyzer
464 , queryStringAnalyzer :: Maybe Analyzer
444 , queryStringAllowLeadingWildcard :: Maybe AllowLeadingWildcard
465 , queryStringAllowLeadingWildcard :: Maybe AllowLeadingWildcard
@@ -456,6 +477,13 @@ data QueryStringQuery =
456 , queryStringLocale :: Maybe Locale
477 , queryStringLocale :: Maybe Locale
457 } deriving (Eq, Show)
478 } deriving (Eq, Show)
458
479
480+mkQueryStringQuery :: QueryString -> QueryStringQuery
481+mkQueryStringQuery qs = QueryStringQuery qs Nothing Nothing
482+ Nothing Nothing Nothing Nothing
483+ Nothing Nothing Nothing Nothing
484+ Nothing Nothing Nothing Nothing
485+ Nothing Nothing
486+
459data FieldOrFields = FofField FieldName
487data FieldOrFields = FofField FieldName
460 | FofFields [FieldName] deriving (Eq, Show)
488 | FofFields [FieldName] deriving (Eq, Show)
461
489
Database/Bloodhound/Types/Instances.hs+42
@@ -144,6 +144,9 @@ instance ToJSON Query where
144 where conjoined = [ "type" .= toJSON idsQueryMappingName
144 where conjoined = [ "type" .= toJSON idsQueryMappingName
145 , "values" .= fmap toJSON docIds ]
145 , "values" .= fmap toJSON docIds ]
146
146
147+ toJSON (QueryQueryStringQuery queryStringQuery) =
148+ object [ "query_string" .= toJSON queryStringQuery ]
149+
147 toJSON (QueryMatchQuery matchQuery) =
150 toJSON (QueryMatchQuery matchQuery) =
148 object [ "match" .= toJSON matchQuery ]
151 object [ "match" .= toJSON matchQuery ]
149
152
@@ -213,6 +216,38 @@ instance ToJSON Query where
213mField :: (ToJSON a, Functor f) => T.Text -> f a -> f (T.Text, Value)
216mField :: (ToJSON a, Functor f) => T.Text -> f a -> f (T.Text, Value)
214mField field = fmap ((field .=) . toJSON)
217mField field = fmap ((field .=) . toJSON)
215
218
219+instance ToJSON QueryStringQuery where
220+ toJSON (QueryStringQuery qsQueryString
221+ qsDefaultField qsOperator
222+ qsAnalyzer qsAllowWildcard
223+ qsLowercaseExpanded qsEnablePositionIncrements
224+ qsFuzzyMaxExpansions qsFuzziness
225+ qsFuzzyPrefixLength qsPhraseSlop
226+ qsBoost qsAnalyzeWildcard
227+ qsGeneratePhraseQueries qsMinimumShouldMatch
228+ qsLenient qsLocale) =
229+ object conjoined
230+ where
231+ base = [ "query" .= toJSON qsQueryString ]
232+ maybeAdd =
233+ catMaybes [ mField "default_field" qsDefaultField
234+ , mField "default_operator" qsOperator
235+ , mField "analyzer" qsAnalyzer
236+ , mField "allow_leading_wildcard" qsAllowWildcard
237+ , mField "lowercase_expanded_terms" qsLowercaseExpanded
238+ , mField "enable_position_increments" qsEnablePositionIncrements
239+ , mField "fuzzy_max_expansions" qsFuzzyMaxExpansions
240+ , mField "fuzziness" qsFuzziness
241+ , mField "fuzzy_prefix_length" qsFuzzyPrefixLength
242+ , mField "phrase_slop" qsPhraseSlop
243+ , mField "boost" qsBoost
244+ , mField "analyze_wildcard" qsAnalyzeWildcard
245+ , mField "auto_generate_phrase_queries" qsGeneratePhraseQueries
246+ , mField "minimum_should_match" qsMinimumShouldMatch
247+ , mField "lenient" qsLenient
248+ , mField "locale" qsLocale ]
249+ conjoined = base ++ maybeAdd
250+
216instance ToJSON RangeQuery where
251instance ToJSON RangeQuery where
217 toJSON (RangeQuery (FieldName fieldName) (Right range) boost) =
252 toJSON (RangeQuery (FieldName fieldName) (Right range) boost) =
218 object [ fieldName .= conjoined ]
253 object [ fieldName .= conjoined ]
@@ -487,6 +522,13 @@ instance ToJSON MinimumTermFrequency
487instance ToJSON PercentMatch
522instance ToJSON PercentMatch
488instance ToJSON MappingName
523instance ToJSON MappingName
489instance ToJSON DocId
524instance ToJSON DocId
525+instance ToJSON QueryString
526+instance ToJSON AllowLeadingWildcard
527+instance ToJSON LowercaseExpanded
528+instance ToJSON AnalyzeWildcard
529+instance ToJSON GeneratePhraseQueries
530+instance ToJSON Locale
531+instance ToJSON EnablePositionIncrements
490instance FromJSON Version
532instance FromJSON Version
491instance FromJSON IndexName
533instance FromJSON IndexName
492instance FromJSON MappingName
534instance FromJSON MappingName