<html><body>
<style>

body, h1, h2, h3, div, span, p, pre, a {
  margin: 0;
  padding: 0;
  border: 0;
  font-weight: inherit;
  font-style: inherit;
  font-size: 100%;
  font-family: inherit;
  vertical-align: baseline;
}

body {
  font-size: 13px;
  padding: 1em;
}

h1 {
  font-size: 26px;
  margin-bottom: 1em;
}

h2 {
  font-size: 24px;
  margin-bottom: 1em;
}

h3 {
  font-size: 20px;
  margin-bottom: 1em;
  margin-top: 1em;
}

pre, code {
  line-height: 1.5;
  font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace;
}

pre {
  margin-top: 0.5em;
}

h1, h2, h3, p {
  font-family: Arial, sans serif;
}

h1, h2, h3 {
  border-bottom: solid #CCC 1px;
}

.toc_element {
  margin-top: 0.5em;
}

.firstline {
  margin-left: 2 em;
}

.method  {
  margin-top: 1em;
  border: solid 1px #CCC;
  padding: 1em;
  background: #EEE;
}

.details {
  font-weight: bold;
  font-size: 14px;
}

</style>

<h1><a href="cloudsearch_v1.html">Cloud Search API</a> . <a href="cloudsearch_v1.indexing.html">indexing</a> . <a href="cloudsearch_v1.indexing.datasources.html">datasources</a></h1>
<h2>Instance Methods</h2>
<p class="toc_element">
  <code><a href="cloudsearch_v1.indexing.datasources.items.html">items()</a></code>
</p>
<p class="firstline">Returns the items Resource.</p>

<p class="toc_element">
  <code><a href="#deleteSchema">deleteSchema(name, debugOptions_enableDebugging=None, x__xgafv=None)</a></code></p>
<p class="firstline">Deletes the schema of a data source.</p>
<p class="toc_element">
  <code><a href="#getSchema">getSchema(name, debugOptions_enableDebugging=None, x__xgafv=None)</a></code></p>
<p class="firstline">Gets the schema of a data source.</p>
<p class="toc_element">
  <code><a href="#updateSchema">updateSchema(name, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Updates the schema of a data source. This method does not perform</p>
<h3>Method Details</h3>
<div class="method">
    <code class="details" id="deleteSchema">deleteSchema(name, debugOptions_enableDebugging=None, x__xgafv=None)</code>
  <pre>Deletes the schema of a data source.

**Note:** This API requires an admin or service account to execute.

Args:
  name: string, Name of the data source to delete Schema.  Format:
datasources/{source_id} (required)
  debugOptions_enableDebugging: boolean, If you are asked by Google to help with debugging, set this field.
Otherwise, ignore this field.
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # This resource represents a long-running operation that is the result of a
      # network API call.
    &quot;response&quot;: { # The normal response of the operation in case of success.  If the original
        # method returns no data on success, such as `Delete`, the response is
        # `google.protobuf.Empty`.  If the original method is standard
        # `Get`/`Create`/`Update`, the response should be the resource.  For other
        # methods, the response should have the type `XxxResponse`, where `Xxx`
        # is the original method name.  For example, if the original method name
        # is `TakeSnapshot()`, the inferred response type is
        # `TakeSnapshotResponse`.
      &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
    },
    &quot;name&quot;: &quot;A String&quot;, # The server-assigned name, which is only unique within the same service that
        # originally returns it. If you use the default HTTP mapping, the
        # `name` should be a resource name ending with `operations/{unique_id}`.
    &quot;error&quot;: { # The `Status` type defines a logical error model that is suitable for # The error result of the operation in case of failure or cancellation.
        # different programming environments, including REST APIs and RPC APIs. It is
        # used by [gRPC](https://github.com/grpc). Each `Status` message contains
        # three pieces of data: error code, error message, and error details.
        #
        # You can find out more about this error model and how to work with it in the
        # [API Design Guide](https://cloud.google.com/apis/design/errors).
      &quot;details&quot;: [ # A list of messages that carry the error details.  There is a common set of
          # message types for APIs to use.
        {
          &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
        },
      ],
      &quot;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
      &quot;message&quot;: &quot;A String&quot;, # A developer-facing error message, which should be in English. Any
          # user-facing error message should be localized and sent in the
          # google.rpc.Status.details field, or localized by the client.
    },
    &quot;metadata&quot;: { # Service-specific metadata associated with the operation.  It typically
        # contains progress information and common metadata such as create time.
        # Some services might not provide such metadata.  Any method that returns a
        # long-running operation should document the metadata type, if any.
      &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
    },
    &quot;done&quot;: True or False, # If the value is `false`, it means the operation is still in progress.
        # If `true`, the operation is completed, and either `error` or `response` is
        # available.
  }</pre>
</div>

<div class="method">
    <code class="details" id="getSchema">getSchema(name, debugOptions_enableDebugging=None, x__xgafv=None)</code>
  <pre>Gets the schema of a data source.

**Note:** This API requires an admin or service account to execute.

Args:
  name: string, Name of the data source to get Schema.  Format:
datasources/{source_id} (required)
  debugOptions_enableDebugging: boolean, If you are asked by Google to help with debugging, set this field.
Otherwise, ignore this field.
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # The schema definition for a data source.
    &quot;operationIds&quot;: [ # IDs of the Long Running Operations (LROs) currently running for this
        # schema. After modifying the schema, wait for operations to complete
        # before indexing additional content.
      &quot;A String&quot;,
    ],
    &quot;objectDefinitions&quot;: [ # The list of top-level objects for the data source.
        # The maximum number of elements is 10.
      { # The definition for an object within a data source.
        &quot;options&quot;: { # The options for an object. # The optional object-specific options.
          &quot;displayOptions&quot;: { # The display options for an object. # Options that determine how the object is displayed in the Cloud Search
              # results page.
            &quot;objectDisplayLabel&quot;: &quot;A String&quot;, # The user friendly label to display in the search result to indicate the
                # type of the item. This is OPTIONAL; if not provided, an object label isn&#x27;t
                # displayed on the context line of the search results. The maximum length
                # is 64 characters.
            &quot;metalines&quot;: [ # Defines the properties that are displayed in the metalines of the
                # search results. The property values are displayed in the order given
                # here. If a property holds multiple values, all of the values are
                # displayed before the next properties. For this reason, it is a good
                # practice to specify singular properties before repeated properties in this
                # list. All of the properties must set
                # is_returnable
                # to true. The maximum number of metalines is 3.
              { # A metaline is a list of properties that are displayed along with the search
                  # result to provide context.
                &quot;properties&quot;: [ # The list of displayed properties for the metaline. The maximum number of
                    # properties is 5.
                  { # A reference to a top-level property within the object that should be
                      # displayed in search results. The values of the chosen properties is
                      # displayed in the search results along with the
                      # display label
                      # for that property if one is specified. If a display label is not specified,
                      # only the values is shown.
                    &quot;propertyName&quot;: &quot;A String&quot;, # The name of the top-level property as defined in a property definition
                        # for the object. If the name is not a defined property in the schema, an
                        # error is given when attempting to update the schema.
                  },
                ],
              },
            ],
          },
          &quot;freshnessOptions&quot;: { # Indicates which freshness property to use when adjusting search ranking for # The freshness options for an object.
              # an item. Fresher, more recent dates indicate higher quality. Use the
              # freshness option property that best works with your data. For fileshare
              # documents, last modified time is most relevant. For calendar event data,
              # the time when the event occurs is a more relevant freshness indicator. In
              # this way, calendar events that occur closer to the time of the search query
              # are considered higher quality and ranked accordingly.
            &quot;freshnessDuration&quot;: &quot;A String&quot;, # The duration after which an object should be considered
                # stale. The default value is 180 days (in seconds).
            &quot;freshnessProperty&quot;: &quot;A String&quot;, # This property indicates the freshness level of the object in the index.
                # If set, this property must be a top-level property within the
                # property definitions
                # and it must be a
                # timestamp type
                # or
                # date type.
                # Otherwise, the Indexing API uses
                # updateTime
                # as the freshness indicator.
                # The maximum length is 256 characters.
                #
                # When a property is used to calculate freshness, the value defaults
                # to 2 years from the current time.
          },
        },
        &quot;propertyDefinitions&quot;: [ # The property definitions for the object.
            # The maximum number of elements is 1000.
          { # The definition of a property within an object.
            &quot;textPropertyOptions&quot;: { # Options for text properties.
              &quot;operatorOptions&quot;: { # Used to provide a search operator for text properties. This is optional. # If set, describes how the property should be used as a search operator.
                  # Search operators let users restrict the query to specific fields relevant
                  # to the type of item being searched.
                &quot;operatorName&quot;: &quot;A String&quot;, # Indicates the operator name required in the query in order to isolate the
                    # text property. For example, if operatorName is *subject* and the
                    # property&#x27;s name is *subjectLine*, then queries like
                    # *subject:&amp;lt;value&amp;gt;* show results only where the value of the
                    # property named *subjectLine* matches *&amp;lt;value&amp;gt;*. By contrast, a
                    # search that uses the same *&amp;lt;value&amp;gt;* without an operator returns
                    # all items where *&amp;lt;value&amp;gt;* matches the value of any
                    # text properties or text within the content field for the item.
                    # The operator name can only contain lowercase letters (a-z).
                    # The maximum length is 32 characters.
                &quot;exactMatchWithOperator&quot;: True or False, # If true, the text value is tokenized as one atomic value in
                    # operator searches and facet matches. For example, if the operator name is
                    # &quot;genre&quot; and the value is &quot;science-fiction&quot; the query restrictions
                    # &quot;genre:science&quot; and &quot;genre:fiction&quot; doesn&#x27;t match the item;
                    # &quot;genre:science-fiction&quot; does. Value matching is case-sensitive
                    # and does not remove special characters.
                    # If false, the text is tokenized. For example, if the value is
                    # &quot;science-fiction&quot; the queries &quot;genre:science&quot; and &quot;genre:fiction&quot;
                    # matches the item.
              },
              &quot;retrievalImportance&quot;: { # Indicates the search quality importance of the tokens within the
                  # field when used for retrieval.
                &quot;importance&quot;: &quot;A String&quot;, # Indicates the ranking importance given to property when it is matched
                    # during retrieval. Once set, the token importance of a property cannot be
                    # changed.
              },
            },
            &quot;isWildcardSearchable&quot;: True or False, # Indicates that users can perform wildcard search for this
                # property. Only supported for Text properties. IsReturnable must be true to
                # set this option. In a given datasource maximum of 5 properties can be
                # marked as is_wildcard_searchable.
            &quot;isRepeatable&quot;: True or False, # Indicates that multiple values are allowed for the property. For example, a
                # document only has one description but can have multiple comments. Cannot be
                # true for properties whose type is a boolean.
                # If set to false, properties that contain more than one value cause the
                # indexing request for that item to be rejected.
            &quot;objectPropertyOptions&quot;: { # Options for object properties.
              &quot;subobjectProperties&quot;: [ # The properties of the sub-object. These properties represent a nested
                  # object. For example, if this property represents a postal address, the
                  # subobjectProperties might be named *street*, *city*, and *state*.
                  # The maximum number of elements is 1000.
                # Object with schema name: PropertyDefinition
              ],
            },
            &quot;isSuggestable&quot;: True or False, # Indicates that the property can be used for generating query suggestions.
            &quot;htmlPropertyOptions&quot;: { # Options for html properties.
              &quot;retrievalImportance&quot;: { # Indicates the search quality importance of the tokens within the
                  # field when used for retrieval. Can only be set to DEFAULT or NONE.
                &quot;importance&quot;: &quot;A String&quot;, # Indicates the ranking importance given to property when it is matched
                    # during retrieval. Once set, the token importance of a property cannot be
                    # changed.
              },
              &quot;operatorOptions&quot;: { # Used to provide a search operator for html properties. This is optional. # If set, describes how the property should be used as a search operator.
                  # Search operators let users restrict the query to specific fields relevant
                  # to the type of item being searched.
                &quot;operatorName&quot;: &quot;A String&quot;, # Indicates the operator name required in the query in order to isolate the
                    # html property. For example, if operatorName is *subject* and the
                    # property&#x27;s name is *subjectLine*, then queries like
                    # *subject:&amp;lt;value&amp;gt;* show results only where the value of the
                    # property named *subjectLine* matches *&amp;lt;value&amp;gt;*. By contrast, a
                    # search that uses the same *&amp;lt;value&amp;gt;* without an operator return
                    # all items where *&amp;lt;value&amp;gt;* matches the value of any
                    # html properties or text within the content field for the item.
                    # The operator name can only contain lowercase letters (a-z).
                    # The maximum length is 32 characters.
              },
            },
            &quot;integerPropertyOptions&quot;: { # Options for integer properties.
              &quot;operatorOptions&quot;: { # Used to provide a search operator for integer properties. This is # If set, describes how the integer should be used as a search operator.
                  # optional. Search operators let users restrict the query to specific fields
                  # relevant to the type of item being searched.
                &quot;lessThanOperatorName&quot;: &quot;A String&quot;, # Indicates the operator name required in the query in order to isolate the
                    # integer property using the less-than operator. For example, if
                    # lessThanOperatorName is *prioritybelow* and the property&#x27;s name is
                    # *priorityVal*, then queries like *prioritybelow:&amp;lt;value&amp;gt;*
                    # show results only where the value of the property named *priorityVal* is
                    # less than *&amp;lt;value&amp;gt;*.
                    # The operator name can only contain lowercase letters (a-z).
                    # The maximum length is 32 characters.
                &quot;operatorName&quot;: &quot;A String&quot;, # Indicates the operator name required in the query in order to isolate the
                    # integer property. For example, if operatorName is *priority* and the
                    # property&#x27;s name is *priorityVal*, then queries like
                    # *priority:&amp;lt;value&amp;gt;* show results only where the value of the
                    # property named *priorityVal* matches *&amp;lt;value&amp;gt;*. By contrast, a
                    # search that uses the same *&amp;lt;value&amp;gt;* without an operator returns
                    # all items where *&amp;lt;value&amp;gt;* matches the value of any String
                    # properties or text within the content field for the item.
                    # The operator name can only contain lowercase letters (a-z).
                    # The maximum length is 32 characters.
                &quot;greaterThanOperatorName&quot;: &quot;A String&quot;, # Indicates the operator name required in the query in order to isolate the
                    # integer property using the greater-than operator. For example, if
                    # greaterThanOperatorName is *priorityabove* and the property&#x27;s name is
                    # *priorityVal*, then queries like *priorityabove:&amp;lt;value&amp;gt;*
                    # show results only where the value of the property named *priorityVal* is
                    # greater than *&amp;lt;value&amp;gt;*.
                    # The operator name can only contain lowercase letters (a-z).
                    # The maximum length is 32 characters.
              },
              &quot;minimumValue&quot;: &quot;A String&quot;, # The minimum value of the property. The minimum and maximum values for the
                  # property are used to rank results according to the
                  # ordered ranking.
                  # Indexing requests with values less than the minimum are accepted and
                  # ranked with the same weight as items indexed with the minimum value.
              &quot;orderedRanking&quot;: &quot;A String&quot;, # Used to specify the ordered ranking for the integer. Can only be used if
                  # isRepeatable
                  # is false.
              &quot;maximumValue&quot;: &quot;A String&quot;, # The maximum value of the property. The minimum and maximum values for the
                  # property are used to rank results according to the
                  # ordered ranking.
                  # Indexing requests with values greater than the maximum are accepted and
                  # ranked with the same weight as items indexed with the maximum value.
            },
            &quot;enumPropertyOptions&quot;: { # Options for enum properties, which allow you to define a restricted set of
                # strings to match user queries, set rankings for those string values, and
                # define an operator name to be paired with those strings so that users can
                # narrow results to only items with a specific value. For example, for items in
                # a request tracking system with priority information, you could define *p0* as
                # an allowable enum value and tie this enum to the operator name *priority* so
                # that search users could add *priority:p0* to their query to restrict the set
                # of results to only those items indexed with the value *p0*.
              &quot;possibleValues&quot;: [ # The list of possible values for the enumeration property. All
                  # EnumValuePairs must provide a string value. If you specify an integer value
                  # for one EnumValuePair, then all possible EnumValuePairs must provide an
                  # integer value. Both the string value and integer value must be unique over
                  # all possible values. Once set, possible values cannot be removed or
                  # modified. If you supply an ordered ranking and think you might insert
                  # additional enum values in the future, leave gaps in the initial integer
                  # values to allow adding a value in between previously registered values.
                  # The maximum number of elements is 100.
                { # The enumeration value pair defines two things: a required string value and
                    # an optional integer value. The string value defines the necessary query
                    # term required to retrieve that item, such as *p0* for a priority item.
                    # The integer value determines the ranking of that string value relative
                    # to other enumerated values for the same property. For example, you might
                    # associate *p0* with *0* and define another enum pair such as *p1* and *1*.
                    # You must use the integer value in combination with
                    # ordered
                    # ranking to
                    # set the ranking of a given value relative to other enumerated values for
                    # the same property name. Here, a ranking order of DESCENDING for *priority*
                    # properties results in a ranking boost for items indexed with a value of
                    # *p0* compared to items indexed with a value of *p1*. Without a specified
                    # ranking order, the integer value has no effect on item ranking.
                  &quot;integerValue&quot;: 42, # The integer value of the EnumValuePair which must be non-negative.
                      # Optional.
                  &quot;stringValue&quot;: &quot;A String&quot;, # The string value of the EnumValuePair.
                      # The maximum length is 32 characters.
                },
              ],
              &quot;orderedRanking&quot;: &quot;A String&quot;, # Used to specify the ordered ranking for the enumeration that determines how
                  # the integer values provided in the possible EnumValuePairs are used to rank
                  # results. If specified, integer values must be provided for all possible
                  # EnumValuePair values given for this property. Can only be used if
                  # isRepeatable
                  # is false.
              &quot;operatorOptions&quot;: { # Used to provide a search operator for enum properties. This is # If set, describes how the enum should be used as a search operator.
                  # optional. Search operators let users restrict the query to specific fields
                  # relevant to the type of item being searched. For example, if you provide no
                  # operator for a *priority* enum property with possible values *p0* and *p1*,
                  # a query that contains the term *p0* returns items that have *p0* as the
                  # value of the *priority* property, as well as any items that contain the
                  # string *p0* in other fields. If you provide an operator name for the enum,
                  # such as *priority*, then search users can use that operator to refine
                  # results to only items that have *p0* as this property&#x27;s value, with the
                  # query *priority:p0*.
                &quot;operatorName&quot;: &quot;A String&quot;, # Indicates the operator name required in the query in order to isolate the
                    # enum property. For example, if operatorName is *priority* and the
                    # property&#x27;s name is *priorityVal*, then queries like
                    # *priority:&amp;lt;value&amp;gt;* show results only where the value of the
                    # property named *priorityVal* matches *&amp;lt;value&amp;gt;*. By contrast, a
                    # search that uses the same *&amp;lt;value&amp;gt;* without an operator returns
                    # all items where *&amp;lt;value&amp;gt;* matches the value of any String
                    # properties or text within the content field for the item.
                    # The operator name can only contain lowercase letters (a-z).
                    # The maximum length is 32 characters.
              },
            },
            &quot;displayOptions&quot;: { # The display options for a property. # Options that determine how the property is displayed in the Cloud Search
                # results page if it is specified to be displayed in the object&#x27;s
                # display options
                # .
              &quot;displayLabel&quot;: &quot;A String&quot;, # The user friendly label for the property that is used if the property
                  # is specified to be displayed in ObjectDisplayOptions. If provided, the
                  # display label is shown in front of the property values when the property is
                  # part of the object display options. For example, if the property value is
                  # &#x27;1&#x27;, the value by itself may not be useful context for the user. If the
                  # display name given was &#x27;priority&#x27;, then the user sees &#x27;priority : 1&#x27; in
                  # the search results which provides clear context to search users. This is
                  # OPTIONAL; if not given, only the property values are displayed.
                  # The maximum length is 64 characters.
            },
            &quot;datePropertyOptions&quot;: { # Options for date properties.
              &quot;operatorOptions&quot;: { # Optional. Provides a search operator for date properties. # If set, describes how the date should be used as a search operator.
                  # Search operators let users restrict the query to specific fields relevant
                  # to the type of item being searched.
                &quot;greaterThanOperatorName&quot;: &quot;A String&quot;, # Indicates the operator name required in the query in order to isolate the
                    # date property using the greater-than operator. For example, if
                    # greaterThanOperatorName is *closedafter* and the property&#x27;s name is
                    # *closeDate*, then queries like *closedafter:&amp;lt;value&amp;gt;*
                    # show results only where the value of the property named *closeDate* is
                    # later than *&amp;lt;value&amp;gt;*.
                    # The operator name can only contain lowercase letters (a-z).
                    # The maximum length is 32 characters.
                &quot;lessThanOperatorName&quot;: &quot;A String&quot;, # Indicates the operator name required in the query in order to isolate the
                    # date property using the less-than operator. For example, if
                    # lessThanOperatorName is *closedbefore* and the property&#x27;s name is
                    # *closeDate*, then queries like *closedbefore:&amp;lt;value&amp;gt;*
                    # show results only where the value of the property named *closeDate* is
                    # earlier than *&amp;lt;value&amp;gt;*.
                    # The operator name can only contain lowercase letters (a-z).
                    # The maximum length is 32 characters.
                &quot;operatorName&quot;: &quot;A String&quot;, # Indicates the actual string required in the query in order to isolate the
                    # date property. For example, suppose an issue tracking schema object
                    # has a property named *closeDate* that specifies an operator with an
                    # operatorName of *closedon*. For searches on that data, queries like
                    # *closedon:&amp;lt;value&amp;gt;* show results only where the value of the
                    # *closeDate* property matches *&amp;lt;value&amp;gt;*. By contrast, a
                    # search that uses the same *&amp;lt;value&amp;gt;* without an operator returns
                    # all items where *&amp;lt;value&amp;gt;* matches the value of any String
                    # properties or text within the content field for the indexed datasource.
                    # The operator name can only contain lowercase letters (a-z).
                    # The maximum length is 32 characters.
              },
            },
            &quot;isFacetable&quot;: True or False, # Indicates that the property can be used for generating facets. Cannot be
                # true for properties whose type is object. IsReturnable must be true to set
                # this option.
                # Only supported for Boolean, Enum, and Text properties.
            &quot;isSortable&quot;: True or False, # Indicates that the property can be used for sorting. Cannot be true for
                # properties that are repeatable. Cannot be true for properties whose type
                # is object or user identifier. IsReturnable must be true to set this option.
                # Only supported for Boolean, Date, Double, Integer, and Timestamp
                # properties.
            &quot;isReturnable&quot;: True or False, # Indicates that the property identifies data that should be returned in
                # search results via the Query API. If set to *true*, indicates that Query
                # API users can use matching property fields in results. However, storing
                # fields requires more space allocation and uses more bandwidth for search
                # queries, which impacts performance over large datasets. Set to *true* here
                # only if the field is needed for search results. Cannot be true for
                # properties whose type is an object.
            &quot;name&quot;: &quot;A String&quot;, # The name of the property. Item indexing requests sent to the Indexing API
                # should set the property name
                # equal to this value. For example, if name is *subject_line*, then indexing
                # requests for document items with subject fields should set the
                # name for that field equal to
                # *subject_line*. Use the name as the identifier for the object property.
                # Once registered as a property for an object, you cannot re-use this name
                # for another property within that object.
                # The name must start with a letter and can only contain letters (A-Z, a-z)
                # or numbers (0-9).
                # The maximum length is 256 characters.
            &quot;booleanPropertyOptions&quot;: { # Options for boolean properties.
              &quot;operatorOptions&quot;: { # Used to provide a search operator for boolean properties. This is # If set, describes how the boolean should be used as a search operator.
                  # optional. Search operators let users restrict the query to specific fields
                  # relevant to the type of item being searched.
                &quot;operatorName&quot;: &quot;A String&quot;, # Indicates the operator name required in the query in order to isolate the
                    # boolean property. For example, if operatorName is *closed* and the
                    # property&#x27;s name is *isClosed*, then queries like
                    # *closed:&amp;lt;value&amp;gt;* show results only where the value of the
                    # property named *isClosed* matches *&amp;lt;value&amp;gt;*. By contrast, a
                    # search that uses the same *&amp;lt;value&amp;gt;* without an operator returns
                    # all items where *&amp;lt;value&amp;gt;* matches the value of any
                    # String properties or text within the content field for the item.
                    # The operator name can only contain lowercase letters (a-z).
                    # The maximum length is 32 characters.
              },
            },
            &quot;timestampPropertyOptions&quot;: { # Options for timestamp properties.
              &quot;operatorOptions&quot;: { # Used to provide a search operator for timestamp properties. This is # If set, describes how the timestamp should be used as a search operator.
                  # optional. Search operators let users restrict the query to specific fields
                  # relevant to the type of item being searched.
                &quot;lessThanOperatorName&quot;: &quot;A String&quot;, # Indicates the operator name required in the query in order to isolate the
                    # timestamp property using the less-than operator. For example, if
                    # lessThanOperatorName is *closedbefore* and the property&#x27;s name is
                    # *closeDate*, then queries like *closedbefore:&amp;lt;value&amp;gt;*
                    # show results only where the value of the property named *closeDate* is
                    # earlier than *&amp;lt;value&amp;gt;*.
                    # The operator name can only contain lowercase letters (a-z).
                    # The maximum length is 32 characters.
                &quot;operatorName&quot;: &quot;A String&quot;, # Indicates the operator name required in the query in order to isolate the
                    # timestamp property. For example, if operatorName is *closedon* and the
                    # property&#x27;s name is *closeDate*, then queries like
                    # *closedon:&amp;lt;value&amp;gt;* show results only where the value of the
                    # property named *closeDate* matches *&amp;lt;value&amp;gt;*. By contrast, a
                    # search that uses the same *&amp;lt;value&amp;gt;* without an operator returns
                    # all items where *&amp;lt;value&amp;gt;* matches the value of any String
                    # properties or text within the content field for the item. The operator
                    # name can only contain lowercase letters (a-z). The maximum length is 32
                    # characters.
                &quot;greaterThanOperatorName&quot;: &quot;A String&quot;, # Indicates the operator name required in the query in order to isolate the
                    # timestamp property using the greater-than operator. For example, if
                    # greaterThanOperatorName is *closedafter* and the property&#x27;s name is
                    # *closeDate*, then queries like *closedafter:&amp;lt;value&amp;gt;*
                    # show results only where the value of the property named *closeDate* is
                    # later than *&amp;lt;value&amp;gt;*.
                    # The operator name can only contain lowercase letters (a-z).
                    # The maximum length is 32 characters.
              },
            },
            &quot;doublePropertyOptions&quot;: { # Options for double properties.
              &quot;operatorOptions&quot;: { # Used to provide a search operator for double properties. This is # If set, describes how the double should be used as a search operator.
                  # optional. Search operators let users restrict the query to specific fields
                  # relevant to the type of item being searched.
                &quot;operatorName&quot;: &quot;A String&quot;, # Indicates the operator name required in the query in order to use the
                    # double property in sorting or as a facet.
                    # The operator name can only contain lowercase letters (a-z).
                    # The maximum length is 32 characters.
              },
            },
          },
        ],
        &quot;name&quot;: &quot;A String&quot;, # Name for the object, which then defines its type. Item indexing requests
            # should set the
            # objectType field
            # equal to this value. For example, if *name* is *Document*, then indexing
            # requests for items of type Document should set
            # objectType equal to
            # *Document*. Each object definition must be uniquely named within a schema.
            # The name must start with a letter and can only contain letters (A-Z, a-z)
            # or numbers (0-9).
            # The maximum length is 256 characters.
      },
    ],
  }</pre>
</div>

<div class="method">
    <code class="details" id="updateSchema">updateSchema(name, body=None, x__xgafv=None)</code>
  <pre>Updates the schema of a data source. This method does not perform
incremental updates to the schema. Instead, this method updates the schema
by overwriting the entire schema.

**Note:** This API requires an admin or service account to execute.

Args:
  name: string, Name of the data source to update Schema.  Format:
datasources/{source_id} (required)
  body: object, The request body.
    The object takes the form of:

{
    &quot;debugOptions&quot;: { # Shared request debug options for all cloudsearch RPC methods. # Common debug options.
      &quot;enableDebugging&quot;: True or False, # If you are asked by Google to help with debugging, set this field.
          # Otherwise, ignore this field.
    },
    &quot;validateOnly&quot;: True or False, # If true, the schema will be checked for validity,
        # but will not be registered with the data source, even if valid.
    &quot;schema&quot;: { # The schema definition for a data source. # The new schema for the source.
      &quot;operationIds&quot;: [ # IDs of the Long Running Operations (LROs) currently running for this
          # schema. After modifying the schema, wait for operations to complete
          # before indexing additional content.
        &quot;A String&quot;,
      ],
      &quot;objectDefinitions&quot;: [ # The list of top-level objects for the data source.
          # The maximum number of elements is 10.
        { # The definition for an object within a data source.
          &quot;options&quot;: { # The options for an object. # The optional object-specific options.
            &quot;displayOptions&quot;: { # The display options for an object. # Options that determine how the object is displayed in the Cloud Search
                # results page.
              &quot;objectDisplayLabel&quot;: &quot;A String&quot;, # The user friendly label to display in the search result to indicate the
                  # type of the item. This is OPTIONAL; if not provided, an object label isn&#x27;t
                  # displayed on the context line of the search results. The maximum length
                  # is 64 characters.
              &quot;metalines&quot;: [ # Defines the properties that are displayed in the metalines of the
                  # search results. The property values are displayed in the order given
                  # here. If a property holds multiple values, all of the values are
                  # displayed before the next properties. For this reason, it is a good
                  # practice to specify singular properties before repeated properties in this
                  # list. All of the properties must set
                  # is_returnable
                  # to true. The maximum number of metalines is 3.
                { # A metaline is a list of properties that are displayed along with the search
                    # result to provide context.
                  &quot;properties&quot;: [ # The list of displayed properties for the metaline. The maximum number of
                      # properties is 5.
                    { # A reference to a top-level property within the object that should be
                        # displayed in search results. The values of the chosen properties is
                        # displayed in the search results along with the
                        # display label
                        # for that property if one is specified. If a display label is not specified,
                        # only the values is shown.
                      &quot;propertyName&quot;: &quot;A String&quot;, # The name of the top-level property as defined in a property definition
                          # for the object. If the name is not a defined property in the schema, an
                          # error is given when attempting to update the schema.
                    },
                  ],
                },
              ],
            },
            &quot;freshnessOptions&quot;: { # Indicates which freshness property to use when adjusting search ranking for # The freshness options for an object.
                # an item. Fresher, more recent dates indicate higher quality. Use the
                # freshness option property that best works with your data. For fileshare
                # documents, last modified time is most relevant. For calendar event data,
                # the time when the event occurs is a more relevant freshness indicator. In
                # this way, calendar events that occur closer to the time of the search query
                # are considered higher quality and ranked accordingly.
              &quot;freshnessDuration&quot;: &quot;A String&quot;, # The duration after which an object should be considered
                  # stale. The default value is 180 days (in seconds).
              &quot;freshnessProperty&quot;: &quot;A String&quot;, # This property indicates the freshness level of the object in the index.
                  # If set, this property must be a top-level property within the
                  # property definitions
                  # and it must be a
                  # timestamp type
                  # or
                  # date type.
                  # Otherwise, the Indexing API uses
                  # updateTime
                  # as the freshness indicator.
                  # The maximum length is 256 characters.
                  #
                  # When a property is used to calculate freshness, the value defaults
                  # to 2 years from the current time.
            },
          },
          &quot;propertyDefinitions&quot;: [ # The property definitions for the object.
              # The maximum number of elements is 1000.
            { # The definition of a property within an object.
              &quot;textPropertyOptions&quot;: { # Options for text properties.
                &quot;operatorOptions&quot;: { # Used to provide a search operator for text properties. This is optional. # If set, describes how the property should be used as a search operator.
                    # Search operators let users restrict the query to specific fields relevant
                    # to the type of item being searched.
                  &quot;operatorName&quot;: &quot;A String&quot;, # Indicates the operator name required in the query in order to isolate the
                      # text property. For example, if operatorName is *subject* and the
                      # property&#x27;s name is *subjectLine*, then queries like
                      # *subject:&amp;lt;value&amp;gt;* show results only where the value of the
                      # property named *subjectLine* matches *&amp;lt;value&amp;gt;*. By contrast, a
                      # search that uses the same *&amp;lt;value&amp;gt;* without an operator returns
                      # all items where *&amp;lt;value&amp;gt;* matches the value of any
                      # text properties or text within the content field for the item.
                      # The operator name can only contain lowercase letters (a-z).
                      # The maximum length is 32 characters.
                  &quot;exactMatchWithOperator&quot;: True or False, # If true, the text value is tokenized as one atomic value in
                      # operator searches and facet matches. For example, if the operator name is
                      # &quot;genre&quot; and the value is &quot;science-fiction&quot; the query restrictions
                      # &quot;genre:science&quot; and &quot;genre:fiction&quot; doesn&#x27;t match the item;
                      # &quot;genre:science-fiction&quot; does. Value matching is case-sensitive
                      # and does not remove special characters.
                      # If false, the text is tokenized. For example, if the value is
                      # &quot;science-fiction&quot; the queries &quot;genre:science&quot; and &quot;genre:fiction&quot;
                      # matches the item.
                },
                &quot;retrievalImportance&quot;: { # Indicates the search quality importance of the tokens within the
                    # field when used for retrieval.
                  &quot;importance&quot;: &quot;A String&quot;, # Indicates the ranking importance given to property when it is matched
                      # during retrieval. Once set, the token importance of a property cannot be
                      # changed.
                },
              },
              &quot;isWildcardSearchable&quot;: True or False, # Indicates that users can perform wildcard search for this
                  # property. Only supported for Text properties. IsReturnable must be true to
                  # set this option. In a given datasource maximum of 5 properties can be
                  # marked as is_wildcard_searchable.
              &quot;isRepeatable&quot;: True or False, # Indicates that multiple values are allowed for the property. For example, a
                  # document only has one description but can have multiple comments. Cannot be
                  # true for properties whose type is a boolean.
                  # If set to false, properties that contain more than one value cause the
                  # indexing request for that item to be rejected.
              &quot;objectPropertyOptions&quot;: { # Options for object properties.
                &quot;subobjectProperties&quot;: [ # The properties of the sub-object. These properties represent a nested
                    # object. For example, if this property represents a postal address, the
                    # subobjectProperties might be named *street*, *city*, and *state*.
                    # The maximum number of elements is 1000.
                  # Object with schema name: PropertyDefinition
                ],
              },
              &quot;isSuggestable&quot;: True or False, # Indicates that the property can be used for generating query suggestions.
              &quot;htmlPropertyOptions&quot;: { # Options for html properties.
                &quot;retrievalImportance&quot;: { # Indicates the search quality importance of the tokens within the
                    # field when used for retrieval. Can only be set to DEFAULT or NONE.
                  &quot;importance&quot;: &quot;A String&quot;, # Indicates the ranking importance given to property when it is matched
                      # during retrieval. Once set, the token importance of a property cannot be
                      # changed.
                },
                &quot;operatorOptions&quot;: { # Used to provide a search operator for html properties. This is optional. # If set, describes how the property should be used as a search operator.
                    # Search operators let users restrict the query to specific fields relevant
                    # to the type of item being searched.
                  &quot;operatorName&quot;: &quot;A String&quot;, # Indicates the operator name required in the query in order to isolate the
                      # html property. For example, if operatorName is *subject* and the
                      # property&#x27;s name is *subjectLine*, then queries like
                      # *subject:&amp;lt;value&amp;gt;* show results only where the value of the
                      # property named *subjectLine* matches *&amp;lt;value&amp;gt;*. By contrast, a
                      # search that uses the same *&amp;lt;value&amp;gt;* without an operator return
                      # all items where *&amp;lt;value&amp;gt;* matches the value of any
                      # html properties or text within the content field for the item.
                      # The operator name can only contain lowercase letters (a-z).
                      # The maximum length is 32 characters.
                },
              },
              &quot;integerPropertyOptions&quot;: { # Options for integer properties.
                &quot;operatorOptions&quot;: { # Used to provide a search operator for integer properties. This is # If set, describes how the integer should be used as a search operator.
                    # optional. Search operators let users restrict the query to specific fields
                    # relevant to the type of item being searched.
                  &quot;lessThanOperatorName&quot;: &quot;A String&quot;, # Indicates the operator name required in the query in order to isolate the
                      # integer property using the less-than operator. For example, if
                      # lessThanOperatorName is *prioritybelow* and the property&#x27;s name is
                      # *priorityVal*, then queries like *prioritybelow:&amp;lt;value&amp;gt;*
                      # show results only where the value of the property named *priorityVal* is
                      # less than *&amp;lt;value&amp;gt;*.
                      # The operator name can only contain lowercase letters (a-z).
                      # The maximum length is 32 characters.
                  &quot;operatorName&quot;: &quot;A String&quot;, # Indicates the operator name required in the query in order to isolate the
                      # integer property. For example, if operatorName is *priority* and the
                      # property&#x27;s name is *priorityVal*, then queries like
                      # *priority:&amp;lt;value&amp;gt;* show results only where the value of the
                      # property named *priorityVal* matches *&amp;lt;value&amp;gt;*. By contrast, a
                      # search that uses the same *&amp;lt;value&amp;gt;* without an operator returns
                      # all items where *&amp;lt;value&amp;gt;* matches the value of any String
                      # properties or text within the content field for the item.
                      # The operator name can only contain lowercase letters (a-z).
                      # The maximum length is 32 characters.
                  &quot;greaterThanOperatorName&quot;: &quot;A String&quot;, # Indicates the operator name required in the query in order to isolate the
                      # integer property using the greater-than operator. For example, if
                      # greaterThanOperatorName is *priorityabove* and the property&#x27;s name is
                      # *priorityVal*, then queries like *priorityabove:&amp;lt;value&amp;gt;*
                      # show results only where the value of the property named *priorityVal* is
                      # greater than *&amp;lt;value&amp;gt;*.
                      # The operator name can only contain lowercase letters (a-z).
                      # The maximum length is 32 characters.
                },
                &quot;minimumValue&quot;: &quot;A String&quot;, # The minimum value of the property. The minimum and maximum values for the
                    # property are used to rank results according to the
                    # ordered ranking.
                    # Indexing requests with values less than the minimum are accepted and
                    # ranked with the same weight as items indexed with the minimum value.
                &quot;orderedRanking&quot;: &quot;A String&quot;, # Used to specify the ordered ranking for the integer. Can only be used if
                    # isRepeatable
                    # is false.
                &quot;maximumValue&quot;: &quot;A String&quot;, # The maximum value of the property. The minimum and maximum values for the
                    # property are used to rank results according to the
                    # ordered ranking.
                    # Indexing requests with values greater than the maximum are accepted and
                    # ranked with the same weight as items indexed with the maximum value.
              },
              &quot;enumPropertyOptions&quot;: { # Options for enum properties, which allow you to define a restricted set of
                  # strings to match user queries, set rankings for those string values, and
                  # define an operator name to be paired with those strings so that users can
                  # narrow results to only items with a specific value. For example, for items in
                  # a request tracking system with priority information, you could define *p0* as
                  # an allowable enum value and tie this enum to the operator name *priority* so
                  # that search users could add *priority:p0* to their query to restrict the set
                  # of results to only those items indexed with the value *p0*.
                &quot;possibleValues&quot;: [ # The list of possible values for the enumeration property. All
                    # EnumValuePairs must provide a string value. If you specify an integer value
                    # for one EnumValuePair, then all possible EnumValuePairs must provide an
                    # integer value. Both the string value and integer value must be unique over
                    # all possible values. Once set, possible values cannot be removed or
                    # modified. If you supply an ordered ranking and think you might insert
                    # additional enum values in the future, leave gaps in the initial integer
                    # values to allow adding a value in between previously registered values.
                    # The maximum number of elements is 100.
                  { # The enumeration value pair defines two things: a required string value and
                      # an optional integer value. The string value defines the necessary query
                      # term required to retrieve that item, such as *p0* for a priority item.
                      # The integer value determines the ranking of that string value relative
                      # to other enumerated values for the same property. For example, you might
                      # associate *p0* with *0* and define another enum pair such as *p1* and *1*.
                      # You must use the integer value in combination with
                      # ordered
                      # ranking to
                      # set the ranking of a given value relative to other enumerated values for
                      # the same property name. Here, a ranking order of DESCENDING for *priority*
                      # properties results in a ranking boost for items indexed with a value of
                      # *p0* compared to items indexed with a value of *p1*. Without a specified
                      # ranking order, the integer value has no effect on item ranking.
                    &quot;integerValue&quot;: 42, # The integer value of the EnumValuePair which must be non-negative.
                        # Optional.
                    &quot;stringValue&quot;: &quot;A String&quot;, # The string value of the EnumValuePair.
                        # The maximum length is 32 characters.
                  },
                ],
                &quot;orderedRanking&quot;: &quot;A String&quot;, # Used to specify the ordered ranking for the enumeration that determines how
                    # the integer values provided in the possible EnumValuePairs are used to rank
                    # results. If specified, integer values must be provided for all possible
                    # EnumValuePair values given for this property. Can only be used if
                    # isRepeatable
                    # is false.
                &quot;operatorOptions&quot;: { # Used to provide a search operator for enum properties. This is # If set, describes how the enum should be used as a search operator.
                    # optional. Search operators let users restrict the query to specific fields
                    # relevant to the type of item being searched. For example, if you provide no
                    # operator for a *priority* enum property with possible values *p0* and *p1*,
                    # a query that contains the term *p0* returns items that have *p0* as the
                    # value of the *priority* property, as well as any items that contain the
                    # string *p0* in other fields. If you provide an operator name for the enum,
                    # such as *priority*, then search users can use that operator to refine
                    # results to only items that have *p0* as this property&#x27;s value, with the
                    # query *priority:p0*.
                  &quot;operatorName&quot;: &quot;A String&quot;, # Indicates the operator name required in the query in order to isolate the
                      # enum property. For example, if operatorName is *priority* and the
                      # property&#x27;s name is *priorityVal*, then queries like
                      # *priority:&amp;lt;value&amp;gt;* show results only where the value of the
                      # property named *priorityVal* matches *&amp;lt;value&amp;gt;*. By contrast, a
                      # search that uses the same *&amp;lt;value&amp;gt;* without an operator returns
                      # all items where *&amp;lt;value&amp;gt;* matches the value of any String
                      # properties or text within the content field for the item.
                      # The operator name can only contain lowercase letters (a-z).
                      # The maximum length is 32 characters.
                },
              },
              &quot;displayOptions&quot;: { # The display options for a property. # Options that determine how the property is displayed in the Cloud Search
                  # results page if it is specified to be displayed in the object&#x27;s
                  # display options
                  # .
                &quot;displayLabel&quot;: &quot;A String&quot;, # The user friendly label for the property that is used if the property
                    # is specified to be displayed in ObjectDisplayOptions. If provided, the
                    # display label is shown in front of the property values when the property is
                    # part of the object display options. For example, if the property value is
                    # &#x27;1&#x27;, the value by itself may not be useful context for the user. If the
                    # display name given was &#x27;priority&#x27;, then the user sees &#x27;priority : 1&#x27; in
                    # the search results which provides clear context to search users. This is
                    # OPTIONAL; if not given, only the property values are displayed.
                    # The maximum length is 64 characters.
              },
              &quot;datePropertyOptions&quot;: { # Options for date properties.
                &quot;operatorOptions&quot;: { # Optional. Provides a search operator for date properties. # If set, describes how the date should be used as a search operator.
                    # Search operators let users restrict the query to specific fields relevant
                    # to the type of item being searched.
                  &quot;greaterThanOperatorName&quot;: &quot;A String&quot;, # Indicates the operator name required in the query in order to isolate the
                      # date property using the greater-than operator. For example, if
                      # greaterThanOperatorName is *closedafter* and the property&#x27;s name is
                      # *closeDate*, then queries like *closedafter:&amp;lt;value&amp;gt;*
                      # show results only where the value of the property named *closeDate* is
                      # later than *&amp;lt;value&amp;gt;*.
                      # The operator name can only contain lowercase letters (a-z).
                      # The maximum length is 32 characters.
                  &quot;lessThanOperatorName&quot;: &quot;A String&quot;, # Indicates the operator name required in the query in order to isolate the
                      # date property using the less-than operator. For example, if
                      # lessThanOperatorName is *closedbefore* and the property&#x27;s name is
                      # *closeDate*, then queries like *closedbefore:&amp;lt;value&amp;gt;*
                      # show results only where the value of the property named *closeDate* is
                      # earlier than *&amp;lt;value&amp;gt;*.
                      # The operator name can only contain lowercase letters (a-z).
                      # The maximum length is 32 characters.
                  &quot;operatorName&quot;: &quot;A String&quot;, # Indicates the actual string required in the query in order to isolate the
                      # date property. For example, suppose an issue tracking schema object
                      # has a property named *closeDate* that specifies an operator with an
                      # operatorName of *closedon*. For searches on that data, queries like
                      # *closedon:&amp;lt;value&amp;gt;* show results only where the value of the
                      # *closeDate* property matches *&amp;lt;value&amp;gt;*. By contrast, a
                      # search that uses the same *&amp;lt;value&amp;gt;* without an operator returns
                      # all items where *&amp;lt;value&amp;gt;* matches the value of any String
                      # properties or text within the content field for the indexed datasource.
                      # The operator name can only contain lowercase letters (a-z).
                      # The maximum length is 32 characters.
                },
              },
              &quot;isFacetable&quot;: True or False, # Indicates that the property can be used for generating facets. Cannot be
                  # true for properties whose type is object. IsReturnable must be true to set
                  # this option.
                  # Only supported for Boolean, Enum, and Text properties.
              &quot;isSortable&quot;: True or False, # Indicates that the property can be used for sorting. Cannot be true for
                  # properties that are repeatable. Cannot be true for properties whose type
                  # is object or user identifier. IsReturnable must be true to set this option.
                  # Only supported for Boolean, Date, Double, Integer, and Timestamp
                  # properties.
              &quot;isReturnable&quot;: True or False, # Indicates that the property identifies data that should be returned in
                  # search results via the Query API. If set to *true*, indicates that Query
                  # API users can use matching property fields in results. However, storing
                  # fields requires more space allocation and uses more bandwidth for search
                  # queries, which impacts performance over large datasets. Set to *true* here
                  # only if the field is needed for search results. Cannot be true for
                  # properties whose type is an object.
              &quot;name&quot;: &quot;A String&quot;, # The name of the property. Item indexing requests sent to the Indexing API
                  # should set the property name
                  # equal to this value. For example, if name is *subject_line*, then indexing
                  # requests for document items with subject fields should set the
                  # name for that field equal to
                  # *subject_line*. Use the name as the identifier for the object property.
                  # Once registered as a property for an object, you cannot re-use this name
                  # for another property within that object.
                  # The name must start with a letter and can only contain letters (A-Z, a-z)
                  # or numbers (0-9).
                  # The maximum length is 256 characters.
              &quot;booleanPropertyOptions&quot;: { # Options for boolean properties.
                &quot;operatorOptions&quot;: { # Used to provide a search operator for boolean properties. This is # If set, describes how the boolean should be used as a search operator.
                    # optional. Search operators let users restrict the query to specific fields
                    # relevant to the type of item being searched.
                  &quot;operatorName&quot;: &quot;A String&quot;, # Indicates the operator name required in the query in order to isolate the
                      # boolean property. For example, if operatorName is *closed* and the
                      # property&#x27;s name is *isClosed*, then queries like
                      # *closed:&amp;lt;value&amp;gt;* show results only where the value of the
                      # property named *isClosed* matches *&amp;lt;value&amp;gt;*. By contrast, a
                      # search that uses the same *&amp;lt;value&amp;gt;* without an operator returns
                      # all items where *&amp;lt;value&amp;gt;* matches the value of any
                      # String properties or text within the content field for the item.
                      # The operator name can only contain lowercase letters (a-z).
                      # The maximum length is 32 characters.
                },
              },
              &quot;timestampPropertyOptions&quot;: { # Options for timestamp properties.
                &quot;operatorOptions&quot;: { # Used to provide a search operator for timestamp properties. This is # If set, describes how the timestamp should be used as a search operator.
                    # optional. Search operators let users restrict the query to specific fields
                    # relevant to the type of item being searched.
                  &quot;lessThanOperatorName&quot;: &quot;A String&quot;, # Indicates the operator name required in the query in order to isolate the
                      # timestamp property using the less-than operator. For example, if
                      # lessThanOperatorName is *closedbefore* and the property&#x27;s name is
                      # *closeDate*, then queries like *closedbefore:&amp;lt;value&amp;gt;*
                      # show results only where the value of the property named *closeDate* is
                      # earlier than *&amp;lt;value&amp;gt;*.
                      # The operator name can only contain lowercase letters (a-z).
                      # The maximum length is 32 characters.
                  &quot;operatorName&quot;: &quot;A String&quot;, # Indicates the operator name required in the query in order to isolate the
                      # timestamp property. For example, if operatorName is *closedon* and the
                      # property&#x27;s name is *closeDate*, then queries like
                      # *closedon:&amp;lt;value&amp;gt;* show results only where the value of the
                      # property named *closeDate* matches *&amp;lt;value&amp;gt;*. By contrast, a
                      # search that uses the same *&amp;lt;value&amp;gt;* without an operator returns
                      # all items where *&amp;lt;value&amp;gt;* matches the value of any String
                      # properties or text within the content field for the item. The operator
                      # name can only contain lowercase letters (a-z). The maximum length is 32
                      # characters.
                  &quot;greaterThanOperatorName&quot;: &quot;A String&quot;, # Indicates the operator name required in the query in order to isolate the
                      # timestamp property using the greater-than operator. For example, if
                      # greaterThanOperatorName is *closedafter* and the property&#x27;s name is
                      # *closeDate*, then queries like *closedafter:&amp;lt;value&amp;gt;*
                      # show results only where the value of the property named *closeDate* is
                      # later than *&amp;lt;value&amp;gt;*.
                      # The operator name can only contain lowercase letters (a-z).
                      # The maximum length is 32 characters.
                },
              },
              &quot;doublePropertyOptions&quot;: { # Options for double properties.
                &quot;operatorOptions&quot;: { # Used to provide a search operator for double properties. This is # If set, describes how the double should be used as a search operator.
                    # optional. Search operators let users restrict the query to specific fields
                    # relevant to the type of item being searched.
                  &quot;operatorName&quot;: &quot;A String&quot;, # Indicates the operator name required in the query in order to use the
                      # double property in sorting or as a facet.
                      # The operator name can only contain lowercase letters (a-z).
                      # The maximum length is 32 characters.
                },
              },
            },
          ],
          &quot;name&quot;: &quot;A String&quot;, # Name for the object, which then defines its type. Item indexing requests
              # should set the
              # objectType field
              # equal to this value. For example, if *name* is *Document*, then indexing
              # requests for items of type Document should set
              # objectType equal to
              # *Document*. Each object definition must be uniquely named within a schema.
              # The name must start with a letter and can only contain letters (A-Z, a-z)
              # or numbers (0-9).
              # The maximum length is 256 characters.
        },
      ],
    },
  }

  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # This resource represents a long-running operation that is the result of a
      # network API call.
    &quot;response&quot;: { # The normal response of the operation in case of success.  If the original
        # method returns no data on success, such as `Delete`, the response is
        # `google.protobuf.Empty`.  If the original method is standard
        # `Get`/`Create`/`Update`, the response should be the resource.  For other
        # methods, the response should have the type `XxxResponse`, where `Xxx`
        # is the original method name.  For example, if the original method name
        # is `TakeSnapshot()`, the inferred response type is
        # `TakeSnapshotResponse`.
      &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
    },
    &quot;name&quot;: &quot;A String&quot;, # The server-assigned name, which is only unique within the same service that
        # originally returns it. If you use the default HTTP mapping, the
        # `name` should be a resource name ending with `operations/{unique_id}`.
    &quot;error&quot;: { # The `Status` type defines a logical error model that is suitable for # The error result of the operation in case of failure or cancellation.
        # different programming environments, including REST APIs and RPC APIs. It is
        # used by [gRPC](https://github.com/grpc). Each `Status` message contains
        # three pieces of data: error code, error message, and error details.
        #
        # You can find out more about this error model and how to work with it in the
        # [API Design Guide](https://cloud.google.com/apis/design/errors).
      &quot;details&quot;: [ # A list of messages that carry the error details.  There is a common set of
          # message types for APIs to use.
        {
          &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
        },
      ],
      &quot;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
      &quot;message&quot;: &quot;A String&quot;, # A developer-facing error message, which should be in English. Any
          # user-facing error message should be localized and sent in the
          # google.rpc.Status.details field, or localized by the client.
    },
    &quot;metadata&quot;: { # Service-specific metadata associated with the operation.  It typically
        # contains progress information and common metadata such as create time.
        # Some services might not provide such metadata.  Any method that returns a
        # long-running operation should document the metadata type, if any.
      &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
    },
    &quot;done&quot;: True or False, # If the value is `false`, it means the operation is still in progress.
        # If `true`, the operation is completed, and either `error` or `response` is
        # available.
  }</pre>
</div>

</body></html>