{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE StrictData #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# OPTIONS_GHC -fno-warn-unused-binds #-}
{-# OPTIONS_GHC -fno-warn-unused-imports #-}
{-# OPTIONS_GHC -fno-warn-unused-matches #-}

-- Derived from AWS service descriptions, licensed under Apache 2.0.

-- |
-- Module      : Amazonka.CloudSearchDomains.Search
-- Copyright   : (c) 2013-2021 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Retrieves a list of documents that match the specified search criteria.
-- How you specify the search criteria depends on which query parser you
-- use. Amazon CloudSearch supports four query parsers:
--
-- -   @simple@: search all @text@ and @text-array@ fields for the
--     specified string. Search for phrases, individual terms, and
--     prefixes.
-- -   @structured@: search specific fields, construct compound queries
--     using Boolean operators, and use advanced features such as term
--     boosting and proximity searching.
-- -   @lucene@: specify search criteria using the Apache Lucene query
--     parser syntax.
-- -   @dismax@: specify search criteria using the simplified subset of the
--     Apache Lucene query parser syntax defined by the DisMax query
--     parser.
--
-- For more information, see
-- <http://docs.aws.amazon.com/cloudsearch/latest/developerguide/searching.html Searching Your Data>
-- in the /Amazon CloudSearch Developer Guide/.
--
-- The endpoint for submitting @Search@ requests is domain-specific. You
-- submit search requests to a domain\'s search endpoint. To get the search
-- endpoint for your domain, use the Amazon CloudSearch configuration
-- service @DescribeDomains@ action. A domain\'s endpoints are also
-- displayed on the domain dashboard in the Amazon CloudSearch console.
module Amazonka.CloudSearchDomains.Search
  ( -- * Creating a Request
    Search (..),
    newSearch,

    -- * Request Lenses
    search_expr,
    search_cursor,
    search_return,
    search_queryOptions,
    search_filterQuery,
    search_size,
    search_queryParser,
    search_start,
    search_highlight,
    search_stats,
    search_sort,
    search_facet,
    search_partial,
    search_query,

    -- * Destructuring the Response
    SearchResponse (..),
    newSearchResponse,

    -- * Response Lenses
    searchResponse_status,
    searchResponse_facets,
    searchResponse_stats,
    searchResponse_hits,
    searchResponse_httpStatus,
  )
where

import Amazonka.CloudSearchDomains.Types
import qualified Amazonka.Core as Core
import qualified Amazonka.Lens as Lens
import qualified Amazonka.Prelude as Prelude
import qualified Amazonka.Request as Request
import qualified Amazonka.Response as Response

-- | Container for the parameters to the @Search@ request.
--
-- /See:/ 'newSearch' smart constructor.
data Search = Search'
  { -- | Defines one or more numeric expressions that can be used to sort results
    -- or specify search or filter criteria. You can also specify expressions
    -- as return fields.
    --
    -- You specify the expressions in JSON using the form
    -- @{\"EXPRESSIONNAME\":\"EXPRESSION\"}@. You can define and use multiple
    -- expressions in a search request. For example:
    --
    -- @ {\"expression1\":\"_score*rating\", \"expression2\":\"(1\/rank)*year\"} @
    --
    -- For information about the variables, operators, and functions you can
    -- use in expressions, see
    -- <http://docs.aws.amazon.com/cloudsearch/latest/developerguide/configuring-expressions.html#writing-expressions Writing Expressions>
    -- in the /Amazon CloudSearch Developer Guide/.
    Search -> Maybe Text
expr :: Prelude.Maybe Prelude.Text,
    -- | Retrieves a cursor value you can use to page through large result sets.
    -- Use the @size@ parameter to control the number of hits to include in
    -- each response. You can specify either the @cursor@ or @start@ parameter
    -- in a request; they are mutually exclusive. To get the first cursor, set
    -- the cursor value to @initial@. In subsequent requests, specify the
    -- cursor value returned in the hits section of the response.
    --
    -- For more information, see
    -- <http://docs.aws.amazon.com/cloudsearch/latest/developerguide/paginating-results.html Paginating Results>
    -- in the /Amazon CloudSearch Developer Guide/.
    Search -> Maybe Text
cursor :: Prelude.Maybe Prelude.Text,
    -- | Specifies the field and expression values to include in the response.
    -- Multiple fields or expressions are specified as a comma-separated list.
    -- By default, a search response includes all return enabled fields
    -- (@_all_fields@). To return only the document IDs for the matching
    -- documents, specify @_no_fields@. To retrieve the relevance score
    -- calculated for each document, specify @_score@.
    Search -> Maybe Text
return' :: Prelude.Maybe Prelude.Text,
    -- | Configures options for the query parser specified in the @queryParser@
    -- parameter. You specify the options in JSON using the following form
    -- @{\"OPTION1\":\"VALUE1\",\"OPTION2\":VALUE2\"...\"OPTIONN\":\"VALUEN\"}.@
    --
    -- The options you can configure vary according to which parser you use:
    --
    -- -   @defaultOperator@: The default operator used to combine individual
    --     terms in the search string. For example: @defaultOperator: \'or\'@.
    --     For the @dismax@ parser, you specify a percentage that represents
    --     the percentage of terms in the search string (rounded down) that
    --     must match, rather than a default operator. A value of @0%@ is the
    --     equivalent to OR, and a value of @100%@ is equivalent to AND. The
    --     percentage must be specified as a value in the range 0-100 followed
    --     by the percent (%) symbol. For example, @defaultOperator: 50%@.
    --     Valid values: @and@, @or@, a percentage in the range 0%-100%
    --     (@dismax@). Default: @and@ (@simple@, @structured@, @lucene@) or
    --     @100@ (@dismax@). Valid for: @simple@, @structured@, @lucene@, and
    --     @dismax@.
    -- -   @fields@: An array of the fields to search when no fields are
    --     specified in a search. If no fields are specified in a search and
    --     this option is not specified, all text and text-array fields are
    --     searched. You can specify a weight for each field to control the
    --     relative importance of each field when Amazon CloudSearch calculates
    --     relevance scores. To specify a field weight, append a caret (@^@)
    --     symbol and the weight to the field name. For example, to boost the
    --     importance of the @title@ field over the @description@ field you
    --     could specify: @\"fields\":[\"title^5\",\"description\"]@. Valid
    --     values: The name of any configured field and an optional numeric
    --     value greater than zero. Default: All @text@ and @text-array@
    --     fields. Valid for: @simple@, @structured@, @lucene@, and @dismax@.
    -- -   @operators@: An array of the operators or special characters you
    --     want to disable for the simple query parser. If you disable the
    --     @and@, @or@, or @not@ operators, the corresponding operators (@+@,
    --     @|@, @-@) have no special meaning and are dropped from the search
    --     string. Similarly, disabling @prefix@ disables the wildcard operator
    --     (@*@) and disabling @phrase@ disables the ability to search for
    --     phrases by enclosing phrases in double quotes. Disabling precedence
    --     disables the ability to control order of precedence using
    --     parentheses. Disabling @near@ disables the ability to use the ~
    --     operator to perform a sloppy phrase search. Disabling the @fuzzy@
    --     operator disables the ability to use the ~ operator to perform a
    --     fuzzy search. @escape@ disables the ability to use a backslash
    --     (@\\@) to escape special characters within the search string.
    --     Disabling whitespace is an advanced option that prevents the parser
    --     from tokenizing on whitespace, which can be useful for Vietnamese.
    --     (It prevents Vietnamese words from being split incorrectly.) For
    --     example, you could disable all operators other than the phrase
    --     operator to support just simple term and phrase queries:
    --     @\"operators\":[\"and\",\"not\",\"or\", \"prefix\"]@. Valid values:
    --     @and@, @escape@, @fuzzy@, @near@, @not@, @or@, @phrase@,
    --     @precedence@, @prefix@, @whitespace@. Default: All operators and
    --     special characters are enabled. Valid for: @simple@.
    -- -   @phraseFields@: An array of the @text@ or @text-array@ fields you
    --     want to use for phrase searches. When the terms in the search string
    --     appear in close proximity within a field, the field scores higher.
    --     You can specify a weight for each field to boost that score. The
    --     @phraseSlop@ option controls how much the matches can deviate from
    --     the search string and still be boosted. To specify a field weight,
    --     append a caret (@^@) symbol and the weight to the field name. For
    --     example, to boost phrase matches in the @title@ field over the
    --     @abstract@ field, you could specify:
    --     @\"phraseFields\":[\"title^3\", \"plot\"]@ Valid values: The name of
    --     any @text@ or @text-array@ field and an optional numeric value
    --     greater than zero. Default: No fields. If you don\'t specify any
    --     fields with @phraseFields@, proximity scoring is disabled even if
    --     @phraseSlop@ is specified. Valid for: @dismax@.
    -- -   @phraseSlop@: An integer value that specifies how much matches can
    --     deviate from the search phrase and still be boosted according to the
    --     weights specified in the @phraseFields@ option; for example,
    --     @phraseSlop: 2@. You must also specify @phraseFields@ to enable
    --     proximity scoring. Valid values: positive integers. Default: 0.
    --     Valid for: @dismax@.
    -- -   @explicitPhraseSlop@: An integer value that specifies how much a
    --     match can deviate from the search phrase when the phrase is enclosed
    --     in double quotes in the search string. (Phrases that exceed this
    --     proximity distance are not considered a match.) For example, to
    --     specify a slop of three for dismax phrase queries, you would specify
    --     @\"explicitPhraseSlop\":3@. Valid values: positive integers.
    --     Default: 0. Valid for: @dismax@.
    -- -   @tieBreaker@: When a term in the search string is found in a
    --     document\'s field, a score is calculated for that field based on how
    --     common the word is in that field compared to other documents. If the
    --     term occurs in multiple fields within a document, by default only
    --     the highest scoring field contributes to the document\'s overall
    --     score. You can specify a @tieBreaker@ value to enable the matches in
    --     lower-scoring fields to contribute to the document\'s score. That
    --     way, if two documents have the same max field score for a particular
    --     term, the score for the document that has matches in more fields
    --     will be higher. The formula for calculating the score with a
    --     tieBreaker is
    --     @(max field score) + (tieBreaker) * (sum of the scores for the rest of the matching fields)@.
    --     Set @tieBreaker@ to 0 to disregard all but the highest scoring field
    --     (pure max): @\"tieBreaker\":0@. Set to 1 to sum the scores from all
    --     fields (pure sum): @\"tieBreaker\":1@. Valid values: 0.0 to 1.0.
    --     Default: 0.0. Valid for: @dismax@.
    Search -> Maybe Text
queryOptions :: Prelude.Maybe Prelude.Text,
    -- | Specifies a structured query that filters the results of a search
    -- without affecting how the results are scored and sorted. You use
    -- @filterQuery@ in conjunction with the @query@ parameter to filter the
    -- documents that match the constraints specified in the @query@ parameter.
    -- Specifying a filter controls only which matching documents are included
    -- in the results, it has no effect on how they are scored and sorted. The
    -- @filterQuery@ parameter supports the full structured query syntax.
    --
    -- For more information about using filters, see
    -- <http://docs.aws.amazon.com/cloudsearch/latest/developerguide/filtering-results.html Filtering Matching Documents>
    -- in the /Amazon CloudSearch Developer Guide/.
    Search -> Maybe Text
filterQuery :: Prelude.Maybe Prelude.Text,
    -- | Specifies the maximum number of search hits to include in the response.
    Search -> Maybe Integer
size :: Prelude.Maybe Prelude.Integer,
    -- | Specifies which query parser to use to process the request. If
    -- @queryParser@ is not specified, Amazon CloudSearch uses the @simple@
    -- query parser.
    --
    -- Amazon CloudSearch supports four query parsers:
    --
    -- -   @simple@: perform simple searches of @text@ and @text-array@ fields.
    --     By default, the @simple@ query parser searches all @text@ and
    --     @text-array@ fields. You can specify which fields to search by with
    --     the @queryOptions@ parameter. If you prefix a search term with a
    --     plus sign (+) documents must contain the term to be considered a
    --     match. (This is the default, unless you configure the default
    --     operator with the @queryOptions@ parameter.) You can use the @-@
    --     (NOT), @|@ (OR), and @*@ (wildcard) operators to exclude particular
    --     terms, find results that match any of the specified terms, or search
    --     for a prefix. To search for a phrase rather than individual terms,
    --     enclose the phrase in double quotes. For more information, see
    --     <http://docs.aws.amazon.com/cloudsearch/latest/developerguide/searching-text.html Searching for Text>
    --     in the /Amazon CloudSearch Developer Guide/.
    -- -   @structured@: perform advanced searches by combining multiple
    --     expressions to define the search criteria. You can also search
    --     within particular fields, search for values and ranges of values,
    --     and use advanced options such as term boosting, @matchall@, and
    --     @near@. For more information, see
    --     <http://docs.aws.amazon.com/cloudsearch/latest/developerguide/searching-compound-queries.html Constructing Compound Queries>
    --     in the /Amazon CloudSearch Developer Guide/.
    -- -   @lucene@: search using the Apache Lucene query parser syntax. For
    --     more information, see
    --     <http://lucene.apache.org/core/4_6_0/queryparser/org/apache/lucene/queryparser/classic/package-summary.html#package_description Apache Lucene Query Parser Syntax>.
    -- -   @dismax@: search using the simplified subset of the Apache Lucene
    --     query parser syntax defined by the DisMax query parser. For more
    --     information, see
    --     <http://wiki.apache.org/solr/DisMaxQParserPlugin#Query_Syntax DisMax Query Parser Syntax>.
    Search -> Maybe QueryParser
queryParser :: Prelude.Maybe QueryParser,
    -- | Specifies the offset of the first search hit you want to return. Note
    -- that the result set is zero-based; the first result is at index 0. You
    -- can specify either the @start@ or @cursor@ parameter in a request, they
    -- are mutually exclusive.
    --
    -- For more information, see
    -- <http://docs.aws.amazon.com/cloudsearch/latest/developerguide/paginating-results.html Paginating Results>
    -- in the /Amazon CloudSearch Developer Guide/.
    Search -> Maybe Integer
start :: Prelude.Maybe Prelude.Integer,
    -- | Retrieves highlights for matches in the specified @text@ or @text-array@
    -- fields. Each specified field must be highlight enabled in the domain
    -- configuration. The fields and options are specified in JSON using the
    -- form
    -- @{\"FIELD\":{\"OPTION\":VALUE,\"OPTION:\"STRING\"},\"FIELD\":{\"OPTION\":VALUE,\"OPTION\":\"STRING\"}}@.
    --
    -- You can specify the following highlight options:
    --
    -- -   @format@: specifies the format of the data in the text field: @text@
    --     or @html@. When data is returned as HTML, all non-alphanumeric
    --     characters are encoded. The default is @html@.
    -- -   @max_phrases@: specifies the maximum number of occurrences of the
    --     search term(s) you want to highlight. By default, the first
    --     occurrence is highlighted.
    -- -   @pre_tag@: specifies the string to prepend to an occurrence of a
    --     search term. The default for HTML highlights is @&lt;em&gt;@. The
    --     default for text highlights is @*@.
    -- -   @post_tag@: specifies the string to append to an occurrence of a
    --     search term. The default for HTML highlights is @&lt;\/em&gt;@. The
    --     default for text highlights is @*@.
    --
    -- If no highlight options are specified for a field, the returned field
    -- text is treated as HTML and the first match is highlighted with emphasis
    -- tags: @&lt;em>search-term&lt;\/em&gt;@.
    --
    -- For example, the following request retrieves highlights for the @actors@
    -- and @title@ fields.
    --
    -- @{ \"actors\": {}, \"title\": {\"format\": \"text\",\"max_phrases\": 2,\"pre_tag\": \"\",\"post_tag\": \"\"} }@
    Search -> Maybe Text
highlight :: Prelude.Maybe Prelude.Text,
    -- | Specifies one or more fields for which to get statistics information.
    -- Each specified field must be facet-enabled in the domain configuration.
    -- The fields are specified in JSON using the form:
    --
    -- @{\"FIELD-A\":{},\"FIELD-B\":{}}@
    --
    -- There are currently no options supported for statistics.
    Search -> Maybe Text
stats :: Prelude.Maybe Prelude.Text,
    -- | Specifies the fields or custom expressions to use to sort the search
    -- results. Multiple fields or expressions are specified as a
    -- comma-separated list. You must specify the sort direction (@asc@ or
    -- @desc@) for each field; for example, @year desc,title asc@. To use a
    -- field to sort results, the field must be sort-enabled in the domain
    -- configuration. Array type fields cannot be used for sorting. If no
    -- @sort@ parameter is specified, results are sorted by their default
    -- relevance scores in descending order: @_score desc@. You can also sort
    -- by document ID (@_id asc@) and version (@_version desc@).
    --
    -- For more information, see
    -- <http://docs.aws.amazon.com/cloudsearch/latest/developerguide/sorting-results.html Sorting Results>
    -- in the /Amazon CloudSearch Developer Guide/.
    Search -> Maybe Text
sort :: Prelude.Maybe Prelude.Text,
    -- | Specifies one or more fields for which to get facet information, and
    -- options that control how the facet information is returned. Each
    -- specified field must be facet-enabled in the domain configuration. The
    -- fields and options are specified in JSON using the form
    -- @{\"FIELD\":{\"OPTION\":VALUE,\"OPTION:\"STRING\"},\"FIELD\":{\"OPTION\":VALUE,\"OPTION\":\"STRING\"}}@.
    --
    -- You can specify the following faceting options:
    --
    -- -   @buckets@ specifies an array of the facet values or ranges to count.
    --     Ranges are specified using the same syntax that you use to search
    --     for a range of values. For more information, see
    --     <http://docs.aws.amazon.com/cloudsearch/latest/developerguide/searching-ranges.html Searching for a Range of Values>
    --     in the /Amazon CloudSearch Developer Guide/. Buckets are returned in
    --     the order they are specified in the request. The @sort@ and @size@
    --     options are not valid if you specify @buckets@.
    --
    -- -   @size@ specifies the maximum number of facets to include in the
    --     results. By default, Amazon CloudSearch returns counts for the top
    --     10. The @size@ parameter is only valid when you specify the @sort@
    --     option; it cannot be used in conjunction with @buckets@.
    --
    -- -   @sort@ specifies how you want to sort the facets in the results:
    --     @bucket@ or @count@. Specify @bucket@ to sort alphabetically or
    --     numerically by facet value (in ascending order). Specify @count@ to
    --     sort by the facet counts computed for each facet value (in
    --     descending order). To retrieve facet counts for particular values or
    --     ranges of values, use the @buckets@ option instead of @sort@.
    --
    -- If no facet options are specified, facet counts are computed for all
    -- field values, the facets are sorted by facet count, and the top 10
    -- facets are returned in the results.
    --
    -- To count particular buckets of values, use the @buckets@ option. For
    -- example, the following request uses the @buckets@ option to calculate
    -- and return facet counts by decade.
    --
    -- @ {\"year\":{\"buckets\":[\"[1970,1979]\",\"[1980,1989]\",\"[1990,1999]\",\"[2000,2009]\",\"[2010,}\"]}} @
    --
    -- To sort facets by facet count, use the @count@ option. For example, the
    -- following request sets the @sort@ option to @count@ to sort the facet
    -- values by facet count, with the facet values that have the most matching
    -- documents listed first. Setting the @size@ option to 3 returns only the
    -- top three facet values.
    --
    -- @ {\"year\":{\"sort\":\"count\",\"size\":3}} @
    --
    -- To sort the facets by value, use the @bucket@ option. For example, the
    -- following request sets the @sort@ option to @bucket@ to sort the facet
    -- values numerically by year, with earliest year listed first.
    --
    -- @ {\"year\":{\"sort\":\"bucket\"}} @
    --
    -- For more information, see
    -- <http://docs.aws.amazon.com/cloudsearch/latest/developerguide/faceting.html Getting and Using Facet Information>
    -- in the /Amazon CloudSearch Developer Guide/.
    Search -> Maybe Text
facet :: Prelude.Maybe Prelude.Text,
    -- | Enables partial results to be returned if one or more index partitions
    -- are unavailable. When your search index is partitioned across multiple
    -- search instances, by default Amazon CloudSearch only returns results if
    -- every partition can be queried. This means that the failure of a single
    -- search instance can result in 5xx (internal server) errors. When you
    -- enable partial results, Amazon CloudSearch returns whatever results are
    -- available and includes the percentage of documents searched in the
    -- search results (percent-searched). This enables you to more gracefully
    -- degrade your users\' search experience. For example, rather than
    -- displaying no results, you could display the partial results and a
    -- message indicating that the results might be incomplete due to a
    -- temporary system outage.
    Search -> Maybe Bool
partial :: Prelude.Maybe Prelude.Bool,
    -- | Specifies the search criteria for the request. How you specify the
    -- search criteria depends on the query parser used for the request and the
    -- parser options specified in the @queryOptions@ parameter. By default,
    -- the @simple@ query parser is used to process requests. To use the
    -- @structured@, @lucene@, or @dismax@ query parser, you must also specify
    -- the @queryParser@ parameter.
    --
    -- For more information about specifying search criteria, see
    -- <http://docs.aws.amazon.com/cloudsearch/latest/developerguide/searching.html Searching Your Data>
    -- in the /Amazon CloudSearch Developer Guide/.
    Search -> Text
query :: Prelude.Text
  }
  deriving (Search -> Search -> Bool
(Search -> Search -> Bool)
-> (Search -> Search -> Bool) -> Eq Search
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Search -> Search -> Bool
$c/= :: Search -> Search -> Bool
== :: Search -> Search -> Bool
$c== :: Search -> Search -> Bool
Prelude.Eq, ReadPrec [Search]
ReadPrec Search
Int -> ReadS Search
ReadS [Search]
(Int -> ReadS Search)
-> ReadS [Search]
-> ReadPrec Search
-> ReadPrec [Search]
-> Read Search
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [Search]
$creadListPrec :: ReadPrec [Search]
readPrec :: ReadPrec Search
$creadPrec :: ReadPrec Search
readList :: ReadS [Search]
$creadList :: ReadS [Search]
readsPrec :: Int -> ReadS Search
$creadsPrec :: Int -> ReadS Search
Prelude.Read, Int -> Search -> ShowS
[Search] -> ShowS
Search -> String
(Int -> Search -> ShowS)
-> (Search -> String) -> ([Search] -> ShowS) -> Show Search
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Search] -> ShowS
$cshowList :: [Search] -> ShowS
show :: Search -> String
$cshow :: Search -> String
showsPrec :: Int -> Search -> ShowS
$cshowsPrec :: Int -> Search -> ShowS
Prelude.Show, (forall x. Search -> Rep Search x)
-> (forall x. Rep Search x -> Search) -> Generic Search
forall x. Rep Search x -> Search
forall x. Search -> Rep Search x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Search x -> Search
$cfrom :: forall x. Search -> Rep Search x
Prelude.Generic)

-- |
-- Create a value of 'Search' with all optional fields omitted.
--
-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
--
-- The following record fields are available, with the corresponding lenses provided
-- for backwards compatibility:
--
-- 'expr', 'search_expr' - Defines one or more numeric expressions that can be used to sort results
-- or specify search or filter criteria. You can also specify expressions
-- as return fields.
--
-- You specify the expressions in JSON using the form
-- @{\"EXPRESSIONNAME\":\"EXPRESSION\"}@. You can define and use multiple
-- expressions in a search request. For example:
--
-- @ {\"expression1\":\"_score*rating\", \"expression2\":\"(1\/rank)*year\"} @
--
-- For information about the variables, operators, and functions you can
-- use in expressions, see
-- <http://docs.aws.amazon.com/cloudsearch/latest/developerguide/configuring-expressions.html#writing-expressions Writing Expressions>
-- in the /Amazon CloudSearch Developer Guide/.
--
-- 'cursor', 'search_cursor' - Retrieves a cursor value you can use to page through large result sets.
-- Use the @size@ parameter to control the number of hits to include in
-- each response. You can specify either the @cursor@ or @start@ parameter
-- in a request; they are mutually exclusive. To get the first cursor, set
-- the cursor value to @initial@. In subsequent requests, specify the
-- cursor value returned in the hits section of the response.
--
-- For more information, see
-- <http://docs.aws.amazon.com/cloudsearch/latest/developerguide/paginating-results.html Paginating Results>
-- in the /Amazon CloudSearch Developer Guide/.
--
-- 'return'', 'search_return' - Specifies the field and expression values to include in the response.
-- Multiple fields or expressions are specified as a comma-separated list.
-- By default, a search response includes all return enabled fields
-- (@_all_fields@). To return only the document IDs for the matching
-- documents, specify @_no_fields@. To retrieve the relevance score
-- calculated for each document, specify @_score@.
--
-- 'queryOptions', 'search_queryOptions' - Configures options for the query parser specified in the @queryParser@
-- parameter. You specify the options in JSON using the following form
-- @{\"OPTION1\":\"VALUE1\",\"OPTION2\":VALUE2\"...\"OPTIONN\":\"VALUEN\"}.@
--
-- The options you can configure vary according to which parser you use:
--
-- -   @defaultOperator@: The default operator used to combine individual
--     terms in the search string. For example: @defaultOperator: \'or\'@.
--     For the @dismax@ parser, you specify a percentage that represents
--     the percentage of terms in the search string (rounded down) that
--     must match, rather than a default operator. A value of @0%@ is the
--     equivalent to OR, and a value of @100%@ is equivalent to AND. The
--     percentage must be specified as a value in the range 0-100 followed
--     by the percent (%) symbol. For example, @defaultOperator: 50%@.
--     Valid values: @and@, @or@, a percentage in the range 0%-100%
--     (@dismax@). Default: @and@ (@simple@, @structured@, @lucene@) or
--     @100@ (@dismax@). Valid for: @simple@, @structured@, @lucene@, and
--     @dismax@.
-- -   @fields@: An array of the fields to search when no fields are
--     specified in a search. If no fields are specified in a search and
--     this option is not specified, all text and text-array fields are
--     searched. You can specify a weight for each field to control the
--     relative importance of each field when Amazon CloudSearch calculates
--     relevance scores. To specify a field weight, append a caret (@^@)
--     symbol and the weight to the field name. For example, to boost the
--     importance of the @title@ field over the @description@ field you
--     could specify: @\"fields\":[\"title^5\",\"description\"]@. Valid
--     values: The name of any configured field and an optional numeric
--     value greater than zero. Default: All @text@ and @text-array@
--     fields. Valid for: @simple@, @structured@, @lucene@, and @dismax@.
-- -   @operators@: An array of the operators or special characters you
--     want to disable for the simple query parser. If you disable the
--     @and@, @or@, or @not@ operators, the corresponding operators (@+@,
--     @|@, @-@) have no special meaning and are dropped from the search
--     string. Similarly, disabling @prefix@ disables the wildcard operator
--     (@*@) and disabling @phrase@ disables the ability to search for
--     phrases by enclosing phrases in double quotes. Disabling precedence
--     disables the ability to control order of precedence using
--     parentheses. Disabling @near@ disables the ability to use the ~
--     operator to perform a sloppy phrase search. Disabling the @fuzzy@
--     operator disables the ability to use the ~ operator to perform a
--     fuzzy search. @escape@ disables the ability to use a backslash
--     (@\\@) to escape special characters within the search string.
--     Disabling whitespace is an advanced option that prevents the parser
--     from tokenizing on whitespace, which can be useful for Vietnamese.
--     (It prevents Vietnamese words from being split incorrectly.) For
--     example, you could disable all operators other than the phrase
--     operator to support just simple term and phrase queries:
--     @\"operators\":[\"and\",\"not\",\"or\", \"prefix\"]@. Valid values:
--     @and@, @escape@, @fuzzy@, @near@, @not@, @or@, @phrase@,
--     @precedence@, @prefix@, @whitespace@. Default: All operators and
--     special characters are enabled. Valid for: @simple@.
-- -   @phraseFields@: An array of the @text@ or @text-array@ fields you
--     want to use for phrase searches. When the terms in the search string
--     appear in close proximity within a field, the field scores higher.
--     You can specify a weight for each field to boost that score. The
--     @phraseSlop@ option controls how much the matches can deviate from
--     the search string and still be boosted. To specify a field weight,
--     append a caret (@^@) symbol and the weight to the field name. For
--     example, to boost phrase matches in the @title@ field over the
--     @abstract@ field, you could specify:
--     @\"phraseFields\":[\"title^3\", \"plot\"]@ Valid values: The name of
--     any @text@ or @text-array@ field and an optional numeric value
--     greater than zero. Default: No fields. If you don\'t specify any
--     fields with @phraseFields@, proximity scoring is disabled even if
--     @phraseSlop@ is specified. Valid for: @dismax@.
-- -   @phraseSlop@: An integer value that specifies how much matches can
--     deviate from the search phrase and still be boosted according to the
--     weights specified in the @phraseFields@ option; for example,
--     @phraseSlop: 2@. You must also specify @phraseFields@ to enable
--     proximity scoring. Valid values: positive integers. Default: 0.
--     Valid for: @dismax@.
-- -   @explicitPhraseSlop@: An integer value that specifies how much a
--     match can deviate from the search phrase when the phrase is enclosed
--     in double quotes in the search string. (Phrases that exceed this
--     proximity distance are not considered a match.) For example, to
--     specify a slop of three for dismax phrase queries, you would specify
--     @\"explicitPhraseSlop\":3@. Valid values: positive integers.
--     Default: 0. Valid for: @dismax@.
-- -   @tieBreaker@: When a term in the search string is found in a
--     document\'s field, a score is calculated for that field based on how
--     common the word is in that field compared to other documents. If the
--     term occurs in multiple fields within a document, by default only
--     the highest scoring field contributes to the document\'s overall
--     score. You can specify a @tieBreaker@ value to enable the matches in
--     lower-scoring fields to contribute to the document\'s score. That
--     way, if two documents have the same max field score for a particular
--     term, the score for the document that has matches in more fields
--     will be higher. The formula for calculating the score with a
--     tieBreaker is
--     @(max field score) + (tieBreaker) * (sum of the scores for the rest of the matching fields)@.
--     Set @tieBreaker@ to 0 to disregard all but the highest scoring field
--     (pure max): @\"tieBreaker\":0@. Set to 1 to sum the scores from all
--     fields (pure sum): @\"tieBreaker\":1@. Valid values: 0.0 to 1.0.
--     Default: 0.0. Valid for: @dismax@.
--
-- 'filterQuery', 'search_filterQuery' - Specifies a structured query that filters the results of a search
-- without affecting how the results are scored and sorted. You use
-- @filterQuery@ in conjunction with the @query@ parameter to filter the
-- documents that match the constraints specified in the @query@ parameter.
-- Specifying a filter controls only which matching documents are included
-- in the results, it has no effect on how they are scored and sorted. The
-- @filterQuery@ parameter supports the full structured query syntax.
--
-- For more information about using filters, see
-- <http://docs.aws.amazon.com/cloudsearch/latest/developerguide/filtering-results.html Filtering Matching Documents>
-- in the /Amazon CloudSearch Developer Guide/.
--
-- 'size', 'search_size' - Specifies the maximum number of search hits to include in the response.
--
-- 'queryParser', 'search_queryParser' - Specifies which query parser to use to process the request. If
-- @queryParser@ is not specified, Amazon CloudSearch uses the @simple@
-- query parser.
--
-- Amazon CloudSearch supports four query parsers:
--
-- -   @simple@: perform simple searches of @text@ and @text-array@ fields.
--     By default, the @simple@ query parser searches all @text@ and
--     @text-array@ fields. You can specify which fields to search by with
--     the @queryOptions@ parameter. If you prefix a search term with a
--     plus sign (+) documents must contain the term to be considered a
--     match. (This is the default, unless you configure the default
--     operator with the @queryOptions@ parameter.) You can use the @-@
--     (NOT), @|@ (OR), and @*@ (wildcard) operators to exclude particular
--     terms, find results that match any of the specified terms, or search
--     for a prefix. To search for a phrase rather than individual terms,
--     enclose the phrase in double quotes. For more information, see
--     <http://docs.aws.amazon.com/cloudsearch/latest/developerguide/searching-text.html Searching for Text>
--     in the /Amazon CloudSearch Developer Guide/.
-- -   @structured@: perform advanced searches by combining multiple
--     expressions to define the search criteria. You can also search
--     within particular fields, search for values and ranges of values,
--     and use advanced options such as term boosting, @matchall@, and
--     @near@. For more information, see
--     <http://docs.aws.amazon.com/cloudsearch/latest/developerguide/searching-compound-queries.html Constructing Compound Queries>
--     in the /Amazon CloudSearch Developer Guide/.
-- -   @lucene@: search using the Apache Lucene query parser syntax. For
--     more information, see
--     <http://lucene.apache.org/core/4_6_0/queryparser/org/apache/lucene/queryparser/classic/package-summary.html#package_description Apache Lucene Query Parser Syntax>.
-- -   @dismax@: search using the simplified subset of the Apache Lucene
--     query parser syntax defined by the DisMax query parser. For more
--     information, see
--     <http://wiki.apache.org/solr/DisMaxQParserPlugin#Query_Syntax DisMax Query Parser Syntax>.
--
-- 'start', 'search_start' - Specifies the offset of the first search hit you want to return. Note
-- that the result set is zero-based; the first result is at index 0. You
-- can specify either the @start@ or @cursor@ parameter in a request, they
-- are mutually exclusive.
--
-- For more information, see
-- <http://docs.aws.amazon.com/cloudsearch/latest/developerguide/paginating-results.html Paginating Results>
-- in the /Amazon CloudSearch Developer Guide/.
--
-- 'highlight', 'search_highlight' - Retrieves highlights for matches in the specified @text@ or @text-array@
-- fields. Each specified field must be highlight enabled in the domain
-- configuration. The fields and options are specified in JSON using the
-- form
-- @{\"FIELD\":{\"OPTION\":VALUE,\"OPTION:\"STRING\"},\"FIELD\":{\"OPTION\":VALUE,\"OPTION\":\"STRING\"}}@.
--
-- You can specify the following highlight options:
--
-- -   @format@: specifies the format of the data in the text field: @text@
--     or @html@. When data is returned as HTML, all non-alphanumeric
--     characters are encoded. The default is @html@.
-- -   @max_phrases@: specifies the maximum number of occurrences of the
--     search term(s) you want to highlight. By default, the first
--     occurrence is highlighted.
-- -   @pre_tag@: specifies the string to prepend to an occurrence of a
--     search term. The default for HTML highlights is @&lt;em&gt;@. The
--     default for text highlights is @*@.
-- -   @post_tag@: specifies the string to append to an occurrence of a
--     search term. The default for HTML highlights is @&lt;\/em&gt;@. The
--     default for text highlights is @*@.
--
-- If no highlight options are specified for a field, the returned field
-- text is treated as HTML and the first match is highlighted with emphasis
-- tags: @&lt;em>search-term&lt;\/em&gt;@.
--
-- For example, the following request retrieves highlights for the @actors@
-- and @title@ fields.
--
-- @{ \"actors\": {}, \"title\": {\"format\": \"text\",\"max_phrases\": 2,\"pre_tag\": \"\",\"post_tag\": \"\"} }@
--
-- 'stats', 'search_stats' - Specifies one or more fields for which to get statistics information.
-- Each specified field must be facet-enabled in the domain configuration.
-- The fields are specified in JSON using the form:
--
-- @{\"FIELD-A\":{},\"FIELD-B\":{}}@
--
-- There are currently no options supported for statistics.
--
-- 'sort', 'search_sort' - Specifies the fields or custom expressions to use to sort the search
-- results. Multiple fields or expressions are specified as a
-- comma-separated list. You must specify the sort direction (@asc@ or
-- @desc@) for each field; for example, @year desc,title asc@. To use a
-- field to sort results, the field must be sort-enabled in the domain
-- configuration. Array type fields cannot be used for sorting. If no
-- @sort@ parameter is specified, results are sorted by their default
-- relevance scores in descending order: @_score desc@. You can also sort
-- by document ID (@_id asc@) and version (@_version desc@).
--
-- For more information, see
-- <http://docs.aws.amazon.com/cloudsearch/latest/developerguide/sorting-results.html Sorting Results>
-- in the /Amazon CloudSearch Developer Guide/.
--
-- 'facet', 'search_facet' - Specifies one or more fields for which to get facet information, and
-- options that control how the facet information is returned. Each
-- specified field must be facet-enabled in the domain configuration. The
-- fields and options are specified in JSON using the form
-- @{\"FIELD\":{\"OPTION\":VALUE,\"OPTION:\"STRING\"},\"FIELD\":{\"OPTION\":VALUE,\"OPTION\":\"STRING\"}}@.
--
-- You can specify the following faceting options:
--
-- -   @buckets@ specifies an array of the facet values or ranges to count.
--     Ranges are specified using the same syntax that you use to search
--     for a range of values. For more information, see
--     <http://docs.aws.amazon.com/cloudsearch/latest/developerguide/searching-ranges.html Searching for a Range of Values>
--     in the /Amazon CloudSearch Developer Guide/. Buckets are returned in
--     the order they are specified in the request. The @sort@ and @size@
--     options are not valid if you specify @buckets@.
--
-- -   @size@ specifies the maximum number of facets to include in the
--     results. By default, Amazon CloudSearch returns counts for the top
--     10. The @size@ parameter is only valid when you specify the @sort@
--     option; it cannot be used in conjunction with @buckets@.
--
-- -   @sort@ specifies how you want to sort the facets in the results:
--     @bucket@ or @count@. Specify @bucket@ to sort alphabetically or
--     numerically by facet value (in ascending order). Specify @count@ to
--     sort by the facet counts computed for each facet value (in
--     descending order). To retrieve facet counts for particular values or
--     ranges of values, use the @buckets@ option instead of @sort@.
--
-- If no facet options are specified, facet counts are computed for all
-- field values, the facets are sorted by facet count, and the top 10
-- facets are returned in the results.
--
-- To count particular buckets of values, use the @buckets@ option. For
-- example, the following request uses the @buckets@ option to calculate
-- and return facet counts by decade.
--
-- @ {\"year\":{\"buckets\":[\"[1970,1979]\",\"[1980,1989]\",\"[1990,1999]\",\"[2000,2009]\",\"[2010,}\"]}} @
--
-- To sort facets by facet count, use the @count@ option. For example, the
-- following request sets the @sort@ option to @count@ to sort the facet
-- values by facet count, with the facet values that have the most matching
-- documents listed first. Setting the @size@ option to 3 returns only the
-- top three facet values.
--
-- @ {\"year\":{\"sort\":\"count\",\"size\":3}} @
--
-- To sort the facets by value, use the @bucket@ option. For example, the
-- following request sets the @sort@ option to @bucket@ to sort the facet
-- values numerically by year, with earliest year listed first.
--
-- @ {\"year\":{\"sort\":\"bucket\"}} @
--
-- For more information, see
-- <http://docs.aws.amazon.com/cloudsearch/latest/developerguide/faceting.html Getting and Using Facet Information>
-- in the /Amazon CloudSearch Developer Guide/.
--
-- 'partial', 'search_partial' - Enables partial results to be returned if one or more index partitions
-- are unavailable. When your search index is partitioned across multiple
-- search instances, by default Amazon CloudSearch only returns results if
-- every partition can be queried. This means that the failure of a single
-- search instance can result in 5xx (internal server) errors. When you
-- enable partial results, Amazon CloudSearch returns whatever results are
-- available and includes the percentage of documents searched in the
-- search results (percent-searched). This enables you to more gracefully
-- degrade your users\' search experience. For example, rather than
-- displaying no results, you could display the partial results and a
-- message indicating that the results might be incomplete due to a
-- temporary system outage.
--
-- 'query', 'search_query' - Specifies the search criteria for the request. How you specify the
-- search criteria depends on the query parser used for the request and the
-- parser options specified in the @queryOptions@ parameter. By default,
-- the @simple@ query parser is used to process requests. To use the
-- @structured@, @lucene@, or @dismax@ query parser, you must also specify
-- the @queryParser@ parameter.
--
-- For more information about specifying search criteria, see
-- <http://docs.aws.amazon.com/cloudsearch/latest/developerguide/searching.html Searching Your Data>
-- in the /Amazon CloudSearch Developer Guide/.
newSearch ::
  -- | 'query'
  Prelude.Text ->
  Search
newSearch :: Text -> Search
newSearch Text
pQuery_ =
  Search' :: Maybe Text
-> Maybe Text
-> Maybe Text
-> Maybe Text
-> Maybe Text
-> Maybe Integer
-> Maybe QueryParser
-> Maybe Integer
-> Maybe Text
-> Maybe Text
-> Maybe Text
-> Maybe Text
-> Maybe Bool
-> Text
-> Search
Search'
    { $sel:expr:Search' :: Maybe Text
expr = Maybe Text
forall a. Maybe a
Prelude.Nothing,
      $sel:cursor:Search' :: Maybe Text
cursor = Maybe Text
forall a. Maybe a
Prelude.Nothing,
      $sel:return':Search' :: Maybe Text
return' = Maybe Text
forall a. Maybe a
Prelude.Nothing,
      $sel:queryOptions:Search' :: Maybe Text
queryOptions = Maybe Text
forall a. Maybe a
Prelude.Nothing,
      $sel:filterQuery:Search' :: Maybe Text
filterQuery = Maybe Text
forall a. Maybe a
Prelude.Nothing,
      $sel:size:Search' :: Maybe Integer
size = Maybe Integer
forall a. Maybe a
Prelude.Nothing,
      $sel:queryParser:Search' :: Maybe QueryParser
queryParser = Maybe QueryParser
forall a. Maybe a
Prelude.Nothing,
      $sel:start:Search' :: Maybe Integer
start = Maybe Integer
forall a. Maybe a
Prelude.Nothing,
      $sel:highlight:Search' :: Maybe Text
highlight = Maybe Text
forall a. Maybe a
Prelude.Nothing,
      $sel:stats:Search' :: Maybe Text
stats = Maybe Text
forall a. Maybe a
Prelude.Nothing,
      $sel:sort:Search' :: Maybe Text
sort = Maybe Text
forall a. Maybe a
Prelude.Nothing,
      $sel:facet:Search' :: Maybe Text
facet = Maybe Text
forall a. Maybe a
Prelude.Nothing,
      $sel:partial:Search' :: Maybe Bool
partial = Maybe Bool
forall a. Maybe a
Prelude.Nothing,
      $sel:query:Search' :: Text
query = Text
pQuery_
    }

-- | Defines one or more numeric expressions that can be used to sort results
-- or specify search or filter criteria. You can also specify expressions
-- as return fields.
--
-- You specify the expressions in JSON using the form
-- @{\"EXPRESSIONNAME\":\"EXPRESSION\"}@. You can define and use multiple
-- expressions in a search request. For example:
--
-- @ {\"expression1\":\"_score*rating\", \"expression2\":\"(1\/rank)*year\"} @
--
-- For information about the variables, operators, and functions you can
-- use in expressions, see
-- <http://docs.aws.amazon.com/cloudsearch/latest/developerguide/configuring-expressions.html#writing-expressions Writing Expressions>
-- in the /Amazon CloudSearch Developer Guide/.
search_expr :: Lens.Lens' Search (Prelude.Maybe Prelude.Text)
search_expr :: (Maybe Text -> f (Maybe Text)) -> Search -> f Search
search_expr = (Search -> Maybe Text)
-> (Search -> Maybe Text -> Search)
-> Lens Search Search (Maybe Text) (Maybe Text)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Search' {Maybe Text
expr :: Maybe Text
$sel:expr:Search' :: Search -> Maybe Text
expr} -> Maybe Text
expr) (\s :: Search
s@Search' {} Maybe Text
a -> Search
s {$sel:expr:Search' :: Maybe Text
expr = Maybe Text
a} :: Search)

-- | Retrieves a cursor value you can use to page through large result sets.
-- Use the @size@ parameter to control the number of hits to include in
-- each response. You can specify either the @cursor@ or @start@ parameter
-- in a request; they are mutually exclusive. To get the first cursor, set
-- the cursor value to @initial@. In subsequent requests, specify the
-- cursor value returned in the hits section of the response.
--
-- For more information, see
-- <http://docs.aws.amazon.com/cloudsearch/latest/developerguide/paginating-results.html Paginating Results>
-- in the /Amazon CloudSearch Developer Guide/.
search_cursor :: Lens.Lens' Search (Prelude.Maybe Prelude.Text)
search_cursor :: (Maybe Text -> f (Maybe Text)) -> Search -> f Search
search_cursor = (Search -> Maybe Text)
-> (Search -> Maybe Text -> Search)
-> Lens Search Search (Maybe Text) (Maybe Text)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Search' {Maybe Text
cursor :: Maybe Text
$sel:cursor:Search' :: Search -> Maybe Text
cursor} -> Maybe Text
cursor) (\s :: Search
s@Search' {} Maybe Text
a -> Search
s {$sel:cursor:Search' :: Maybe Text
cursor = Maybe Text
a} :: Search)

-- | Specifies the field and expression values to include in the response.
-- Multiple fields or expressions are specified as a comma-separated list.
-- By default, a search response includes all return enabled fields
-- (@_all_fields@). To return only the document IDs for the matching
-- documents, specify @_no_fields@. To retrieve the relevance score
-- calculated for each document, specify @_score@.
search_return :: Lens.Lens' Search (Prelude.Maybe Prelude.Text)
search_return :: (Maybe Text -> f (Maybe Text)) -> Search -> f Search
search_return = (Search -> Maybe Text)
-> (Search -> Maybe Text -> Search)
-> Lens Search Search (Maybe Text) (Maybe Text)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Search' {Maybe Text
return' :: Maybe Text
$sel:return':Search' :: Search -> Maybe Text
return'} -> Maybe Text
return') (\s :: Search
s@Search' {} Maybe Text
a -> Search
s {$sel:return':Search' :: Maybe Text
return' = Maybe Text
a} :: Search)

-- | Configures options for the query parser specified in the @queryParser@
-- parameter. You specify the options in JSON using the following form
-- @{\"OPTION1\":\"VALUE1\",\"OPTION2\":VALUE2\"...\"OPTIONN\":\"VALUEN\"}.@
--
-- The options you can configure vary according to which parser you use:
--
-- -   @defaultOperator@: The default operator used to combine individual
--     terms in the search string. For example: @defaultOperator: \'or\'@.
--     For the @dismax@ parser, you specify a percentage that represents
--     the percentage of terms in the search string (rounded down) that
--     must match, rather than a default operator. A value of @0%@ is the
--     equivalent to OR, and a value of @100%@ is equivalent to AND. The
--     percentage must be specified as a value in the range 0-100 followed
--     by the percent (%) symbol. For example, @defaultOperator: 50%@.
--     Valid values: @and@, @or@, a percentage in the range 0%-100%
--     (@dismax@). Default: @and@ (@simple@, @structured@, @lucene@) or
--     @100@ (@dismax@). Valid for: @simple@, @structured@, @lucene@, and
--     @dismax@.
-- -   @fields@: An array of the fields to search when no fields are
--     specified in a search. If no fields are specified in a search and
--     this option is not specified, all text and text-array fields are
--     searched. You can specify a weight for each field to control the
--     relative importance of each field when Amazon CloudSearch calculates
--     relevance scores. To specify a field weight, append a caret (@^@)
--     symbol and the weight to the field name. For example, to boost the
--     importance of the @title@ field over the @description@ field you
--     could specify: @\"fields\":[\"title^5\",\"description\"]@. Valid
--     values: The name of any configured field and an optional numeric
--     value greater than zero. Default: All @text@ and @text-array@
--     fields. Valid for: @simple@, @structured@, @lucene@, and @dismax@.
-- -   @operators@: An array of the operators or special characters you
--     want to disable for the simple query parser. If you disable the
--     @and@, @or@, or @not@ operators, the corresponding operators (@+@,
--     @|@, @-@) have no special meaning and are dropped from the search
--     string. Similarly, disabling @prefix@ disables the wildcard operator
--     (@*@) and disabling @phrase@ disables the ability to search for
--     phrases by enclosing phrases in double quotes. Disabling precedence
--     disables the ability to control order of precedence using
--     parentheses. Disabling @near@ disables the ability to use the ~
--     operator to perform a sloppy phrase search. Disabling the @fuzzy@
--     operator disables the ability to use the ~ operator to perform a
--     fuzzy search. @escape@ disables the ability to use a backslash
--     (@\\@) to escape special characters within the search string.
--     Disabling whitespace is an advanced option that prevents the parser
--     from tokenizing on whitespace, which can be useful for Vietnamese.
--     (It prevents Vietnamese words from being split incorrectly.) For
--     example, you could disable all operators other than the phrase
--     operator to support just simple term and phrase queries:
--     @\"operators\":[\"and\",\"not\",\"or\", \"prefix\"]@. Valid values:
--     @and@, @escape@, @fuzzy@, @near@, @not@, @or@, @phrase@,
--     @precedence@, @prefix@, @whitespace@. Default: All operators and
--     special characters are enabled. Valid for: @simple@.
-- -   @phraseFields@: An array of the @text@ or @text-array@ fields you
--     want to use for phrase searches. When the terms in the search string
--     appear in close proximity within a field, the field scores higher.
--     You can specify a weight for each field to boost that score. The
--     @phraseSlop@ option controls how much the matches can deviate from
--     the search string and still be boosted. To specify a field weight,
--     append a caret (@^@) symbol and the weight to the field name. For
--     example, to boost phrase matches in the @title@ field over the
--     @abstract@ field, you could specify:
--     @\"phraseFields\":[\"title^3\", \"plot\"]@ Valid values: The name of
--     any @text@ or @text-array@ field and an optional numeric value
--     greater than zero. Default: No fields. If you don\'t specify any
--     fields with @phraseFields@, proximity scoring is disabled even if
--     @phraseSlop@ is specified. Valid for: @dismax@.
-- -   @phraseSlop@: An integer value that specifies how much matches can
--     deviate from the search phrase and still be boosted according to the
--     weights specified in the @phraseFields@ option; for example,
--     @phraseSlop: 2@. You must also specify @phraseFields@ to enable
--     proximity scoring. Valid values: positive integers. Default: 0.
--     Valid for: @dismax@.
-- -   @explicitPhraseSlop@: An integer value that specifies how much a
--     match can deviate from the search phrase when the phrase is enclosed
--     in double quotes in the search string. (Phrases that exceed this
--     proximity distance are not considered a match.) For example, to
--     specify a slop of three for dismax phrase queries, you would specify
--     @\"explicitPhraseSlop\":3@. Valid values: positive integers.
--     Default: 0. Valid for: @dismax@.
-- -   @tieBreaker@: When a term in the search string is found in a
--     document\'s field, a score is calculated for that field based on how
--     common the word is in that field compared to other documents. If the
--     term occurs in multiple fields within a document, by default only
--     the highest scoring field contributes to the document\'s overall
--     score. You can specify a @tieBreaker@ value to enable the matches in
--     lower-scoring fields to contribute to the document\'s score. That
--     way, if two documents have the same max field score for a particular
--     term, the score for the document that has matches in more fields
--     will be higher. The formula for calculating the score with a
--     tieBreaker is
--     @(max field score) + (tieBreaker) * (sum of the scores for the rest of the matching fields)@.
--     Set @tieBreaker@ to 0 to disregard all but the highest scoring field
--     (pure max): @\"tieBreaker\":0@. Set to 1 to sum the scores from all
--     fields (pure sum): @\"tieBreaker\":1@. Valid values: 0.0 to 1.0.
--     Default: 0.0. Valid for: @dismax@.
search_queryOptions :: Lens.Lens' Search (Prelude.Maybe Prelude.Text)
search_queryOptions :: (Maybe Text -> f (Maybe Text)) -> Search -> f Search
search_queryOptions = (Search -> Maybe Text)
-> (Search -> Maybe Text -> Search)
-> Lens Search Search (Maybe Text) (Maybe Text)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Search' {Maybe Text
queryOptions :: Maybe Text
$sel:queryOptions:Search' :: Search -> Maybe Text
queryOptions} -> Maybe Text
queryOptions) (\s :: Search
s@Search' {} Maybe Text
a -> Search
s {$sel:queryOptions:Search' :: Maybe Text
queryOptions = Maybe Text
a} :: Search)

-- | Specifies a structured query that filters the results of a search
-- without affecting how the results are scored and sorted. You use
-- @filterQuery@ in conjunction with the @query@ parameter to filter the
-- documents that match the constraints specified in the @query@ parameter.
-- Specifying a filter controls only which matching documents are included
-- in the results, it has no effect on how they are scored and sorted. The
-- @filterQuery@ parameter supports the full structured query syntax.
--
-- For more information about using filters, see
-- <http://docs.aws.amazon.com/cloudsearch/latest/developerguide/filtering-results.html Filtering Matching Documents>
-- in the /Amazon CloudSearch Developer Guide/.
search_filterQuery :: Lens.Lens' Search (Prelude.Maybe Prelude.Text)
search_filterQuery :: (Maybe Text -> f (Maybe Text)) -> Search -> f Search
search_filterQuery = (Search -> Maybe Text)
-> (Search -> Maybe Text -> Search)
-> Lens Search Search (Maybe Text) (Maybe Text)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Search' {Maybe Text
filterQuery :: Maybe Text
$sel:filterQuery:Search' :: Search -> Maybe Text
filterQuery} -> Maybe Text
filterQuery) (\s :: Search
s@Search' {} Maybe Text
a -> Search
s {$sel:filterQuery:Search' :: Maybe Text
filterQuery = Maybe Text
a} :: Search)

-- | Specifies the maximum number of search hits to include in the response.
search_size :: Lens.Lens' Search (Prelude.Maybe Prelude.Integer)
search_size :: (Maybe Integer -> f (Maybe Integer)) -> Search -> f Search
search_size = (Search -> Maybe Integer)
-> (Search -> Maybe Integer -> Search)
-> Lens Search Search (Maybe Integer) (Maybe Integer)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Search' {Maybe Integer
size :: Maybe Integer
$sel:size:Search' :: Search -> Maybe Integer
size} -> Maybe Integer
size) (\s :: Search
s@Search' {} Maybe Integer
a -> Search
s {$sel:size:Search' :: Maybe Integer
size = Maybe Integer
a} :: Search)

-- | Specifies which query parser to use to process the request. If
-- @queryParser@ is not specified, Amazon CloudSearch uses the @simple@
-- query parser.
--
-- Amazon CloudSearch supports four query parsers:
--
-- -   @simple@: perform simple searches of @text@ and @text-array@ fields.
--     By default, the @simple@ query parser searches all @text@ and
--     @text-array@ fields. You can specify which fields to search by with
--     the @queryOptions@ parameter. If you prefix a search term with a
--     plus sign (+) documents must contain the term to be considered a
--     match. (This is the default, unless you configure the default
--     operator with the @queryOptions@ parameter.) You can use the @-@
--     (NOT), @|@ (OR), and @*@ (wildcard) operators to exclude particular
--     terms, find results that match any of the specified terms, or search
--     for a prefix. To search for a phrase rather than individual terms,
--     enclose the phrase in double quotes. For more information, see
--     <http://docs.aws.amazon.com/cloudsearch/latest/developerguide/searching-text.html Searching for Text>
--     in the /Amazon CloudSearch Developer Guide/.
-- -   @structured@: perform advanced searches by combining multiple
--     expressions to define the search criteria. You can also search
--     within particular fields, search for values and ranges of values,
--     and use advanced options such as term boosting, @matchall@, and
--     @near@. For more information, see
--     <http://docs.aws.amazon.com/cloudsearch/latest/developerguide/searching-compound-queries.html Constructing Compound Queries>
--     in the /Amazon CloudSearch Developer Guide/.
-- -   @lucene@: search using the Apache Lucene query parser syntax. For
--     more information, see
--     <http://lucene.apache.org/core/4_6_0/queryparser/org/apache/lucene/queryparser/classic/package-summary.html#package_description Apache Lucene Query Parser Syntax>.
-- -   @dismax@: search using the simplified subset of the Apache Lucene
--     query parser syntax defined by the DisMax query parser. For more
--     information, see
--     <http://wiki.apache.org/solr/DisMaxQParserPlugin#Query_Syntax DisMax Query Parser Syntax>.
search_queryParser :: Lens.Lens' Search (Prelude.Maybe QueryParser)
search_queryParser :: (Maybe QueryParser -> f (Maybe QueryParser)) -> Search -> f Search
search_queryParser = (Search -> Maybe QueryParser)
-> (Search -> Maybe QueryParser -> Search)
-> Lens Search Search (Maybe QueryParser) (Maybe QueryParser)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Search' {Maybe QueryParser
queryParser :: Maybe QueryParser
$sel:queryParser:Search' :: Search -> Maybe QueryParser
queryParser} -> Maybe QueryParser
queryParser) (\s :: Search
s@Search' {} Maybe QueryParser
a -> Search
s {$sel:queryParser:Search' :: Maybe QueryParser
queryParser = Maybe QueryParser
a} :: Search)

-- | Specifies the offset of the first search hit you want to return. Note
-- that the result set is zero-based; the first result is at index 0. You
-- can specify either the @start@ or @cursor@ parameter in a request, they
-- are mutually exclusive.
--
-- For more information, see
-- <http://docs.aws.amazon.com/cloudsearch/latest/developerguide/paginating-results.html Paginating Results>
-- in the /Amazon CloudSearch Developer Guide/.
search_start :: Lens.Lens' Search (Prelude.Maybe Prelude.Integer)
search_start :: (Maybe Integer -> f (Maybe Integer)) -> Search -> f Search
search_start = (Search -> Maybe Integer)
-> (Search -> Maybe Integer -> Search)
-> Lens Search Search (Maybe Integer) (Maybe Integer)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Search' {Maybe Integer
start :: Maybe Integer
$sel:start:Search' :: Search -> Maybe Integer
start} -> Maybe Integer
start) (\s :: Search
s@Search' {} Maybe Integer
a -> Search
s {$sel:start:Search' :: Maybe Integer
start = Maybe Integer
a} :: Search)

-- | Retrieves highlights for matches in the specified @text@ or @text-array@
-- fields. Each specified field must be highlight enabled in the domain
-- configuration. The fields and options are specified in JSON using the
-- form
-- @{\"FIELD\":{\"OPTION\":VALUE,\"OPTION:\"STRING\"},\"FIELD\":{\"OPTION\":VALUE,\"OPTION\":\"STRING\"}}@.
--
-- You can specify the following highlight options:
--
-- -   @format@: specifies the format of the data in the text field: @text@
--     or @html@. When data is returned as HTML, all non-alphanumeric
--     characters are encoded. The default is @html@.
-- -   @max_phrases@: specifies the maximum number of occurrences of the
--     search term(s) you want to highlight. By default, the first
--     occurrence is highlighted.
-- -   @pre_tag@: specifies the string to prepend to an occurrence of a
--     search term. The default for HTML highlights is @&lt;em&gt;@. The
--     default for text highlights is @*@.
-- -   @post_tag@: specifies the string to append to an occurrence of a
--     search term. The default for HTML highlights is @&lt;\/em&gt;@. The
--     default for text highlights is @*@.
--
-- If no highlight options are specified for a field, the returned field
-- text is treated as HTML and the first match is highlighted with emphasis
-- tags: @&lt;em>search-term&lt;\/em&gt;@.
--
-- For example, the following request retrieves highlights for the @actors@
-- and @title@ fields.
--
-- @{ \"actors\": {}, \"title\": {\"format\": \"text\",\"max_phrases\": 2,\"pre_tag\": \"\",\"post_tag\": \"\"} }@
search_highlight :: Lens.Lens' Search (Prelude.Maybe Prelude.Text)
search_highlight :: (Maybe Text -> f (Maybe Text)) -> Search -> f Search
search_highlight = (Search -> Maybe Text)
-> (Search -> Maybe Text -> Search)
-> Lens Search Search (Maybe Text) (Maybe Text)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Search' {Maybe Text
highlight :: Maybe Text
$sel:highlight:Search' :: Search -> Maybe Text
highlight} -> Maybe Text
highlight) (\s :: Search
s@Search' {} Maybe Text
a -> Search
s {$sel:highlight:Search' :: Maybe Text
highlight = Maybe Text
a} :: Search)

-- | Specifies one or more fields for which to get statistics information.
-- Each specified field must be facet-enabled in the domain configuration.
-- The fields are specified in JSON using the form:
--
-- @{\"FIELD-A\":{},\"FIELD-B\":{}}@
--
-- There are currently no options supported for statistics.
search_stats :: Lens.Lens' Search (Prelude.Maybe Prelude.Text)
search_stats :: (Maybe Text -> f (Maybe Text)) -> Search -> f Search
search_stats = (Search -> Maybe Text)
-> (Search -> Maybe Text -> Search)
-> Lens Search Search (Maybe Text) (Maybe Text)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Search' {Maybe Text
stats :: Maybe Text
$sel:stats:Search' :: Search -> Maybe Text
stats} -> Maybe Text
stats) (\s :: Search
s@Search' {} Maybe Text
a -> Search
s {$sel:stats:Search' :: Maybe Text
stats = Maybe Text
a} :: Search)

-- | Specifies the fields or custom expressions to use to sort the search
-- results. Multiple fields or expressions are specified as a
-- comma-separated list. You must specify the sort direction (@asc@ or
-- @desc@) for each field; for example, @year desc,title asc@. To use a
-- field to sort results, the field must be sort-enabled in the domain
-- configuration. Array type fields cannot be used for sorting. If no
-- @sort@ parameter is specified, results are sorted by their default
-- relevance scores in descending order: @_score desc@. You can also sort
-- by document ID (@_id asc@) and version (@_version desc@).
--
-- For more information, see
-- <http://docs.aws.amazon.com/cloudsearch/latest/developerguide/sorting-results.html Sorting Results>
-- in the /Amazon CloudSearch Developer Guide/.
search_sort :: Lens.Lens' Search (Prelude.Maybe Prelude.Text)
search_sort :: (Maybe Text -> f (Maybe Text)) -> Search -> f Search
search_sort = (Search -> Maybe Text)
-> (Search -> Maybe Text -> Search)
-> Lens Search Search (Maybe Text) (Maybe Text)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Search' {Maybe Text
sort :: Maybe Text
$sel:sort:Search' :: Search -> Maybe Text
sort} -> Maybe Text
sort) (\s :: Search
s@Search' {} Maybe Text
a -> Search
s {$sel:sort:Search' :: Maybe Text
sort = Maybe Text
a} :: Search)

-- | Specifies one or more fields for which to get facet information, and
-- options that control how the facet information is returned. Each
-- specified field must be facet-enabled in the domain configuration. The
-- fields and options are specified in JSON using the form
-- @{\"FIELD\":{\"OPTION\":VALUE,\"OPTION:\"STRING\"},\"FIELD\":{\"OPTION\":VALUE,\"OPTION\":\"STRING\"}}@.
--
-- You can specify the following faceting options:
--
-- -   @buckets@ specifies an array of the facet values or ranges to count.
--     Ranges are specified using the same syntax that you use to search
--     for a range of values. For more information, see
--     <http://docs.aws.amazon.com/cloudsearch/latest/developerguide/searching-ranges.html Searching for a Range of Values>
--     in the /Amazon CloudSearch Developer Guide/. Buckets are returned in
--     the order they are specified in the request. The @sort@ and @size@
--     options are not valid if you specify @buckets@.
--
-- -   @size@ specifies the maximum number of facets to include in the
--     results. By default, Amazon CloudSearch returns counts for the top
--     10. The @size@ parameter is only valid when you specify the @sort@
--     option; it cannot be used in conjunction with @buckets@.
--
-- -   @sort@ specifies how you want to sort the facets in the results:
--     @bucket@ or @count@. Specify @bucket@ to sort alphabetically or
--     numerically by facet value (in ascending order). Specify @count@ to
--     sort by the facet counts computed for each facet value (in
--     descending order). To retrieve facet counts for particular values or
--     ranges of values, use the @buckets@ option instead of @sort@.
--
-- If no facet options are specified, facet counts are computed for all
-- field values, the facets are sorted by facet count, and the top 10
-- facets are returned in the results.
--
-- To count particular buckets of values, use the @buckets@ option. For
-- example, the following request uses the @buckets@ option to calculate
-- and return facet counts by decade.
--
-- @ {\"year\":{\"buckets\":[\"[1970,1979]\",\"[1980,1989]\",\"[1990,1999]\",\"[2000,2009]\",\"[2010,}\"]}} @
--
-- To sort facets by facet count, use the @count@ option. For example, the
-- following request sets the @sort@ option to @count@ to sort the facet
-- values by facet count, with the facet values that have the most matching
-- documents listed first. Setting the @size@ option to 3 returns only the
-- top three facet values.
--
-- @ {\"year\":{\"sort\":\"count\",\"size\":3}} @
--
-- To sort the facets by value, use the @bucket@ option. For example, the
-- following request sets the @sort@ option to @bucket@ to sort the facet
-- values numerically by year, with earliest year listed first.
--
-- @ {\"year\":{\"sort\":\"bucket\"}} @
--
-- For more information, see
-- <http://docs.aws.amazon.com/cloudsearch/latest/developerguide/faceting.html Getting and Using Facet Information>
-- in the /Amazon CloudSearch Developer Guide/.
search_facet :: Lens.Lens' Search (Prelude.Maybe Prelude.Text)
search_facet :: (Maybe Text -> f (Maybe Text)) -> Search -> f Search
search_facet = (Search -> Maybe Text)
-> (Search -> Maybe Text -> Search)
-> Lens Search Search (Maybe Text) (Maybe Text)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Search' {Maybe Text
facet :: Maybe Text
$sel:facet:Search' :: Search -> Maybe Text
facet} -> Maybe Text
facet) (\s :: Search
s@Search' {} Maybe Text
a -> Search
s {$sel:facet:Search' :: Maybe Text
facet = Maybe Text
a} :: Search)

-- | Enables partial results to be returned if one or more index partitions
-- are unavailable. When your search index is partitioned across multiple
-- search instances, by default Amazon CloudSearch only returns results if
-- every partition can be queried. This means that the failure of a single
-- search instance can result in 5xx (internal server) errors. When you
-- enable partial results, Amazon CloudSearch returns whatever results are
-- available and includes the percentage of documents searched in the
-- search results (percent-searched). This enables you to more gracefully
-- degrade your users\' search experience. For example, rather than
-- displaying no results, you could display the partial results and a
-- message indicating that the results might be incomplete due to a
-- temporary system outage.
search_partial :: Lens.Lens' Search (Prelude.Maybe Prelude.Bool)
search_partial :: (Maybe Bool -> f (Maybe Bool)) -> Search -> f Search
search_partial = (Search -> Maybe Bool)
-> (Search -> Maybe Bool -> Search)
-> Lens Search Search (Maybe Bool) (Maybe Bool)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Search' {Maybe Bool
partial :: Maybe Bool
$sel:partial:Search' :: Search -> Maybe Bool
partial} -> Maybe Bool
partial) (\s :: Search
s@Search' {} Maybe Bool
a -> Search
s {$sel:partial:Search' :: Maybe Bool
partial = Maybe Bool
a} :: Search)

-- | Specifies the search criteria for the request. How you specify the
-- search criteria depends on the query parser used for the request and the
-- parser options specified in the @queryOptions@ parameter. By default,
-- the @simple@ query parser is used to process requests. To use the
-- @structured@, @lucene@, or @dismax@ query parser, you must also specify
-- the @queryParser@ parameter.
--
-- For more information about specifying search criteria, see
-- <http://docs.aws.amazon.com/cloudsearch/latest/developerguide/searching.html Searching Your Data>
-- in the /Amazon CloudSearch Developer Guide/.
search_query :: Lens.Lens' Search Prelude.Text
search_query :: (Text -> f Text) -> Search -> f Search
search_query = (Search -> Text)
-> (Search -> Text -> Search) -> Lens Search Search Text Text
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Search' {Text
query :: Text
$sel:query:Search' :: Search -> Text
query} -> Text
query) (\s :: Search
s@Search' {} Text
a -> Search
s {$sel:query:Search' :: Text
query = Text
a} :: Search)

instance Core.AWSRequest Search where
  type AWSResponse Search = SearchResponse
  request :: Search -> Request Search
request = Service -> Search -> Request Search
forall a. ToRequest a => Service -> a -> Request a
Request.get Service
defaultService
  response :: Logger
-> Service
-> Proxy Search
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse Search)))
response =
    (Int
 -> ResponseHeaders -> Object -> Either String (AWSResponse Search))
-> Logger
-> Service
-> Proxy Search
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse Search)))
forall (m :: * -> *) a.
MonadResource m =>
(Int -> ResponseHeaders -> Object -> Either String (AWSResponse a))
-> Logger
-> Service
-> Proxy a
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse a)))
Response.receiveJSON
      ( \Int
s ResponseHeaders
h Object
x ->
          Maybe SearchStatus
-> Maybe (HashMap Text BucketInfo)
-> Maybe (HashMap Text FieldStats)
-> Maybe Hits
-> Int
-> SearchResponse
SearchResponse'
            (Maybe SearchStatus
 -> Maybe (HashMap Text BucketInfo)
 -> Maybe (HashMap Text FieldStats)
 -> Maybe Hits
 -> Int
 -> SearchResponse)
-> Either String (Maybe SearchStatus)
-> Either
     String
     (Maybe (HashMap Text BucketInfo)
      -> Maybe (HashMap Text FieldStats)
      -> Maybe Hits
      -> Int
      -> SearchResponse)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> (Object
x Object -> Text -> Either String (Maybe SearchStatus)
forall a. FromJSON a => Object -> Text -> Either String (Maybe a)
Core..?> Text
"status")
            Either
  String
  (Maybe (HashMap Text BucketInfo)
   -> Maybe (HashMap Text FieldStats)
   -> Maybe Hits
   -> Int
   -> SearchResponse)
-> Either String (Maybe (HashMap Text BucketInfo))
-> Either
     String
     (Maybe (HashMap Text FieldStats)
      -> Maybe Hits -> Int -> SearchResponse)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x Object
-> Text -> Either String (Maybe (Maybe (HashMap Text BucketInfo)))
forall a. FromJSON a => Object -> Text -> Either String (Maybe a)
Core..?> Text
"facets" Either String (Maybe (Maybe (HashMap Text BucketInfo)))
-> Maybe (HashMap Text BucketInfo)
-> Either String (Maybe (HashMap Text BucketInfo))
forall (f :: * -> *) a. Functor f => f (Maybe a) -> a -> f a
Core..!@ Maybe (HashMap Text BucketInfo)
forall a. Monoid a => a
Prelude.mempty)
            Either
  String
  (Maybe (HashMap Text FieldStats)
   -> Maybe Hits -> Int -> SearchResponse)
-> Either String (Maybe (HashMap Text FieldStats))
-> Either String (Maybe Hits -> Int -> SearchResponse)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x Object
-> Text -> Either String (Maybe (Maybe (HashMap Text FieldStats)))
forall a. FromJSON a => Object -> Text -> Either String (Maybe a)
Core..?> Text
"stats" Either String (Maybe (Maybe (HashMap Text FieldStats)))
-> Maybe (HashMap Text FieldStats)
-> Either String (Maybe (HashMap Text FieldStats))
forall (f :: * -> *) a. Functor f => f (Maybe a) -> a -> f a
Core..!@ Maybe (HashMap Text FieldStats)
forall a. Monoid a => a
Prelude.mempty)
            Either String (Maybe Hits -> Int -> SearchResponse)
-> Either String (Maybe Hits)
-> Either String (Int -> SearchResponse)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x Object -> Text -> Either String (Maybe Hits)
forall a. FromJSON a => Object -> Text -> Either String (Maybe a)
Core..?> Text
"hits")
            Either String (Int -> SearchResponse)
-> Either String Int -> Either String SearchResponse
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Int -> Either String Int
forall (f :: * -> *) a. Applicative f => a -> f a
Prelude.pure (Int -> Int
forall a. Enum a => a -> Int
Prelude.fromEnum Int
s))
      )

instance Prelude.Hashable Search

instance Prelude.NFData Search

instance Core.ToHeaders Search where
  toHeaders :: Search -> ResponseHeaders
toHeaders =
    ResponseHeaders -> Search -> ResponseHeaders
forall a b. a -> b -> a
Prelude.const
      ( [ResponseHeaders] -> ResponseHeaders
forall a. Monoid a => [a] -> a
Prelude.mconcat
          [ HeaderName
"Content-Type"
              HeaderName -> ByteString -> ResponseHeaders
forall a. ToHeader a => HeaderName -> a -> ResponseHeaders
Core.=# ( ByteString
"application/x-amz-json-1.1" ::
                          Prelude.ByteString
                      )
          ]
      )

instance Core.ToPath Search where
  toPath :: Search -> ByteString
toPath = ByteString -> Search -> ByteString
forall a b. a -> b -> a
Prelude.const ByteString
"/2013-01-01/search"

instance Core.ToQuery Search where
  toQuery :: Search -> QueryString
toQuery Search' {Maybe Bool
Maybe Integer
Maybe Text
Maybe QueryParser
Text
query :: Text
partial :: Maybe Bool
facet :: Maybe Text
sort :: Maybe Text
stats :: Maybe Text
highlight :: Maybe Text
start :: Maybe Integer
queryParser :: Maybe QueryParser
size :: Maybe Integer
filterQuery :: Maybe Text
queryOptions :: Maybe Text
return' :: Maybe Text
cursor :: Maybe Text
expr :: Maybe Text
$sel:query:Search' :: Search -> Text
$sel:partial:Search' :: Search -> Maybe Bool
$sel:facet:Search' :: Search -> Maybe Text
$sel:sort:Search' :: Search -> Maybe Text
$sel:stats:Search' :: Search -> Maybe Text
$sel:highlight:Search' :: Search -> Maybe Text
$sel:start:Search' :: Search -> Maybe Integer
$sel:queryParser:Search' :: Search -> Maybe QueryParser
$sel:size:Search' :: Search -> Maybe Integer
$sel:filterQuery:Search' :: Search -> Maybe Text
$sel:queryOptions:Search' :: Search -> Maybe Text
$sel:return':Search' :: Search -> Maybe Text
$sel:cursor:Search' :: Search -> Maybe Text
$sel:expr:Search' :: Search -> Maybe Text
..} =
    [QueryString] -> QueryString
forall a. Monoid a => [a] -> a
Prelude.mconcat
      [ ByteString
"expr" ByteString -> Maybe Text -> QueryString
forall a. ToQuery a => ByteString -> a -> QueryString
Core.=: Maybe Text
expr,
        ByteString
"cursor" ByteString -> Maybe Text -> QueryString
forall a. ToQuery a => ByteString -> a -> QueryString
Core.=: Maybe Text
cursor,
        ByteString
"return" ByteString -> Maybe Text -> QueryString
forall a. ToQuery a => ByteString -> a -> QueryString
Core.=: Maybe Text
return',
        ByteString
"q.options" ByteString -> Maybe Text -> QueryString
forall a. ToQuery a => ByteString -> a -> QueryString
Core.=: Maybe Text
queryOptions,
        ByteString
"fq" ByteString -> Maybe Text -> QueryString
forall a. ToQuery a => ByteString -> a -> QueryString
Core.=: Maybe Text
filterQuery,
        ByteString
"size" ByteString -> Maybe Integer -> QueryString
forall a. ToQuery a => ByteString -> a -> QueryString
Core.=: Maybe Integer
size,
        ByteString
"q.parser" ByteString -> Maybe QueryParser -> QueryString
forall a. ToQuery a => ByteString -> a -> QueryString
Core.=: Maybe QueryParser
queryParser,
        ByteString
"start" ByteString -> Maybe Integer -> QueryString
forall a. ToQuery a => ByteString -> a -> QueryString
Core.=: Maybe Integer
start,
        ByteString
"highlight" ByteString -> Maybe Text -> QueryString
forall a. ToQuery a => ByteString -> a -> QueryString
Core.=: Maybe Text
highlight,
        ByteString
"stats" ByteString -> Maybe Text -> QueryString
forall a. ToQuery a => ByteString -> a -> QueryString
Core.=: Maybe Text
stats,
        ByteString
"sort" ByteString -> Maybe Text -> QueryString
forall a. ToQuery a => ByteString -> a -> QueryString
Core.=: Maybe Text
sort,
        ByteString
"facet" ByteString -> Maybe Text -> QueryString
forall a. ToQuery a => ByteString -> a -> QueryString
Core.=: Maybe Text
facet,
        ByteString
"partial" ByteString -> Maybe Bool -> QueryString
forall a. ToQuery a => ByteString -> a -> QueryString
Core.=: Maybe Bool
partial,
        ByteString
"q" ByteString -> Text -> QueryString
forall a. ToQuery a => ByteString -> a -> QueryString
Core.=: Text
query,
        QueryString
"format=sdk&pretty=true"
      ]

-- | The result of a @Search@ request. Contains the documents that match the
-- specified search criteria and any requested fields, highlights, and
-- facet information.
--
-- /See:/ 'newSearchResponse' smart constructor.
data SearchResponse = SearchResponse'
  { -- | The status information returned for the search request.
    SearchResponse -> Maybe SearchStatus
status :: Prelude.Maybe SearchStatus,
    -- | The requested facet information.
    SearchResponse -> Maybe (HashMap Text BucketInfo)
facets :: Prelude.Maybe (Prelude.HashMap Prelude.Text BucketInfo),
    -- | The requested field statistics information.
    SearchResponse -> Maybe (HashMap Text FieldStats)
stats :: Prelude.Maybe (Prelude.HashMap Prelude.Text FieldStats),
    -- | The documents that match the search criteria.
    SearchResponse -> Maybe Hits
hits :: Prelude.Maybe Hits,
    -- | The response's http status code.
    SearchResponse -> Int
httpStatus :: Prelude.Int
  }
  deriving (SearchResponse -> SearchResponse -> Bool
(SearchResponse -> SearchResponse -> Bool)
-> (SearchResponse -> SearchResponse -> Bool) -> Eq SearchResponse
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: SearchResponse -> SearchResponse -> Bool
$c/= :: SearchResponse -> SearchResponse -> Bool
== :: SearchResponse -> SearchResponse -> Bool
$c== :: SearchResponse -> SearchResponse -> Bool
Prelude.Eq, ReadPrec [SearchResponse]
ReadPrec SearchResponse
Int -> ReadS SearchResponse
ReadS [SearchResponse]
(Int -> ReadS SearchResponse)
-> ReadS [SearchResponse]
-> ReadPrec SearchResponse
-> ReadPrec [SearchResponse]
-> Read SearchResponse
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [SearchResponse]
$creadListPrec :: ReadPrec [SearchResponse]
readPrec :: ReadPrec SearchResponse
$creadPrec :: ReadPrec SearchResponse
readList :: ReadS [SearchResponse]
$creadList :: ReadS [SearchResponse]
readsPrec :: Int -> ReadS SearchResponse
$creadsPrec :: Int -> ReadS SearchResponse
Prelude.Read, Int -> SearchResponse -> ShowS
[SearchResponse] -> ShowS
SearchResponse -> String
(Int -> SearchResponse -> ShowS)
-> (SearchResponse -> String)
-> ([SearchResponse] -> ShowS)
-> Show SearchResponse
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SearchResponse] -> ShowS
$cshowList :: [SearchResponse] -> ShowS
show :: SearchResponse -> String
$cshow :: SearchResponse -> String
showsPrec :: Int -> SearchResponse -> ShowS
$cshowsPrec :: Int -> SearchResponse -> ShowS
Prelude.Show, (forall x. SearchResponse -> Rep SearchResponse x)
-> (forall x. Rep SearchResponse x -> SearchResponse)
-> Generic SearchResponse
forall x. Rep SearchResponse x -> SearchResponse
forall x. SearchResponse -> Rep SearchResponse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep SearchResponse x -> SearchResponse
$cfrom :: forall x. SearchResponse -> Rep SearchResponse x
Prelude.Generic)

-- |
-- Create a value of 'SearchResponse' with all optional fields omitted.
--
-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
--
-- The following record fields are available, with the corresponding lenses provided
-- for backwards compatibility:
--
-- 'status', 'searchResponse_status' - The status information returned for the search request.
--
-- 'facets', 'searchResponse_facets' - The requested facet information.
--
-- 'stats', 'searchResponse_stats' - The requested field statistics information.
--
-- 'hits', 'searchResponse_hits' - The documents that match the search criteria.
--
-- 'httpStatus', 'searchResponse_httpStatus' - The response's http status code.
newSearchResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  SearchResponse
newSearchResponse :: Int -> SearchResponse
newSearchResponse Int
pHttpStatus_ =
  SearchResponse' :: Maybe SearchStatus
-> Maybe (HashMap Text BucketInfo)
-> Maybe (HashMap Text FieldStats)
-> Maybe Hits
-> Int
-> SearchResponse
SearchResponse'
    { $sel:status:SearchResponse' :: Maybe SearchStatus
status = Maybe SearchStatus
forall a. Maybe a
Prelude.Nothing,
      $sel:facets:SearchResponse' :: Maybe (HashMap Text BucketInfo)
facets = Maybe (HashMap Text BucketInfo)
forall a. Maybe a
Prelude.Nothing,
      $sel:stats:SearchResponse' :: Maybe (HashMap Text FieldStats)
stats = Maybe (HashMap Text FieldStats)
forall a. Maybe a
Prelude.Nothing,
      $sel:hits:SearchResponse' :: Maybe Hits
hits = Maybe Hits
forall a. Maybe a
Prelude.Nothing,
      $sel:httpStatus:SearchResponse' :: Int
httpStatus = Int
pHttpStatus_
    }

-- | The status information returned for the search request.
searchResponse_status :: Lens.Lens' SearchResponse (Prelude.Maybe SearchStatus)
searchResponse_status :: (Maybe SearchStatus -> f (Maybe SearchStatus))
-> SearchResponse -> f SearchResponse
searchResponse_status = (SearchResponse -> Maybe SearchStatus)
-> (SearchResponse -> Maybe SearchStatus -> SearchResponse)
-> Lens
     SearchResponse
     SearchResponse
     (Maybe SearchStatus)
     (Maybe SearchStatus)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\SearchResponse' {Maybe SearchStatus
status :: Maybe SearchStatus
$sel:status:SearchResponse' :: SearchResponse -> Maybe SearchStatus
status} -> Maybe SearchStatus
status) (\s :: SearchResponse
s@SearchResponse' {} Maybe SearchStatus
a -> SearchResponse
s {$sel:status:SearchResponse' :: Maybe SearchStatus
status = Maybe SearchStatus
a} :: SearchResponse)

-- | The requested facet information.
searchResponse_facets :: Lens.Lens' SearchResponse (Prelude.Maybe (Prelude.HashMap Prelude.Text BucketInfo))
searchResponse_facets :: (Maybe (HashMap Text BucketInfo)
 -> f (Maybe (HashMap Text BucketInfo)))
-> SearchResponse -> f SearchResponse
searchResponse_facets = (SearchResponse -> Maybe (HashMap Text BucketInfo))
-> (SearchResponse
    -> Maybe (HashMap Text BucketInfo) -> SearchResponse)
-> Lens
     SearchResponse
     SearchResponse
     (Maybe (HashMap Text BucketInfo))
     (Maybe (HashMap Text BucketInfo))
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\SearchResponse' {Maybe (HashMap Text BucketInfo)
facets :: Maybe (HashMap Text BucketInfo)
$sel:facets:SearchResponse' :: SearchResponse -> Maybe (HashMap Text BucketInfo)
facets} -> Maybe (HashMap Text BucketInfo)
facets) (\s :: SearchResponse
s@SearchResponse' {} Maybe (HashMap Text BucketInfo)
a -> SearchResponse
s {$sel:facets:SearchResponse' :: Maybe (HashMap Text BucketInfo)
facets = Maybe (HashMap Text BucketInfo)
a} :: SearchResponse) ((Maybe (HashMap Text BucketInfo)
  -> f (Maybe (HashMap Text BucketInfo)))
 -> SearchResponse -> f SearchResponse)
-> ((Maybe (HashMap Text BucketInfo)
     -> f (Maybe (HashMap Text BucketInfo)))
    -> Maybe (HashMap Text BucketInfo)
    -> f (Maybe (HashMap Text BucketInfo)))
-> (Maybe (HashMap Text BucketInfo)
    -> f (Maybe (HashMap Text BucketInfo)))
-> SearchResponse
-> f SearchResponse
forall b c a. (b -> c) -> (a -> b) -> a -> c
Prelude.. AnIso
  (HashMap Text BucketInfo)
  (HashMap Text BucketInfo)
  (HashMap Text BucketInfo)
  (HashMap Text BucketInfo)
-> Iso
     (Maybe (HashMap Text BucketInfo))
     (Maybe (HashMap Text BucketInfo))
     (Maybe (HashMap Text BucketInfo))
     (Maybe (HashMap Text BucketInfo))
forall (f :: * -> *) (g :: * -> *) s t a b.
(Functor f, Functor g) =>
AnIso s t a b -> Iso (f s) (g t) (f a) (g b)
Lens.mapping AnIso
  (HashMap Text BucketInfo)
  (HashMap Text BucketInfo)
  (HashMap Text BucketInfo)
  (HashMap Text BucketInfo)
forall s t a b. (Coercible s a, Coercible t b) => Iso s t a b
Lens.coerced

-- | The requested field statistics information.
searchResponse_stats :: Lens.Lens' SearchResponse (Prelude.Maybe (Prelude.HashMap Prelude.Text FieldStats))
searchResponse_stats :: (Maybe (HashMap Text FieldStats)
 -> f (Maybe (HashMap Text FieldStats)))
-> SearchResponse -> f SearchResponse
searchResponse_stats = (SearchResponse -> Maybe (HashMap Text FieldStats))
-> (SearchResponse
    -> Maybe (HashMap Text FieldStats) -> SearchResponse)
-> Lens
     SearchResponse
     SearchResponse
     (Maybe (HashMap Text FieldStats))
     (Maybe (HashMap Text FieldStats))
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\SearchResponse' {Maybe (HashMap Text FieldStats)
stats :: Maybe (HashMap Text FieldStats)
$sel:stats:SearchResponse' :: SearchResponse -> Maybe (HashMap Text FieldStats)
stats} -> Maybe (HashMap Text FieldStats)
stats) (\s :: SearchResponse
s@SearchResponse' {} Maybe (HashMap Text FieldStats)
a -> SearchResponse
s {$sel:stats:SearchResponse' :: Maybe (HashMap Text FieldStats)
stats = Maybe (HashMap Text FieldStats)
a} :: SearchResponse) ((Maybe (HashMap Text FieldStats)
  -> f (Maybe (HashMap Text FieldStats)))
 -> SearchResponse -> f SearchResponse)
-> ((Maybe (HashMap Text FieldStats)
     -> f (Maybe (HashMap Text FieldStats)))
    -> Maybe (HashMap Text FieldStats)
    -> f (Maybe (HashMap Text FieldStats)))
-> (Maybe (HashMap Text FieldStats)
    -> f (Maybe (HashMap Text FieldStats)))
-> SearchResponse
-> f SearchResponse
forall b c a. (b -> c) -> (a -> b) -> a -> c
Prelude.. AnIso
  (HashMap Text FieldStats)
  (HashMap Text FieldStats)
  (HashMap Text FieldStats)
  (HashMap Text FieldStats)
-> Iso
     (Maybe (HashMap Text FieldStats))
     (Maybe (HashMap Text FieldStats))
     (Maybe (HashMap Text FieldStats))
     (Maybe (HashMap Text FieldStats))
forall (f :: * -> *) (g :: * -> *) s t a b.
(Functor f, Functor g) =>
AnIso s t a b -> Iso (f s) (g t) (f a) (g b)
Lens.mapping AnIso
  (HashMap Text FieldStats)
  (HashMap Text FieldStats)
  (HashMap Text FieldStats)
  (HashMap Text FieldStats)
forall s t a b. (Coercible s a, Coercible t b) => Iso s t a b
Lens.coerced

-- | The documents that match the search criteria.
searchResponse_hits :: Lens.Lens' SearchResponse (Prelude.Maybe Hits)
searchResponse_hits :: (Maybe Hits -> f (Maybe Hits))
-> SearchResponse -> f SearchResponse
searchResponse_hits = (SearchResponse -> Maybe Hits)
-> (SearchResponse -> Maybe Hits -> SearchResponse)
-> Lens SearchResponse SearchResponse (Maybe Hits) (Maybe Hits)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\SearchResponse' {Maybe Hits
hits :: Maybe Hits
$sel:hits:SearchResponse' :: SearchResponse -> Maybe Hits
hits} -> Maybe Hits
hits) (\s :: SearchResponse
s@SearchResponse' {} Maybe Hits
a -> SearchResponse
s {$sel:hits:SearchResponse' :: Maybe Hits
hits = Maybe Hits
a} :: SearchResponse)

-- | The response's http status code.
searchResponse_httpStatus :: Lens.Lens' SearchResponse Prelude.Int
searchResponse_httpStatus :: (Int -> f Int) -> SearchResponse -> f SearchResponse
searchResponse_httpStatus = (SearchResponse -> Int)
-> (SearchResponse -> Int -> SearchResponse)
-> Lens SearchResponse SearchResponse Int Int
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\SearchResponse' {Int
httpStatus :: Int
$sel:httpStatus:SearchResponse' :: SearchResponse -> Int
httpStatus} -> Int
httpStatus) (\s :: SearchResponse
s@SearchResponse' {} Int
a -> SearchResponse
s {$sel:httpStatus:SearchResponse' :: Int
httpStatus = Int
a} :: SearchResponse)

instance Prelude.NFData SearchResponse