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 few overloads for the GetFacets method and the main 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
public FacetResults getFacets(String index, IndexQuery query, List<Facet> facets) ;
public FacetResults getFacets(String index, IndexQuery query, List<Facet> facets, int start) ;
public FacetResults getFacets(String index, IndexQuery query, List<Facet> facets, int start, Integer pageSize) ;
public FacetResults getFacets(String index, IndexQuery query, String facetSetupDoc);
public FacetResults getFacets(String index, IndexQuery query, String facetSetupDoc, int start);
public FacetResults getFacets(String index, IndexQuery query, String facetSetupDoc, int start, Integer pageSize);
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
Facet facet1 = new Facet();
facet1.setName("Manufacturer");
Facet facet2 = new Facet();
facet2.setName("Cost_Range");
facet2.setMode(FacetMode.RANGES);
facet2.setRanges(Arrays.asList("[NULL TO Dx200.0]",
"[Dx300.0 TO Dx400.0]",
"[Dx500.0 TO Dx600.0]",
"[Dx700.0 TO Dx800.0]",
"[Dx900.0 TO NULL]"));
Facet facet3 = new Facet();
facet3.setName("Megapixels_Range");
facet3.setMode(FacetMode.RANGES);
facet3.setRanges(Arrays.asList( "[NULL TO Dx3.0]",
"[Dx4.0 TO Dx7.0]",
"[Dx8.0 TO Dx10.0]",
"[Dx11.0 TO NULL]"));
List<Facet> facets = Arrays.asList(facet1, facet2, facet3);
FacetResults facetResults = store.getDatabaseCommands().getFacets("Camera/Costs", new IndexQuery(), facets);
FacetResult manufacturerResults = facetResults.getResults().get("Manufacturer");
FacetResult costResults = facetResults.getResults().get("Cost_Range");
FacetResult megapixelResults = facetResults.getResults().get("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
Facet facet1 = new Facet();
facet1.setName("Manufacturer");
Facet facet2 = new Facet();
facet2.setName("Cost_Range");
facet2.setMode(FacetMode.RANGES);
facet2.setRanges(Arrays.asList("[NULL TO Dx200.0]",
"[Dx300.0 TO Dx400.0]",
"[Dx500.0 TO Dx600.0]",
"[Dx700.0 TO Dx800.0]",
"[Dx900.0 TO NULL]"));
Facet facet3 = new Facet();
facet3.setName("Megapixels_Range");
facet3.setMode(FacetMode.RANGES);
facet3.setRanges(Arrays.asList( "[NULL TO Dx3.0]",
"[Dx4.0 TO Dx7.0]",
"[Dx8.0 TO Dx10.0]",
"[Dx11.0 TO NULL]"));
List<Facet> facets = Arrays.asList(facet1, facet2, facet3);
FacetSetup facetsSetup = new FacetSetup("facets/CameraFacets", facets);
store.getDatabaseCommands().put("facets/CameraFacets", null, RavenJObject.fromObject(facetsSetup), new RavenJObject());
FacetResults facetResults = store.getDatabaseCommands().getFacets("Camera/Costs", new IndexQuery(), "facets/CameraFacets");
FacetResult manufacturerResults = facetResults.getResults().get("Manufacturer");
FacetResult costResults = facetResults.getResults().get("Cost_Range");
FacetResult megapixelResults = facetResults.getResults().get("Megapixels_Range");
GetMultiFacets
Sending multiple facet queries is achievable by using GetMultiFacets
method.
Syntax
public 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
FacetQuery facetsQuery1 = new FacetQuery();
facetsQuery1.setIndexName("Camera/Costs");
facetsQuery1.setFacetSetupDoc("facets/CameraFacets1");
facetsQuery1.setQuery(new IndexQuery());
FacetQuery facetsQuery2 = new FacetQuery();
facetsQuery2.setIndexName("Camera/Costs");
facetsQuery2.setFacetSetupDoc("facets/CameraFacets2");
facetsQuery2.setQuery(new IndexQuery());
FacetQuery facetsQuery3 = new FacetQuery();
facetsQuery3.setIndexName("Camera/Costs");
facetsQuery3.setFacetSetupDoc("facets/CameraFacets3");
facetsQuery3.setQuery(new IndexQuery());
FacetResults[] facetResults = store.getDatabaseCommands().getMultiFacets(new FacetQuery[] {
facetsQuery1, facetsQuery2, facetsQuery3
});
Map<String, FacetResult> facetResults1 = facetResults[0].getResults();
Map<String, FacetResult> facetResults2 = facetResults[1].getResults();
Map<String, FacetResult> facetResults3 = facetResults[2].getResults();