@@ -174,20 +174,32 @@ type PrefixValue = Text
174174
175175data BooleanOperator = And | Or deriving (Eq, Show)
176176
177−newtype IndexName = IndexName String deriving (Eq, Generic, Show)
178−newtype MappingName = MappingName String deriving (Eq, Generic, Show)
179−newtype DocId = DocId String deriving (Eq, Generic, Show)
180−newtype QueryString = QueryString Text deriving (Eq, Show)
181−newtype FieldName = FieldName Text deriving (Eq, Show)
182−newtype CacheName = CacheName Text deriving (Eq, Show)
183−newtype CacheKey = CacheKey Text deriving (Eq, Show)
184−newtype Existence = Existence Bool deriving (Eq, Show)
185−newtype NullValue = NullValue Bool deriving (Eq, Show)
177+newtype IndexName = IndexName String deriving (Eq, Generic, Show)
178+newtype MappingName = MappingName String deriving (Eq, Generic, Show)
179+newtype DocId = DocId String deriving (Eq, Generic, Show)
180+newtype QueryString = QueryString Text deriving (Eq, Show)
181+newtype FieldName = FieldName Text deriving (Eq, Show)
182+newtype CacheName = CacheName Text deriving (Eq, Show)
183+newtype CacheKey = CacheKey Text deriving (Eq, Show)
184+newtype Existence = Existence Bool deriving (Eq, Show)
185+newtype NullValue = NullValue Bool deriving (Eq, Show)
186+newtype CutoffFrequency = CutoffFrequency Double deriving (Eq, Show)
187+newtype Analyzer = Analyzer Text deriving (Eq, Show)
188+newtype MaxExpansions = MaxExpansions Int deriving (Eq, Show)
189+newtype Lenient = Lenient Bool deriving (Eq, Show)
190+newtype Tiebreaker = Tiebreaker Double deriving (Eq, Show)
191+newtype Boost = Boost Double deriving (Eq, Show)
192+newtype MinimumMatch = MinimumMatch Int deriving (Eq, Show)
193+newtype MinimumMatchText = MinimumMatchText Text deriving (Eq, Show)
194+newtype DisableCoord = DisableCoord Bool deriving (Eq, Show)
195+newtype IgnoreTermFrequency = IgnoreTermFrequency Bool deriving (Eq, Show)
196+newtype MaxQueryTerms = MaxQueryTerms Int deriving (Eq, Show)
197+newtype Fuzziness = Fuzziness Double deriving (Eq, Show)
198+newtype PrefixLength = PrefixLength Int deriving (Eq, Show)
186199
187200unpackId :: DocId -> String
188201unpackId (DocId docId) = docId
189202
190−type Boost = Double
191203type TrackSortScores = Bool
192204type From = Int
193205type Size = Int
@@ -198,13 +210,121 @@ data Search = Search { queryBody :: Maybe Query
198210 -- default False
199211 , trackSortScores :: TrackSortScores
200212 , from :: From
201− , size :: Size} deriving (Eq, Show)
202−
203−data Query = TermQuery Term (Maybe Boost)
204− | ConstantScoreFilter Filter Boost
205− | ConstantScoreQuery Query Boost
213+ , size :: Size } deriving (Eq, Show)
214+
215+data Query = TermQuery Term (Maybe Boost)
216+ | QueryMatchQuery MatchQuery
217+ | QueryMultiMatchQuery MultiMatchQuery
218+ | QueryBoolQuery BoolQuery
219+ | QueryBoostingQuery BoostingQuery
220+ | QueryCommonTermsQuery CommonTermsQuery
221+ | ConstantScoreFilter Filter Boost
222+ | ConstantScoreQuery Query Boost
223+ | QueryDisMaxQuery DisMaxQuery
224+ | QueryFilteredQuery FilteredQuery
225+ | QueryFuzzyLikeThisQuery FuzzyLikeThisQuery
226+ | QueryFuzzyLikeFieldQuery FuzzyLikeFieldQuery
227+ | QueryFunctionScoreQuery FunctionScoreQuery
206228 deriving (Eq, Show)
207229
230+data FuzzyLikeFieldQuery =
231+ FuzzyLikeFieldQuery { fuzzyLikeField :: FieldName
232+ -- anaphora is good for the soul.
233+ , fuzzyLikeFieldText :: Text
234+ , fuzzyLikeFieldMaxQueryTerms :: MaxQueryTerms
235+ , fuzzyLikeFieldIgnoreTermFrequency :: IgnoreTermFrequency
236+ , fuzzyLikeFieldFuzziness :: Fuzziness
237+ , fuzzyLikeFieldPrefixLength :: PrefixLength
238+ , fuzzyLikeFieldBoost :: Boost
239+ , fuzzyLikeFieldAnalyzer :: Maybe Analyzer
240+ } deriving (Eq, Show)
241+
242+data FuzzyLikeThisQuery =
243+ FuzzyLikeThisQuery { fuzzyLikeFields :: [FieldName]
244+ , fuzzyLikeText :: Text
245+ , fuzzyLikeMaxQueryTerms :: MaxQueryTerms
246+ , fuzzyLikeIgnoreTermFrequency :: IgnoreTermFrequency
247+ , fuzzyLikeFuzziness :: Fuzziness
248+ , fuzzyLikePrefixLength :: PrefixLength
249+ , fuzzyLikeBoost :: Boost
250+ , fuzzyLikeAnalyzer :: Maybe Analyzer
251+ } deriving (Eq, Show)
252+
253+data FilteredQuery =
254+ FilteredQuery { filteredQuery :: Query
255+ , filteredFilter :: Filter } deriving (Eq, Show)
256+
257+data DisMaxQuery = DisMaxQuery { disMaxQueries :: [Query]
258+ -- default 0.0
259+ , disMaxTiebreaker :: Tiebreaker
260+ , disMaxBoost :: Maybe Boost
261+ } deriving (Eq, Show)
262+data MatchQuery =
263+ MatchQuery { matchQueryField :: FieldName
264+ , matchQueryQueryString :: QueryString
265+ , matchQueryOperator :: BooleanOperator
266+ , matchQueryZeroTerms :: ZeroTermsQuery
267+ , matchQueryCutoffFrequency :: Maybe CutoffFrequency
268+ , matchQueryMatchType :: Maybe MatchQueryType
269+ , matchQueryAnalyzer :: Maybe Analyzer
270+ , matchQueryMaxExpansions :: Maybe MaxExpansions
271+ , matchQueryLenient :: Maybe Lenient } deriving (Eq, Show)
272+
273+mkMatchQuery :: FieldName -> QueryString -> MatchQuery
274+mkMatchQuery field query = MatchQuery field query Or ZeroTermsNone Nothing Nothing Nothing Nothing Nothing
275+
276+data MatchQueryType = MatchPhrase
277+ | MatchPhrasePrefix deriving (Eq, Show)
278+
279+data MultiMatchQuery =
280+ MultiMatchQuery { multiMatchQueryFields :: [FieldName]
281+ , multiMatchQueryString :: QueryString
282+ , multiMatchQueryOperator :: BooleanOperator
283+ , multiMatchQueryZeroTerms :: ZeroTermsQuery
284+ , multiMatchQueryTiebreaker :: Maybe Tiebreaker
285+ , multiMatchQueryType :: Maybe MultiMatchQueryType
286+ , multiMatchQueryCutoffFrequency :: Maybe CutoffFrequency
287+ , multiMatchQueryAnalyzer :: Maybe Analyzer
288+ , multiMatchQueryMaxExpansions :: Maybe MaxExpansions
289+ , multiMatchQueryLenient :: Maybe Lenient } deriving (Eq, Show)
290+
291+data MultiMatchQueryType = MultiMatchBestFields
292+ | MultiMatchMostFields
293+ | MultiMatchCrossFields
294+ | MultiMatchPhrase
295+ | MultiMatchPhrasePrefix deriving (Eq, Show)
296+
297+data BoolQuery = BoolQuery { boolQueryMustMatch :: Maybe Query
298+ , boolQueryMustNotMatch :: Maybe Query
299+ , boolQueryShouldMatch :: Maybe [Query]
300+ , boolQueryMinimumShouldMatch :: Maybe MinimumMatch
301+ , boolQueryBoost :: Maybe Boost
302+ , boolQueryDisableCoord :: Maybe DisableCoord
303+ } deriving (Eq, Show)
304+
305+data BoostingQuery = BoostingQuery { positiveQuery :: Maybe Query
306+ , negativeQuery :: Maybe Query
307+ , positiveBoost :: Maybe Boost
308+ , negativeBoost :: Maybe Boost } deriving (Eq, Show)
309+
310+data CommonTermsQuery =
311+ CommonTermsQuery { commonQuery :: QueryString
312+ , commonCutoffFrequency :: CutoffFrequency
313+ , commonLowFreqOperator :: BooleanOperator
314+ , commonHighFreqOperator :: BooleanOperator
315+ , commonMinimumShouldMatch :: Maybe CommonMinimumMatch
316+ , commonBoost :: Maybe Boost
317+ , commonAnalyzer :: Maybe Analyzer
318+ , commonDisableCoord :: Maybe DisableCoord
319+ } deriving (Eq, Show)
320+
321+data CommonMinimumMatch = CommonMinimumMatchHighLow MinimumMatchHighLow
322+ | CommonMinimumMatch MinimumMatchText deriving (Eq, Show)
323+
324+data MinimumMatchHighLow =
325+ MinimumMatchHighLow { lowFreq :: MinimumMatch
326+ , highFreq :: MinimumMatch } deriving (Eq, Show)
327+
208328data Filter = AndFilter [Filter] Cache
209329 | OrFilter [Filter] Cache
210330 | NotFilter Filter Cache
@@ -223,6 +343,8 @@ data Filter = AndFilter [Filter] Cache
223343 | RegexpFilter FieldName Regexp RegexpFlags CacheName Cache CacheKey
224344 deriving (Eq, Show)
225345
346+data ZeroTermsQuery = ZeroTermsNone | ZeroTermsAll deriving (Eq, Show)
347+
226348-- lt, lte | gt, gte
227349newtype LessThan = LessThan Double deriving (Eq, Show)
228350newtype LessThanEq = LessThanEq Double deriving (Eq, Show)