From 4b87f63bed54353df505df28004ce67a364a2a39 Mon Sep 17 00:00:00 2001 From: kimchy Date: Thu, 16 Sep 2010 15:11:30 +0200 Subject: [PATCH] Terms Facet: Allow to provide `_index` as the field, resulting in facets on indices, closes #374. --- .../facets/terms/IndexNameFacetCollector.java | 59 +++++++++++++++++++ .../terms/TermsFacetCollectorParser.java | 5 ++ .../search/facets/SimpleFacetsTests.java | 41 +++++++++++++ 3 files changed, 105 insertions(+) create mode 100644 modules/elasticsearch/src/main/java/org/elasticsearch/search/facets/terms/IndexNameFacetCollector.java diff --git a/modules/elasticsearch/src/main/java/org/elasticsearch/search/facets/terms/IndexNameFacetCollector.java b/modules/elasticsearch/src/main/java/org/elasticsearch/search/facets/terms/IndexNameFacetCollector.java new file mode 100644 index 00000000000..7768f1db7a4 --- /dev/null +++ b/modules/elasticsearch/src/main/java/org/elasticsearch/search/facets/terms/IndexNameFacetCollector.java @@ -0,0 +1,59 @@ +/* + * Licensed to Elastic Search and Shay Banon under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Elastic Search licenses this + * file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.elasticsearch.search.facets.terms; + +import org.apache.lucene.index.IndexReader; +import org.elasticsearch.common.collect.Sets; +import org.elasticsearch.search.facets.Facet; +import org.elasticsearch.search.facets.support.AbstractFacetCollector; + +import java.io.IOException; + +/** + * @author kimchy (shay.banon) + */ +public class IndexNameFacetCollector extends AbstractFacetCollector { + + private final String indexName; + + private final InternalTermsFacet.ComparatorType comparatorType; + + private final int size; + + private int count = 0; + + public IndexNameFacetCollector(String facetName, String indexName, TermsFacet.ComparatorType comparatorType, int size) { + super(facetName); + this.indexName = indexName; + this.comparatorType = comparatorType; + this.size = size; + } + + @Override protected void doSetNextReader(IndexReader reader, int docBase) throws IOException { + } + + @Override protected void doCollect(int doc) throws IOException { + count++; + } + + @Override public Facet facet() { + return new InternalTermsFacet(facetName, "_index", comparatorType, size, Sets.newHashSet(new TermsFacet.Entry(indexName, count))); + } +} diff --git a/modules/elasticsearch/src/main/java/org/elasticsearch/search/facets/terms/TermsFacetCollectorParser.java b/modules/elasticsearch/src/main/java/org/elasticsearch/search/facets/terms/TermsFacetCollectorParser.java index 4e474ecba38..f1229acd1d0 100644 --- a/modules/elasticsearch/src/main/java/org/elasticsearch/search/facets/terms/TermsFacetCollectorParser.java +++ b/modules/elasticsearch/src/main/java/org/elasticsearch/search/facets/terms/TermsFacetCollectorParser.java @@ -84,6 +84,11 @@ public class TermsFacetCollectorParser implements FacetCollectorParser { } } } + + if ("_index".equals(field)) { + return new IndexNameFacetCollector(facetName, context.shardTarget().index(), comparatorType, size); + } + Pattern pattern = null; if (regex != null) { pattern = Regex.compile(regex, regexFlags); diff --git a/modules/test/integration/src/test/java/org/elasticsearch/test/integration/search/facets/SimpleFacetsTests.java b/modules/test/integration/src/test/java/org/elasticsearch/test/integration/search/facets/SimpleFacetsTests.java index f6b4a6bf58f..7deeb700406 100644 --- a/modules/test/integration/src/test/java/org/elasticsearch/test/integration/search/facets/SimpleFacetsTests.java +++ b/modules/test/integration/src/test/java/org/elasticsearch/test/integration/search/facets/SimpleFacetsTests.java @@ -120,6 +120,47 @@ public class SimpleFacetsTests extends AbstractNodesTests { assertThat(facet.entries().get(0).count(), equalTo(2)); } + @Test public void testTermsIndexFacet() throws Exception { + try { + client.admin().indices().prepareDelete("test1").execute().actionGet(); + client.admin().indices().prepareDelete("test2").execute().actionGet(); + } catch (Exception e) { + // ignore + } + client.admin().indices().prepareCreate("test1").execute().actionGet(); + client.admin().indices().prepareCreate("test2").execute().actionGet(); + client.admin().cluster().prepareHealth().setWaitForGreenStatus().execute().actionGet(); + + client.prepareIndex("test1", "type1").setSource(jsonBuilder().startObject() + .field("stag", "111") + .endObject()).execute().actionGet(); + + client.prepareIndex("test1", "type1").setSource(jsonBuilder().startObject() + .field("stag", "111") + .endObject()).execute().actionGet(); + + client.prepareIndex("test2", "type1").setSource(jsonBuilder().startObject() + .field("stag", "111") + .endObject()).execute().actionGet(); + client.admin().indices().prepareFlush().setRefresh(true).execute().actionGet(); + + + SearchResponse searchResponse = client.prepareSearch() + .setSize(0) + .setQuery(matchAllQuery()) + .addFacet(termsFacet("facet1").field("_index").size(10)) + .execute().actionGet(); + + + TermsFacet facet = searchResponse.facets().facet("facet1"); + assertThat(facet.name(), equalTo("facet1")); + assertThat(facet.entries().size(), equalTo(2)); + assertThat(facet.entries().get(0).term(), equalTo("test1")); + assertThat(facet.entries().get(0).count(), equalTo(2)); + assertThat(facet.entries().get(1).term(), equalTo("test2")); + assertThat(facet.entries().get(1).count(), equalTo(1)); + } + @Test public void testFilterFacets() throws Exception { try { client.admin().indices().prepareDelete("test").execute().actionGet();