git.iko.soy/typeable/bloodhound
on master help sign in
QueryQueryStringQuery and QueryStringQuery
commitd86ee08b1d0f3dd03c81b4551c42694e2accd7bb authorChris Allen <cma@bitemyapp.com> dateWed 4 Jun 2014, 08:08 (12 years ago) parent3cb5cfc
2 files changed+81−11
Database/Bloodhound/Types.hs+39−11 Database/Bloodhound/Types/Instances.hs+42
Database/Bloodhound/Types.hs+39−11
@@ -17,6 +17,7 @@ module Database.Bloodhound.Types
1717 , mkMultiMatchQuery
1818 , mkBoolQuery
1919 , mkRangeQuery
20+ , mkQueryStringQuery
2021 , Version(..)
2122 , Status(..)
2223 , Existence(..)
@@ -126,6 +127,12 @@ module Database.Bloodhound.Types
126127 , FieldDefinition(..)
127128 , MappingField(..)
128129 , Mapping(..)
130+ , AllowLeadingWildcard(..)
131+ , LowercaseExpanded(..)
132+ , GeneratePhraseQueries(..)
133+ , Locale(..)
134+ , AnalyzeWildcard(..)
135+ , EnablePositionIncrements(..)
129136 ) where
130137
131138import Data.Aeson
@@ -307,24 +314,30 @@ newtype MappingName = MappingName String deriving (Eq, Generic, Sho
307314 at specific documents. -}
308315newtype DocId = DocId String deriving (Eq, Generic, Show)
309316{-| 'QueryString' is used to wrap query text bodies, be they human written or not. -}
310−newtype QueryString = QueryString Text deriving (Eq, Show)
311−{-| 'FieldName' is used all over the place wherever a specific field within a document
312− needs to be specified, usually in 'Query's or 'Filter's. -}
317+newtype QueryString = QueryString Text deriving (Eq, Generic, Show)
318+{-| 'FieldName' is used all over the place wherever a specific field within
319+ a document needs to be specified, usually in 'Query's or 'Filter's. -}
313320newtype FieldName = FieldName Text deriving (Eq, Show)
314321{-| 'CacheName' is used in 'RegexpQuery' and 'RegexpFilter' for describing the
315322 'CacheKey' keyed caching behavior. -}
316323newtype 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. -}
318326newtype CacheKey = CacheKey Text deriving (Eq, Show)
319327newtype Existence = Existence Bool deriving (Eq, Show)
320328newtype NullValue = NullValue Bool deriving (Eq, Show)
321329newtype CutoffFrequency = CutoffFrequency Double deriving (Eq, Show, Generic)
322330newtype Analyzer = Analyzer Text deriving (Eq, Show, Generic)
323331newtype 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. -}
324335newtype Lenient = Lenient Bool deriving (Eq, Show, Generic)
325336newtype Tiebreaker = Tiebreaker Double deriving (Eq, Show, Generic)
326337newtype Boost = Boost Double deriving (Eq, Show, Generic)
327338newtype 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. -}
328341newtype MinimumMatch = MinimumMatch Int deriving (Eq, Show, Generic)
329342newtype MinimumMatchText = MinimumMatchText Text deriving (Eq, Show)
330343newtype DisableCoord = DisableCoord Bool deriving (Eq, Show, Generic)
@@ -332,19 +345,27 @@ newtype IgnoreTermFrequency = IgnoreTermFrequency Bool deriving (Eq, Show,
332345newtype MinimumTermFrequency = MinimumTermFrequency Int deriving (Eq, Show, Generic)
333346newtype MaxQueryTerms = MaxQueryTerms Int deriving (Eq, Show, Generic)
334347newtype Fuzziness = Fuzziness Double deriving (Eq, Show, Generic)
348+{-| 'PrefixLength' is the prefix length used in queries, defaults to 0. -}
335349newtype PrefixLength = PrefixLength Int deriving (Eq, Show, Generic)
336350newtype TypeName = TypeName Text deriving (Eq, Show, Generic)
337351newtype PercentMatch = PercentMatch Double deriving (Eq, Show, Generic)
338352newtype StopWord = StopWord Text deriving (Eq, Show, Generic)
339353newtype QueryPath = QueryPath Text deriving (Eq, Show, Generic)
340−newtype AllowLeadingWildcard = AllowLeadingWildcard Bool deriving (Eq, Show)
341−newtype LowercaseExpanded = LowercaseExpanded Bool deriving (Eq, Show)
342−newtype EnablePositionIncrements = EnablePositionIncrements Bool deriving (Eq, Show)
343−newtype AnalyzeWildcard = AnalyzeWildcard Bool deriving (Eq, Show)
344−newtype GeneratePhraseQueries = GeneratePhraseQueries Bool deriving (Eq, Show)
345−newtype Locale = Locale Text deriving (Eq, Show)
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. -}
355+newtype AllowLeadingWildcard = AllowLeadingWildcard Bool deriving (Eq, Show, Generic)
356+newtype LowercaseExpanded = LowercaseExpanded Bool deriving (Eq, Show, Generic)
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. -}
360+newtype AnalyzeWildcard = AnalyzeWildcard Bool deriving (Eq, Show, Generic)
361+{-| 'GeneratePhraseQueries' defaults to false. -}
362+newtype GeneratePhraseQueries = GeneratePhraseQueries Bool deriving (Eq, Show, Generic)
363+{-| 'Locale' is used for string conversions - defaults to ROOT. -}
364+newtype Locale = Locale Text deriving (Eq, Show, Generic)
346365newtype MaxWordLength = MaxWordLength Int deriving (Eq, Show, Generic)
347366newtype MinWordLength = MinWordLength Int deriving (Eq, Show, Generic)
367+{-| 'PhraseSlop' sets the default slop for phrases, 0 means exact
368+ phrase matches. Default is 0. -}
348369newtype PhraseSlop = PhraseSlop Int deriving (Eq, Show, Generic)
349370newtype MinDocFrequency = MinDocFrequency Int deriving (Eq, Show, Generic)
350371newtype MaxDocFrequency = MaxDocFrequency Int deriving (Eq, Show, Generic)
@@ -438,7 +459,7 @@ data SimpleQueryFlag =
438459-- use_dis_max and tie_breaker when fields are plural?
439460data QueryStringQuery =
440461 QueryStringQuery { queryStringQuery :: QueryString
441− , queryStringDefaultField :: Maybe FieldOrFields
462+ , queryStringDefaultField :: Maybe FieldName
442463 , queryStringOperator :: Maybe BooleanOperator
443464 , queryStringAnalyzer :: Maybe Analyzer
444465 , queryStringAllowLeadingWildcard :: Maybe AllowLeadingWildcard
@@ -456,6 +477,13 @@ data QueryStringQuery =
456477 , queryStringLocale :: Maybe Locale
457478 } deriving (Eq, Show)
458479
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+
459487data FieldOrFields = FofField FieldName
460488 | FofFields [FieldName] deriving (Eq, Show)
461489
Database/Bloodhound/Types/Instances.hs+42
@@ -144,6 +144,9 @@ instance ToJSON Query where
144144 where conjoined = [ "type" .= toJSON idsQueryMappingName
145145 , "values" .= fmap toJSON docIds ]
146146
147+ toJSON (QueryQueryStringQuery queryStringQuery) =
148+ object [ "query_string" .= toJSON queryStringQuery ]
149+
147150 toJSON (QueryMatchQuery matchQuery) =
148151 object [ "match" .= toJSON matchQuery ]
149152
@@ -213,6 +216,38 @@ instance ToJSON Query where
213216mField :: (ToJSON a, Functor f) => T.Text -> f a -> f (T.Text, Value)
214217mField field = fmap ((field .=) . toJSON)
215218
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+
216251instance ToJSON RangeQuery where
217252 toJSON (RangeQuery (FieldName fieldName) (Right range) boost) =
218253 object [ fieldName .= conjoined ]
@@ -487,6 +522,13 @@ instance ToJSON MinimumTermFrequency
487522instance ToJSON PercentMatch
488523instance ToJSON MappingName
489524instance 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
490532instance FromJSON Version
491533instance FromJSON IndexName
492534instance FromJSON MappingName