Skip to content

Filtering

A filter provides criteria for selecting entries used in a query. Unfiltered search includes all entries in the index. A filter scopes a search query to a subset of documents.

It is possible to use filtering in multiple ways:

  • use OData for filtering by every filterable property. See filterable properties in search schema.
    Complex to use but gives you full control.
  • use custom filter properties for filtering. See request structure here Simplified usage without Azure Search internal know-how.
  • use facets filter properties. For filtering by facets it's necessary to use property filterPropertyName and query from Search facet response. See Facets. Simplified usage without Azure Search internal know-how.

Warning

It is highly recommended to use the simplified option we offer: Facet responses give you all the information you need for filtering, and almost all scenarios (even range facets) can be covered by simply applying
GET &{filterPropertyName}={query}&containedInPlace=osm_51701 or
POST "{filterPropertyName}"="{query}","containedInPlace"="osm_51701",

Filtering samples

Filtering by categoryTree with odata filters

link:

https://api.discover.swiss/info/v2/search?resultsPerPage=5&currentPage=1&filters=categoryTree/any(category: category eq 'ch_root|ch_01|ch_0101')

link:

https://api.discover.swiss/info/v2/search

body:

  {
      "resultsPerPage": 5,
      "currentPage": 1,
      "filters": "categoryTree/any(category: category eq 'ch_root|ch_01|ch_0101')"
  }

Filtering by Category(-ies) (request parameter)

link:

https://api.discover.swiss/info/v2/search?categoryTree=ch_root|ch_01|ch_0101|ch_010102&categoryTree=ch_root|ch_01|ch_0101|ch_010105

link:

https://api.discover.swiss/info/v2/search

body:

{
  "categoryTree": ["ch_root|ch_01|ch_0101|ch_010102", "ch_root|ch_01|ch_0101|ch_010105"]
}

Filtering by Types and Datasources

link:

https://api.discover.swiss/info/v2/search?Type=Tour&type=Place&datasource=ZHT-CMS&datasource=oua

link:

https://api.discover.swiss/info/v2/search

body:

{
  "type":["Place", "Tour"],
  "datasource": ["oua", "ZHT-CMS"]
}

Filtering by CombinedType

link:

https://api.discover.swiss/info/v2/search?combinedType=LodgingBusiness&combinedType=Webcam

link:

  https://api.discover.swiss/info/v2/search

body:

{
  "combinedType":["LodgingBusiness", "Webcam"]
}

Filtering by the time range

link:

https://api.discover.swiss/info/v2/search?type=Tour&filters=((time gt 50) and (time lt 60)) or ((time gt 100) and (time lt 150))

link:

  https://api.discover.swiss/info/v2/search

body:

{
  "type":"Tour",
  "filters": "((time gt 50) and (time lt 60)) or ((time gt 100) and (time lt 150))"
}

Filtering by review

If place contains review with reviewed items hasReview is true otherwise false.

link:

https://api.discover.swiss/info/v2/search?type=Tour&filters=hasReview eq 'true'

link:

  https://api.discover.swiss/info/v2/search

body:

{
  "type":"Place",
  "filters": "(hasReview eq 'true')"
}

Filtering by geo with odatafilters

Search Api supports geo-spatial queries in OData filter expressions via the geo.distance and geo.intersects functions. The geo.distance function returns the distance in kilometers between two points, one being a field or range variable, and one being a constant passed as part of the filter. The geo.intersects function returns true if a given point is within a given polygon, where the point is a field or range variable and the polygon is specified as a constant passed as part of the filter.

Filtering can be applied to geo and geoDestination:

  • geo: indicates the starting point of a tour and the location on all other entities.
  • geoDestination: represents the end (last point) of a Tour and therefore is only available on Tour objects.

Filtering by distance

The geo.distance function takes two parameters of type Edm.GeographyPoint and returns an Edm.Double value which is the distance between them in kilometers. This differs from other services that support OData geo-spatial operations, which typically return distances in meters.

One of the parameters to geo.distance must be a geography point constant, and the other must be a field path (or a range variable in the case of a filter iterating over a field of type Collection(Edm.GeographyPoint)). The order of these parameters doesn't matter.

The geography point constant is of the form geography'POINT(longitude latitude)', where the longitude and latitude are numeric constants.

Warning

When using geo.distance in a filter, you must compare the distance returned by the function with a constant using lt (lower than), le (lower or equal), gt (greater than), or ge (greater or equal). The operators eq and ne are not supported when comparing distances.

Find entities by location:

https://api.discover.swiss/info/v2/search?type=Event&filters=geo.distance(geo, geography'POINT(8.185059 47.387525)') le 5

Find tours which start OR end nearby a location:

https://api.discover.swiss/info/v2/search?type=Tour&filters=geo.distance(geo, geography'POINT(8.185059 47.387525)') le 5 or geo.distance(geoDestination, geography'POINT(8.1734492 47.3907669)') le 5

Find tours which start AND end nearby a location:

https://api.discover.swiss/info/v2/search?type=Tour&filters=geo.distance(geo, geography'POINT(8.185059 47.387525)') le 5 and geo.distance(geoDestination, geography'POINT(8.1734492 47.3907669)') le 5

link:

https://api.discover.swiss/info/v2/search

body:

Find entities by location:

{
  "type":"Event",
  "filters": "geo.distance(geo, geography'POINT(8.185059 47.387525)') le 5"
}

Find tours which start OR end nearby a location:

{
  "type":"Tour",
  "filters": "geo.distance(geo, geography'POINT(8.185059 47.387525)') le 5 OR geo.distance(geoDestination, geography'POINT(8.1734492 47.3907669)') le 5"
}

Find tours which start AND end nearby a location:

{
  "type":"Tour",
  "filters": "geo.distance(geo, geography'POINT(8.185059 47.387525)') le 5 AND geo.distance(geoDestination, geography'POINT(8.1734492 47.3907669)') le 5"
}

Filtering by polygons

The geo.intersects function takes a variable of type Edm.GeographyPoint and a constant Edm.GeographyPolygon and returns an Edm.Boolean -- true if the point is within the boundary of the polygon, false otherwise.

Warning

Note that the polygon is closed (the first and last points from the set must be the same)

link:

https://api.discover.swiss/info/v2/search?type=Event&filters=geo.intersects(geo, geography'POLYGON((10.089265201049788 46.71781861975809,10.056649539428694 46.70487120366226, 10.058709475952131 46.68285346787033, 10.083772036987288 46.67449144159856, 10.117760989624006 46.680027012226006, 10.121537539916975 46.706048369837056,10.089265201049788 46.71781861975809))')

link:

https://api.discover.swiss/info/v2/search

body:

{
  "type":"Event",
  "filters": "geo.intersects(geo, geography'POLYGON((10.089265201049788 46.71781861975809,10.056649539428694 46.70487120366226, 10.058709475952131 46.68285346787033, 10.083772036987288 46.67449144159856, 10.117760989624006 46.680027012226006, 10.121537539916975 46.706048369837056,10.089265201049788 46.71781861975809))')"
}

Filtering by hasGeoShape

Filtering by hasGeoShape property allows to filter data which have geo shape (such as box, circle, line, polygon or multiline) and can be displayed on the map.

link:

https://api.discover.swiss/info/v2/search?type=Tour&hasGeoShape=true

link:

https://api.discover.swiss/info/v2/search

body:

{
  "type": "Tour",
  "hasGeoShape": "true"
}

Filtering by schedule

Info

An event occurrs once in our search result no matter if it has many occurrences. An exception is the creation of Search to PDF, there we flatten the occurrences to be able to create an Event calendar where all event occurrences appear on the correct date.

Filtering by schedule start and end dates has the problem that you can get events scheduled by day in a range where it does not occur. (example: occurs all year every Monday and you filter Tuesday to Friday in 1 week. The event is in the result although it does not really occur on these days.)

To solve this problem for most use cases we added the filtering by scheduleStart and scheduleEnd which works fine but has some disadvantages as well: The filter is applied after loading the events from the search and therefor the count is not correct anymore. Client applications must consider this.

Detailed filtering by schedule is only available by creating your own filters property (see below),

Filtering by scheduleStart and scheduleEnd

Warning

Using this filter option results in not accurate counts and paging behavior, a client application using this filter should not display counts and page numbers, but implement a "next page" behavior.

Remark: schedule dates are date only and in swiss time zone and dates are applied with event-date is less or equals scheduleStart and event-date is greater or equals scheduleEnd.

https://api.discover.swiss/info/v2/search?project=demo-web&type=Event&scheduleStart=2026-06-23&scheduleEnd=2026-06-24
https://api.discover.swiss/info/v2/search
{
  "type": "Event",
  "scheduleStart":"2026-06-23",
  "scheduleEnd":"2026-06-23",
  "project": [
    "demo-web"
  ]
}

Filteting by schedule/byDay

https://api.discover.swiss/info/v2/search?Type=Event&filters=schedule/any(item: item/byDay/any(day: day eq 'Monday'))
https://api.discover.swiss/info/v2/search
{
  "type": "Event",
  "filters": "schedule/any(item: item/byDay/any(day: day eq 'Monday'))"
}

Filtering by schedule/startDate and schedule/endDate

Properties schedule/startDate and schedule/endDate has DateTimeOffset type and value for filtering should be presented in the following format: yyyy-mm-ddThh:mm:ss('.'s+)?(zzzzzz)

Timezone use cases in filter value:

  • yyyy-mm-ddThh:mm:ss.000001Z - where Z - UTC timezone
  • yyyy-mm-ddThh:mm:ss+00:00 - where 00:00 - UTC timezone
  • yyyy-mm-ddThh:mm:ss.000001-02:00 - where UTC-02:00
  • yyyy-mm-ddThh:mm:ss+06:00 - where UTC+06:00

Warning

Symbol + in GET query string should be encoded to %2B. E.g. filters=schedule/any(item: item/startDate lt 2020-04-14T00:00:00%2B02:00)

https://api.discover.swiss/info/v2/search?Type=Event&filters=schedule/any(item: item/startDate lt 2020-04-14T00:00:00Z)
or
https://api.discover.swiss/info/v2/search?Type=Event&filters=schedule/any(item: item/endDate ge 2020-04-14T00:00:00Z)

or

https://api.discover.swiss/info/v2/search?Type=Event&filters=schedule/any(item: item/startDate lt 2020-01-01T00:00:00Z and item/endDate ge 2020-04-01T00:00:00Z)

https://api.discover.swiss/info/v2/search

{
  "type": "Event",
  "filters": "schedule/any(item: item/startDate lt 2020-04-14T00:00:00Z)"
}
or

{
  "type": "Event",
  "filters": "schedule/any(item: item/endDate ge 2020-04-14T00:00:00Z)"
}
or

{
  "type": "Event",
  "filters": "schedule/any(item: item/startDate lt 2020-01-01T00:00:00Z and item/endDate ge 2020-04-01T00:00:00Z)"
}

Filtering by schedule/startTime and schedule/endTime

Azure Search doesn't support TimeSpan and that is why it is presented as string. That is why filtering available only for strings.

https://api.discover.swiss/info/v2/search?Type=Event&filters=schedule/any(item: item/startTime eq '12:00:00')
or

https://api.discover.swiss/info/v2/search?Type=Event&filters=schedule/any(item: item/endTime eq '12:00:00')
https://api.discover.swiss/info/v2/search

{
  "type": "Event",
  "filters": "schedule/any(item: item/startTime eq '12:00:00')"
}
or

{
  "type": "Event",
  "filters": "schedule/any(item: item/endTime eq '12:00:00')"
}

Filtering by lastModified

Property lastModified has DateTimeOffset type and value for filtering should be presented in the following format: yyyy-mm-ddThh:mm:ss('.'s+)?(zzzzzz)

Timezone use cases in filter value:

  • yyyy-mm-ddThh:mm:ss.000001Z - where Z - UTC timezone
  • yyyy-mm-ddThh:mm:ss+00:00 - where 00:00 - UTC timezone
  • yyyy-mm-ddThh:mm:ss.000001-02:00 - where UTC-02:00
  • yyyy-mm-ddThh:mm:ss+06:00 - where UTC+06:00

Warning

Symbol + in GET query string should be encoded to %2B. E.g. filters=lastModified lt 2020-04-14T00:00:00%2B02:00

link:

https://api.discover.swiss/info/v2/search?filters=lastModified lt 2020-04-14T00:00:00Z
or
https://api.discover.swiss/info/v2/search?filters=lastModified ge 2020-04-14T00:00:00Z

or

https://api.discover.swiss/info/v2/search?filters=lastModified lt 2020-01-01T00:00:00Z and lastModified ge 2020-04-01T00:00:00Z

link:

https://api.discover.swiss/info/v2/search

body:

{
  "filters": "lastModified lt 2020-04-14T00:00:00Z"
}
or

{
  "filters": "lastModified ge 2020-04-14T00:00:00Z"
}
or

{
  "filters": "lastModified lt 2020-01-01T00:00:00Z and lastModified ge 2020-04-01T00:00:00Z"
}

OData filtering

You can read more about OData specification here

Structure samples

OData filter structure for property

identifier eq 'tou_4kq_bhgdcfdb'

OData filter structure for sub-property

address/addressLocality eq 'Martina'

OData filter structure for array

results/any(item: item eq 'something')

OData filter structure for sub-property in array

categoryTree/any(category: category eq 'ZHT-CMS_restaurants' or category eq 'TSVM-OUA_14359510')