You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by mi...@apache.org on 2018/06/27 19:57:33 UTC

lucene-solr:master: LUCENE-8367: make per-dimension drill down optional for each facet dimension

Repository: lucene-solr
Updated Branches:
  refs/heads/master 39fb4b8a1 -> e8d105740


LUCENE-8367: make per-dimension drill down optional for each facet dimension


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/e8d10574
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/e8d10574
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/e8d10574

Branch: refs/heads/master
Commit: e8d1057403b98dce08341c26b73724222d4a42b5
Parents: 39fb4b8
Author: Mike McCandless <mi...@apache.org>
Authored: Wed Jun 27 15:57:21 2018 -0400
Committer: Mike McCandless <mi...@apache.org>
Committed: Wed Jun 27 15:57:21 2018 -0400

----------------------------------------------------------------------
 lucene/CHANGES.txt                              |  4 ++
 .../org/apache/lucene/index/CheckIndex.java     | 13 +++++++
 .../org/apache/lucene/facet/FacetsConfig.java   | 37 +++++++++++++++++-
 .../apache/lucene/facet/range/DoubleRange.java  | 16 ++++++++
 .../apache/lucene/facet/range/LongRange.java    | 16 ++++++++
 .../writercache/LruTaxonomyWriterCache.java     |  1 +
 .../apache/lucene/facet/TestDrillDownQuery.java | 40 ++++++++++++++++++++
 .../facet/range/TestRangeFacetCounts.java       | 26 +++++++++++++
 8 files changed, 151 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/e8d10574/lucene/CHANGES.txt
----------------------------------------------------------------------
diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt
index 246df33..320d367 100644
--- a/lucene/CHANGES.txt
+++ b/lucene/CHANGES.txt
@@ -130,6 +130,10 @@ Changes in Runtime Behavior:
 * LUCENE-7976: TieredMergePolicy now respects maxSegmentSizeMB by default when executing
   findForcedMerges and findForcedDeletesMerges (Erick Erickson)
 
+Improvements
+
+* LUCENE-8367: Make per-dimension drill down optional for each facet dimension (Mike McCandless)
+
 Other:
 
 * LUCENE-8366: Upgrade to ICU 62.1. Emoji handling now uses Unicode 11's

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/e8d10574/lucene/core/src/java/org/apache/lucene/index/CheckIndex.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/index/CheckIndex.java b/lucene/core/src/java/org/apache/lucene/index/CheckIndex.java
index 9a4e3e5..e8abd0d 100644
--- a/lucene/core/src/java/org/apache/lucene/index/CheckIndex.java
+++ b/lucene/core/src/java/org/apache/lucene/index/CheckIndex.java
@@ -539,6 +539,19 @@ public final class CheckIndex implements Closeable {
       return result;
     }
 
+    if (infoStream != null) {
+      int maxDoc = 0;
+      int delCount = 0;
+      for (SegmentCommitInfo info : sis) {
+        maxDoc += info.info.maxDoc();
+        delCount += info.getDelCount();
+      }
+      infoStream.println(String.format(Locale.ROOT, "%.2f%% total deletions; %d documents; %d deleteions",
+                                       100.*delCount/maxDoc,
+                                       maxDoc,
+                                       delCount));
+    }
+    
     // find the oldest and newest segment versions
     Version oldest = null;
     Version newest = null;

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/e8d10574/lucene/facet/src/java/org/apache/lucene/facet/FacetsConfig.java
----------------------------------------------------------------------
diff --git a/lucene/facet/src/java/org/apache/lucene/facet/FacetsConfig.java b/lucene/facet/src/java/org/apache/lucene/facet/FacetsConfig.java
index ea67294..f958af1 100644
--- a/lucene/facet/src/java/org/apache/lucene/facet/FacetsConfig.java
+++ b/lucene/facet/src/java/org/apache/lucene/facet/FacetsConfig.java
@@ -82,6 +82,11 @@ public class FacetsConfig {
      *  is required, which is unusual (default is false). */
     public boolean requireDimCount;
 
+    /** True if drilling down by a whole dimension, to match all
+     *  documents that had any value for this dimension, is necessary
+     *  (default is true)*/
+    public boolean requireDimensionDrillDown = true;
+
     /** Actual field where this dimension's facet labels
      *  should be indexed */
     public String indexFieldName = DEFAULT_INDEX_FIELD_NAME;
@@ -164,6 +169,16 @@ public class FacetsConfig {
     ft.indexFieldName = indexFieldName;
   }
 
+  /** Specify whether drill down on just the dimension is necessary. */
+  public synchronized void setRequireDimensionDrillDown(String dimName, boolean v) {
+    DimConfig ft = fieldTypes.get(dimName);
+    if (ft == null) {
+      ft = new DimConfig();
+      fieldTypes.put(dimName, ft);
+    }
+    ft.requireDimensionDrillDown = v;
+  }
+
   /** Returns map of field name to {@link DimConfig}. */
   public Map<String,DimConfig> getDimConfigs() {
     return fieldTypes;
@@ -340,7 +355,13 @@ public class FacetsConfig {
         }
 
         // Drill down:
-        for (int i=1;i<=cp.length;i++) {
+        int start;
+        if (ft.requireDimensionDrillDown) {
+          start = 1;
+        } else {
+          start = 2;
+        }
+        for (int i=start;i<=cp.length;i++) {
           doc.add(new StringField(indexFieldName, pathToString(cp.components, i), Field.Store.NO));
         }
       }
@@ -368,7 +389,11 @@ public class FacetsConfig {
 
         // For drill-down:
         doc.add(new StringField(indexFieldName, fullPath, Field.Store.NO));
-        doc.add(new StringField(indexFieldName, facetField.dim, Field.Store.NO));
+
+        FacetsConfig.DimConfig ft = getDimConfig(facetField.dim);        
+        if (ft.requireDimensionDrillDown) {
+          doc.add(new StringField(indexFieldName, facetField.dim, Field.Store.NO));
+        }
       }
     }
   }
@@ -398,8 +423,16 @@ public class FacetsConfig {
         }
         System.arraycopy(field.assoc.bytes, field.assoc.offset, bytes, upto, field.assoc.length);
         upto += field.assoc.length;
+
+        FacetsConfig.DimConfig ft = getDimConfig(field.dim);        
         
         // Drill down:
+        int start;
+        if (ft.requireDimensionDrillDown) {
+          start = 1;
+        } else {
+          start = 2;
+        }
         for (int i = 1; i <= label.length; i++) {
           doc.add(new StringField(indexFieldName, pathToString(label.components, i), Field.Store.NO));
         }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/e8d10574/lucene/facet/src/java/org/apache/lucene/facet/range/DoubleRange.java
----------------------------------------------------------------------
diff --git a/lucene/facet/src/java/org/apache/lucene/facet/range/DoubleRange.java b/lucene/facet/src/java/org/apache/lucene/facet/range/DoubleRange.java
index 56910f2..3c51595 100644
--- a/lucene/facet/src/java/org/apache/lucene/facet/range/DoubleRange.java
+++ b/lucene/facet/src/java/org/apache/lucene/facet/range/DoubleRange.java
@@ -92,6 +92,22 @@ public final class DoubleRange extends Range {
     return "DoubleRange(" + label + ": " + min + " to " + max + ")";
   }
 
+  @Override
+  public boolean equals(Object _that) {
+    if (_that instanceof DoubleRange == false) {
+      return false;
+    }
+    DoubleRange that = (DoubleRange) _that;
+    return that.label.equals(this.label) &&
+      Double.compare(that.min, this.min) == 0 &&
+      Double.compare(that.max, this.max) == 0;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(label, min, max);
+  }
+
   private static class ValueSourceQuery extends Query {
     private final DoubleRange range;
     private final Query fastMatchQuery;

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/e8d10574/lucene/facet/src/java/org/apache/lucene/facet/range/LongRange.java
----------------------------------------------------------------------
diff --git a/lucene/facet/src/java/org/apache/lucene/facet/range/LongRange.java b/lucene/facet/src/java/org/apache/lucene/facet/range/LongRange.java
index 88b569d..6b711aa 100644
--- a/lucene/facet/src/java/org/apache/lucene/facet/range/LongRange.java
+++ b/lucene/facet/src/java/org/apache/lucene/facet/range/LongRange.java
@@ -84,6 +84,22 @@ public final class LongRange extends Range {
     return "LongRange(" + label + ": " + min + " to " + max + ")";
   }
 
+  @Override
+  public boolean equals(Object _that) {
+    if (_that instanceof LongRange == false) {
+      return false;
+    }
+    LongRange that = (LongRange) _that;
+    return that.label.equals(this.label) &&
+        that.min == this.min &&
+        that.max == this.max;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(label, min, max);
+  }
+
   private static class ValueSourceQuery extends Query {
     private final LongRange range;
     private final Query fastMatchQuery;

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/e8d10574/lucene/facet/src/java/org/apache/lucene/facet/taxonomy/writercache/LruTaxonomyWriterCache.java
----------------------------------------------------------------------
diff --git a/lucene/facet/src/java/org/apache/lucene/facet/taxonomy/writercache/LruTaxonomyWriterCache.java b/lucene/facet/src/java/org/apache/lucene/facet/taxonomy/writercache/LruTaxonomyWriterCache.java
index 1182ffd..a5f9a34 100644
--- a/lucene/facet/src/java/org/apache/lucene/facet/taxonomy/writercache/LruTaxonomyWriterCache.java
+++ b/lucene/facet/src/java/org/apache/lucene/facet/taxonomy/writercache/LruTaxonomyWriterCache.java
@@ -89,6 +89,7 @@ public class LruTaxonomyWriterCache implements TaxonomyWriterCache {
     cache = null;
   }
 
+  @Override
   public int size() {
     return cache.getSize();
   }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/e8d10574/lucene/facet/src/test/org/apache/lucene/facet/TestDrillDownQuery.java
----------------------------------------------------------------------
diff --git a/lucene/facet/src/test/org/apache/lucene/facet/TestDrillDownQuery.java b/lucene/facet/src/test/org/apache/lucene/facet/TestDrillDownQuery.java
index bf8d0f4..41d102f 100644
--- a/lucene/facet/src/test/org/apache/lucene/facet/TestDrillDownQuery.java
+++ b/lucene/facet/src/test/org/apache/lucene/facet/TestDrillDownQuery.java
@@ -252,4 +252,44 @@ public class TestDrillDownQuery extends FacetTestCase {
     Query rewrite = q.rewrite(reader).rewrite(reader);
     assertEquals(base, rewrite);
   }
+
+  public void testRequireDimensionDrillDown() throws Exception {
+    Directory dir = newDirectory();
+    RandomIndexWriter writer = new RandomIndexWriter(random(), dir, 
+                  newIndexWriterConfig(new MockAnalyzer(random(), MockTokenizer.KEYWORD, false)));
+    Directory taxoDir = newDirectory();
+    TaxonomyWriter taxoWriter = new DirectoryTaxonomyWriter(taxoDir);
+    FacetsConfig config = new FacetsConfig();
+
+    config.setRequireDimensionDrillDown("a", true);
+    config.setRequireDimensionDrillDown("b", false);
+
+    Document doc = new Document();
+    doc.add(new FacetField("a", "1"));
+    doc.add(new FacetField("b", "2"));
+    writer.addDocument(config.build(taxoWriter, doc));
+    taxoWriter.close();
+
+    IndexReader reader = writer.getReader();
+    DirectoryTaxonomyReader taxoReader = new DirectoryTaxonomyReader(taxoDir);
+    IndexSearcher searcher = newSearcher(reader);
+
+    DrillDownQuery q = new DrillDownQuery(config);
+    q.add("a", "1");
+    assertEquals(1, searcher.count(q));
+
+    q = new DrillDownQuery(config);
+    q.add("a");
+    assertEquals(1, searcher.count(q));
+
+    q = new DrillDownQuery(config);
+    q.add("b", "2");
+    assertEquals(1, searcher.count(q));
+
+    q = new DrillDownQuery(config);
+    q.add("b");
+    // no hits because we disabled dimension drill down for dimension "b":
+    assertEquals(0, searcher.count(q));
+    IOUtils.close(taxoReader, reader, writer, dir, taxoDir);
+  }
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/e8d10574/lucene/facet/src/test/org/apache/lucene/facet/range/TestRangeFacetCounts.java
----------------------------------------------------------------------
diff --git a/lucene/facet/src/test/org/apache/lucene/facet/range/TestRangeFacetCounts.java b/lucene/facet/src/test/org/apache/lucene/facet/range/TestRangeFacetCounts.java
index 8a7f913..f7f4b02 100644
--- a/lucene/facet/src/test/org/apache/lucene/facet/range/TestRangeFacetCounts.java
+++ b/lucene/facet/src/test/org/apache/lucene/facet/range/TestRangeFacetCounts.java
@@ -867,4 +867,30 @@ public class TestRangeFacetCounts extends FacetTestCase {
     writer.close();
     IOUtils.close(r, dir);
   }
+
+  public void testLongRangeEquals() throws Exception {
+    assertEquals(new LongRange("field", -7, true, 17, false),
+                 new LongRange("field", -7, true, 17, false));
+    assertEquals(new LongRange("field", -7, true, 17, false).hashCode(),
+                 new LongRange("field", -7, true, 17, false).hashCode());
+    assertFalse(new LongRange("field", -7, true, 17, false).equals(new LongRange("field", -7, true, 17, true)));
+    assertFalse(new LongRange("field", -7, true, 17, false).hashCode() ==
+                new LongRange("field", -7, true, 17, true).hashCode());
+    assertFalse(new LongRange("field", -7, true, 17, false).equals(new LongRange("field", -7, true, 18, false)));
+    assertFalse(new LongRange("field", -7, true, 17, false).hashCode() ==
+                new LongRange("field", -7, true, 18, false).hashCode());
+  }
+
+  public void testDoubleRangeEquals() throws Exception {
+    assertEquals(new DoubleRange("field", -7d, true, 17d, false),
+                 new DoubleRange("field", -7d, true, 17d, false));
+    assertEquals(new DoubleRange("field", -7d, true, 17d, false).hashCode(),
+                 new DoubleRange("field", -7d, true, 17d, false).hashCode());
+    assertFalse(new DoubleRange("field", -7d, true, 17d, false).equals(new DoubleRange("field", -7d, true, 17d, true)));
+    assertFalse(new DoubleRange("field", -7d, true, 17d, false).hashCode() ==
+                new DoubleRange("field", -7d, true, 17d, true).hashCode());
+    assertFalse(new DoubleRange("field", -7d, true, 17d, false).equals(new DoubleRange("field", -7d, true, 18d, false)));
+    assertFalse(new DoubleRange("field", -7d, true, 17d, false).hashCode() ==
+                new DoubleRange("field", -7d, true, 18, false).hashCode());
+  }
 }