Commands: Querying: How to work with Facet query?

There are two methods that allow you to send a Facet query to a database:
- GetFacets
- GetMultiFacets

GetFacets

There are two overloads for the GetFacets method and the only difference between them is a source of the facets. In one facets are passed as a parameter, in the other user must provide a key to a facet setup document.

Syntax

FacetResults GetFacets(
	string index,
	IndexQuery query,
	List<Facet> facets,
	int start = 0,
	int? pageSize = null);

FacetResults GetFacets(
	string index,
	IndexQuery query,
	string facetSetupDoc,
	int start = 0,
	int? pageSize = null);
Parameters
index string A name of an index to query
query IndexQuery A query definition containing all information required to query a specified index.
facets List<Facet> List of facets required to perform a facet query (mutually exclusive with facetSetupDoc).
facetSetupDoc string Document key that contains predefined FacetSetup (mutually exclusive with facets).
start int number of results that should be skipped. Default: 0.
pageSize int maximum number of results that will be retrieved. Default: null.
Return Value
FacetResults Facet query results containing query Duration and a list of Results - one entry for each term/range as specified in [FacetSetup] document or passed in parameters.

Example I

// For the Manufacturer field look at the documents and return a count for each unique Term found
// For the Cost field, return the count of the following ranges:
//		Cost <= 200.0
//		200.0 <= Cost <= 400.0
//		400.0 <= Cost <= 600.0
//		600.0 <= Cost <= 800.0
//		Cost >= 800.0
// For the Megapixels field, return the count of the following ranges:
//		Megapixels <= 3.0
//		3.0 <= Megapixels <= 7.0
//		7.0 <= Megapixels <= 10.0
//		Megapixels >= 10.0
FacetResults facetResults = store
	.DatabaseCommands
	.GetFacets(
		"Camera/Costs",
		new IndexQuery(),
		new List<Facet>
			{
				new Facet
				{
					Name = "Manufacturer"
				},
				new Facet
				{
					Name = "Cost_Range",
					Mode = FacetMode.Ranges,
					Ranges =
					{
						"[NULL TO Dx200.0]",
						"[Dx300.0 TO Dx400.0]",
						"[Dx500.0 TO Dx600.0]",
						"[Dx700.0 TO Dx800.0]",
						"[Dx900.0 TO NULL]"
					}
				},
				new Facet
				{
					Name = "Megapixels_Range",
					Mode = FacetMode.Ranges,
					Ranges =
					{
						"[NULL TO Dx3.0]",
						"[Dx4.0 TO Dx7.0]",
						"[Dx8.0 TO Dx10.0]",
						"[Dx11.0 TO NULL]"
					}
				}
			});

FacetResult manufacturerResults = facetResults.Results["Manufacturer"];
FacetResult costResults = facetResults.Results["Cost_Range"];
FacetResult megapixelResults = facetResults.Results["Megapixels_Range"];

Example II

// For the Manufacturer field look at the documents and return a count for each unique Term found
// For the Cost field, return the count of the following ranges:
//		Cost <= 200.0
//		200.0 <= Cost <= 400.0
//		400.0 <= Cost <= 600.0
//		600.0 <= Cost <= 800.0
//		Cost >= 800.0
// For the Megapixels field, return the count of the following ranges:
//		Megapixels <= 3.0
//		3.0 <= Megapixels <= 7.0
//		7.0 <= Megapixels <= 10.0
//		Megapixels >= 10.0
store.DatabaseCommands.Put(
	"facets/CameraFacets",
	null,
	RavenJObject.FromObject(
		new FacetSetup
		{
			Id = "facets/CameraFacets",
			Facets =
				new List<Facet>
					{
						new Facet
						{
							Name = "Manufacturer"
						},
						new Facet
						{
							Name = "Cost_Range",
							Mode = FacetMode.Ranges,
							Ranges =
							{
								"[NULL TO Dx200.0]",
								"[Dx300.0 TO Dx400.0]",
								"[Dx500.0 TO Dx600.0]",
								"[Dx700.0 TO Dx800.0]",
								"[Dx900.0 TO NULL]"
							}
						},
						new Facet
						{
							Name = "Megapixels_Range",
							Mode = FacetMode.Ranges,
							Ranges =
							{
								"[NULL TO Dx3.0]", 
								"[Dx4.0 TO Dx7.0]", 
								"[Dx8.0 TO Dx10.0]", 
								"[Dx11.0 TO NULL]"
							}
						}
					}
		}),
	new RavenJObject());

FacetResults facetResults = store
	.DatabaseCommands
	.GetFacets("Camera/Costs", new IndexQuery(), "facets/CameraFacets");

FacetResult manufacturerResults = facetResults.Results["Manufacturer"];
FacetResult costResults = facetResults.Results["Cost_Range"];
FacetResult megapixelResults = facetResults.Results["Megapixels_Range"];

GetMultiFacets

Sending multiple facet queries is achievable by using GetMultiFacets method.

Syntax

FacetResults[] GetMultiFacets(FacetQuery[] facetedQueries);
Parameters
facetedQueries FacetQuery[] List of the faceted queries that will be executed on the server-side.
Return Value
FacetResult[] List of the results, each matching position of a FacetQuery in the facetedQueries parameter.

Example

FacetResults[] facetResults = store
	.DatabaseCommands
	.GetMultiFacets(
		new[]
		{
			new FacetQuery
			{
				IndexName = "Camera/Costs",
				FacetSetupDoc = "facets/CameraFacets1", 
				Query = new IndexQuery()
			},
			new FacetQuery
			{
				IndexName = "Camera/Costs",
				FacetSetupDoc = "facets/CameraFacets2", 
				Query = new IndexQuery()
			},
			new FacetQuery
			{
				IndexName = "Camera/Costs",
				FacetSetupDoc = "facets/CameraFacets3", 
				Query = new IndexQuery()
			}
		});

Dictionary<string, FacetResult> facetResults1 = facetResults[0].Results;
Dictionary<string, FacetResult> facetResults2 = facetResults[1].Results;
Dictionary<string, FacetResult> facetResults3 = facetResults[2].Results;