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());
+ }
}