You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucenenet.apache.org by ni...@apache.org on 2021/05/02 12:07:10 UTC

[lucenenet] branch master updated: Lucene.Net.Join: Moved entire namespace to Lucene.Net.Search.Join to match Lucene. Added duplicates of the public types in Lucene.Net.Join and marked them Obsolete and hidden from Intellisense so this is not a breaking change.

This is an automated email from the ASF dual-hosted git repository.

nightowl888 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/lucenenet.git


The following commit(s) were added to refs/heads/master by this push:
     new da70e1e  Lucene.Net.Join: Moved entire namespace to Lucene.Net.Search.Join to match Lucene. Added duplicates of the public types in Lucene.Net.Join and marked them Obsolete and hidden from Intellisense so this is not a breaking change.
da70e1e is described below

commit da70e1e4dfb8072b8fbe4884595ba7e27307be86
Author: Shad Storhaug <sh...@shadstorhaug.com>
AuthorDate: Sun May 2 17:13:44 2021 +0700

    Lucene.Net.Join: Moved entire namespace to Lucene.Net.Search.Join to match Lucene. Added duplicates of the public types in Lucene.Net.Join and marked them Obsolete and hidden from Intellisense so this is not a breaking change.
---
 src/Lucene.Net.Join/FakeScorer.cs                  |  4 +-
 .../FixedBitSetCachingWrapperFilter.cs             |  3 +-
 src/Lucene.Net.Join/JoinUtil.cs                    |  3 +-
 src/Lucene.Net.Join/Lucene.Net.Join.csproj         |  2 +
 src/Lucene.Net.Join/ScoreMode.cs                   |  2 +-
 .../FixedBitSetCachingWrapperFilter.cs             |  4 +-
 src/Lucene.Net.Join/{ => Support}/JoinUtil.cs      | 11 ++--
 src/Lucene.Net.Join/{ => Support}/ScoreMode.cs     |  3 ++
 .../{ => Support}/ToChildBlockJoinQuery.cs         | 29 ++++++-----
 .../{ => Support}/ToParentBlockJoinCollector.cs    | 16 +++---
 .../ToParentBlockJoinFieldComparator.cs            | 21 ++++----
 .../{ => Support}/ToParentBlockJoinQuery.cs        | 23 +++++----
 .../{ => Support}/ToParentBlockJoinSortField.cs    |  8 +--
 src/Lucene.Net.Join/TermsCollector.cs              |  3 +-
 src/Lucene.Net.Join/TermsIncludingScoreQuery.cs    |  5 +-
 src/Lucene.Net.Join/TermsQuery.cs                  |  5 +-
 src/Lucene.Net.Join/TermsWithScoreCollector.cs     |  3 +-
 src/Lucene.Net.Join/ToChildBlockJoinQuery.cs       |  2 +-
 src/Lucene.Net.Join/ToParentBlockJoinCollector.cs  |  4 +-
 .../ToParentBlockJoinFieldComparator.cs            |  3 +-
 src/Lucene.Net.Join/ToParentBlockJoinQuery.cs      |  3 +-
 src/Lucene.Net.Join/ToParentBlockJoinSortField.cs  |  3 +-
 src/Lucene.Net.Join/overview.md                    |  2 +-
 src/Lucene.Net.Join/package.md                     | 13 ++---
 .../Support/TestApiConsistency.cs                  | 36 ++++++-------
 .../{ => Support}/TestBlockJoin.cs                 | 11 ++--
 .../{ => Support}/TestBlockJoinSorting.cs          |  2 +
 .../{ => Support}/TestBlockJoinValidation.cs       |  9 ++--
 .../Support/TestExceptionSerialization.cs          |  2 +-
 .../{ => Support}/TestJoinUtil.cs                  | 59 +++++++++++-----------
 src/Lucene.Net.Tests.Join/TestBlockJoin.cs         |  4 +-
 src/Lucene.Net.Tests.Join/TestBlockJoinSorting.cs  |  4 +-
 .../TestBlockJoinValidation.cs                     |  4 +-
 src/Lucene.Net.Tests.Join/TestJoinUtil.cs          |  4 +-
 .../ExceptionHandling/TestExceptionExtensions.cs   |  2 +-
 websites/apidocs/docfx.join.json                   | 12 +++--
 36 files changed, 164 insertions(+), 160 deletions(-)

diff --git a/src/Lucene.Net.Join/FakeScorer.cs b/src/Lucene.Net.Join/FakeScorer.cs
index ea82400..4fb204f 100644
--- a/src/Lucene.Net.Join/FakeScorer.cs
+++ b/src/Lucene.Net.Join/FakeScorer.cs
@@ -1,9 +1,7 @@
 // Lucene version compatibility level 4.8.1
-using Lucene.Net.Search;
-using System;
 using System.Collections.Generic;
 
-namespace Lucene.Net.Join
+namespace Lucene.Net.Search.Join
 {
     /*
      * Licensed to the Apache Software Foundation (ASF) under one or more
diff --git a/src/Lucene.Net.Join/FixedBitSetCachingWrapperFilter.cs b/src/Lucene.Net.Join/FixedBitSetCachingWrapperFilter.cs
index ebfa668..7ec8841 100644
--- a/src/Lucene.Net.Join/FixedBitSetCachingWrapperFilter.cs
+++ b/src/Lucene.Net.Join/FixedBitSetCachingWrapperFilter.cs
@@ -1,9 +1,8 @@
 // Lucene version compatibility level 4.8.1
 using Lucene.Net.Index;
-using Lucene.Net.Search;
 using Lucene.Net.Util;
 
-namespace Lucene.Net.Join
+namespace Lucene.Net.Search.Join
 {
     /*
      * Licensed to the Apache Software Foundation (ASF) under one or more
diff --git a/src/Lucene.Net.Join/JoinUtil.cs b/src/Lucene.Net.Join/JoinUtil.cs
index 6034516..658ceaf 100644
--- a/src/Lucene.Net.Join/JoinUtil.cs
+++ b/src/Lucene.Net.Join/JoinUtil.cs
@@ -1,9 +1,8 @@
 // Lucene version compatibility level 4.8.1
-using Lucene.Net.Search;
 using System;
 using System.IO;
 
-namespace Lucene.Net.Join
+namespace Lucene.Net.Search.Join
 {
     /*
      * Licensed to the Apache Software Foundation (ASF) under one or more
diff --git a/src/Lucene.Net.Join/Lucene.Net.Join.csproj b/src/Lucene.Net.Join/Lucene.Net.Join.csproj
index 7f5f9fe..b26d13f 100644
--- a/src/Lucene.Net.Join/Lucene.Net.Join.csproj
+++ b/src/Lucene.Net.Join/Lucene.Net.Join.csproj
@@ -27,6 +27,8 @@
     <TargetFrameworks>netstandard2.1;netstandard2.0</TargetFrameworks>
     <TargetFrameworks Condition="$([MSBuild]::IsOsPlatform('Windows'))">$(TargetFrameworks);net45</TargetFrameworks>
 
+    <RootNamespace>Lucene.Net.Search.Join</RootNamespace>
+
     <AssemblyTitle>Lucene.Net.Join</AssemblyTitle>
     <Description>Index-time and Query-time joins for normalized content of the Lucene.Net full-text search engine library from The Apache Software Foundation.</Description>
     <PackageTags>$(PackageTags);join</PackageTags>
diff --git a/src/Lucene.Net.Join/ScoreMode.cs b/src/Lucene.Net.Join/ScoreMode.cs
index bbac796..f9d3360 100644
--- a/src/Lucene.Net.Join/ScoreMode.cs
+++ b/src/Lucene.Net.Join/ScoreMode.cs
@@ -1,6 +1,6 @@
 // Lucene version compatibility level 4.8.1
 
-namespace Lucene.Net.Join
+namespace Lucene.Net.Search.Join
 {
     /*
      * Licensed to the Apache Software Foundation (ASF) under one or more
diff --git a/src/Lucene.Net.Join/FixedBitSetCachingWrapperFilter.cs b/src/Lucene.Net.Join/Support/FixedBitSetCachingWrapperFilter.cs
similarity index 88%
copy from src/Lucene.Net.Join/FixedBitSetCachingWrapperFilter.cs
copy to src/Lucene.Net.Join/Support/FixedBitSetCachingWrapperFilter.cs
index ebfa668..c2e3bfe 100644
--- a/src/Lucene.Net.Join/FixedBitSetCachingWrapperFilter.cs
+++ b/src/Lucene.Net.Join/Support/FixedBitSetCachingWrapperFilter.cs
@@ -2,6 +2,7 @@
 using Lucene.Net.Index;
 using Lucene.Net.Search;
 using Lucene.Net.Util;
+using System;
 
 namespace Lucene.Net.Join
 {
@@ -26,12 +27,13 @@ namespace Lucene.Net.Join
     /// A <see cref="CachingWrapperFilter"/> that caches sets using a <see cref="FixedBitSet"/>,
     /// as required for joins. 
     /// </summary>
+    [Obsolete("Use Lucene.Net.Search.Join.FixedBitSetCachingWrapperFilter instead. This class will be removed in 4.8.0 release candidate."), System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
     public sealed class FixedBitSetCachingWrapperFilter : CachingWrapperFilter
     {
         /// <summary>
         /// Sole constructor, see <see cref="CachingWrapperFilter.CachingWrapperFilter(Filter)"/>.
         /// </summary>
-        public FixedBitSetCachingWrapperFilter(Filter filter) 
+        public FixedBitSetCachingWrapperFilter(Filter filter)
             : base(filter)
         {
         }
diff --git a/src/Lucene.Net.Join/JoinUtil.cs b/src/Lucene.Net.Join/Support/JoinUtil.cs
similarity index 79%
copy from src/Lucene.Net.Join/JoinUtil.cs
copy to src/Lucene.Net.Join/Support/JoinUtil.cs
index 6034516..4becb99 100644
--- a/src/Lucene.Net.Join/JoinUtil.cs
+++ b/src/Lucene.Net.Join/Support/JoinUtil.cs
@@ -23,10 +23,11 @@ namespace Lucene.Net.Join
      */
 
     /// <summary>
-    /// Utility for query time joining using <see cref="TermsQuery"/> and <see cref="TermsCollector"/>.
+    /// Utility for query time joining using <see cref="Lucene.Net.Search.Join.TermsQuery"/> and <see cref="Lucene.Net.Search.Join.TermsCollector"/>.
     /// 
     /// @lucene.experimental
     /// </summary>
+    [Obsolete("Use Lucene.Net.Search.Join.JoinUtil instead. This class will be removed in 4.8.0 release candidate."), System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
     public sealed class JoinUtil
     {
         // No instances allowed
@@ -64,15 +65,15 @@ namespace Lucene.Net.Join
             switch (scoreMode)
             {
                 case ScoreMode.None:
-                    TermsCollector termsCollector = TermsCollector.Create(fromField, multipleValuesPerDocument);
+                    Lucene.Net.Search.Join.TermsCollector termsCollector = Lucene.Net.Search.Join.TermsCollector.Create(fromField, multipleValuesPerDocument);
                     fromSearcher.Search(fromQuery, termsCollector);
-                    return new TermsQuery(toField, fromQuery, termsCollector.CollectorTerms);
+                    return new Lucene.Net.Search.Join.TermsQuery(toField, fromQuery, termsCollector.CollectorTerms);
                 case ScoreMode.Total:
                 case ScoreMode.Max:
                 case ScoreMode.Avg:
-                    TermsWithScoreCollector termsWithScoreCollector = TermsWithScoreCollector.Create(fromField, multipleValuesPerDocument, scoreMode);
+                    Lucene.Net.Search.Join.TermsWithScoreCollector termsWithScoreCollector = Lucene.Net.Search.Join.TermsWithScoreCollector.Create(fromField, multipleValuesPerDocument, (Lucene.Net.Search.Join.ScoreMode)scoreMode);
                     fromSearcher.Search(fromQuery, termsWithScoreCollector);
-                    return new TermsIncludingScoreQuery(toField, multipleValuesPerDocument, termsWithScoreCollector.CollectedTerms, termsWithScoreCollector.ScoresPerTerm, fromQuery);
+                    return new Lucene.Net.Search.Join.TermsIncludingScoreQuery(toField, multipleValuesPerDocument, termsWithScoreCollector.CollectedTerms, termsWithScoreCollector.ScoresPerTerm, fromQuery);
                 default:
                     throw new ArgumentException(string.Format("Score mode {0} isn't supported.", scoreMode));
             }
diff --git a/src/Lucene.Net.Join/ScoreMode.cs b/src/Lucene.Net.Join/Support/ScoreMode.cs
similarity index 87%
copy from src/Lucene.Net.Join/ScoreMode.cs
copy to src/Lucene.Net.Join/Support/ScoreMode.cs
index bbac796..36084fc 100644
--- a/src/Lucene.Net.Join/ScoreMode.cs
+++ b/src/Lucene.Net.Join/Support/ScoreMode.cs
@@ -1,5 +1,7 @@
 // Lucene version compatibility level 4.8.1
 
+using System;
+
 namespace Lucene.Net.Join
 {
     /*
@@ -22,6 +24,7 @@ namespace Lucene.Net.Join
     /// <summary>
     /// How to aggregate multiple child hit scores into a single parent score.
     /// </summary>
+    [Obsolete("Use Lucene.Net.Search.Join.ScoreMode instead. This enum will be removed in 4.8.0 release candidate."), System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
     public enum ScoreMode
     {
         /// <summary>
diff --git a/src/Lucene.Net.Join/ToChildBlockJoinQuery.cs b/src/Lucene.Net.Join/Support/ToChildBlockJoinQuery.cs
similarity index 94%
copy from src/Lucene.Net.Join/ToChildBlockJoinQuery.cs
copy to src/Lucene.Net.Join/Support/ToChildBlockJoinQuery.cs
index 5557c5b..835c26a 100644
--- a/src/Lucene.Net.Join/ToChildBlockJoinQuery.cs
+++ b/src/Lucene.Net.Join/Support/ToChildBlockJoinQuery.cs
@@ -33,6 +33,7 @@ namespace Lucene.Net.Join
     /// 
     /// @lucene.experimental
     /// </summary>
+    [Obsolete("Use Lucene.Net.Search.Join.ToChildBlockJoinQuery instead. This class will be removed in 4.8.0 release candidate."), System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
     public class ToChildBlockJoinQuery : Query
     {
         /// <summary>
@@ -68,7 +69,7 @@ namespace Lucene.Net.Join
             _doScores = doScores;
         }
 
-        private ToChildBlockJoinQuery(Query origParentQuery, Query parentQuery, Filter parentsFilter, bool doScores) 
+        private ToChildBlockJoinQuery(Query origParentQuery, Query parentQuery, Filter parentsFilter, bool doScores)
             : base()
         {
             _origParentQuery = origParentQuery;
@@ -76,7 +77,7 @@ namespace Lucene.Net.Join
             _parentsFilter = parentsFilter;
             _doScores = doScores;
         }
-        
+
         public override Weight CreateWeight(IndexSearcher searcher)
         {
             return new ToChildBlockJoinWeight(this, _parentQuery.CreateWeight(searcher), _parentsFilter, _doScores);
@@ -89,7 +90,7 @@ namespace Lucene.Net.Join
             private readonly Filter _parentsFilter;
             private readonly bool _doScores;
 
-            public ToChildBlockJoinWeight(Query joinQuery, Weight parentWeight, Filter parentsFilter, bool doScores) 
+            public ToChildBlockJoinWeight(Query joinQuery, Weight parentWeight, Filter parentsFilter, bool doScores)
                 : base()
             {
                 _joinQuery = joinQuery;
@@ -102,7 +103,7 @@ namespace Lucene.Net.Join
 
             public override float GetValueForNormalization()
             {
-                return _parentWeight.GetValueForNormalization() * _joinQuery.Boost*_joinQuery.Boost;
+                return _parentWeight.GetValueForNormalization() * _joinQuery.Boost * _joinQuery.Boost;
             }
 
             public override void Normalize(float norm, float topLevelBoost)
@@ -140,7 +141,7 @@ namespace Lucene.Net.Join
 
                 return new ToChildBlockJoinScorer(this, parentScorer, (FixedBitSet)parents, _doScores, acceptDocs);
             }
-            
+
             public override Explanation Explain(AtomicReaderContext reader, int doc)
             {
                 // TODO
@@ -163,7 +164,7 @@ namespace Lucene.Net.Join
             private int _childDoc = -1;
             private int _parentDoc;
 
-            public ToChildBlockJoinScorer(Weight weight, Scorer parentScorer, FixedBitSet parentBits, bool doScores, IBits acceptDocs) 
+            public ToChildBlockJoinScorer(Weight weight, Scorer parentScorer, FixedBitSet parentBits, bool doScores, IBits acceptDocs)
                 : base(weight)
             {
                 _doScores = doScores;
@@ -176,7 +177,7 @@ namespace Lucene.Net.Join
             {
                 return new List<ChildScorer> { new ChildScorer(_parentScorer, "BLOCK_JOIN") };
             }
-            
+
             public override int NextDoc()
             {
                 //System.out.println("Q.nextDoc() parentDoc=" + parentDoc + " childDoc=" + childDoc);
@@ -254,7 +255,7 @@ namespace Lucene.Net.Join
                     }
                     //System.out.println("  " + childDoc);
                     return _childDoc;
-                    nextChildDocContinue:;
+                nextChildDocContinue:;
                 }
             }
 
@@ -275,7 +276,7 @@ namespace Lucene.Net.Join
             {
                 return _parentScore;
             }
-            
+
             public override int Freq => _parentFreq;
 
             public override int Advance(int childTarget)
@@ -334,7 +335,7 @@ namespace Lucene.Net.Join
         {
             _parentQuery.ExtractTerms(terms);
         }
-        
+
         public override Query Rewrite(IndexReader reader)
         {
             Query parentRewrite = _parentQuery.Rewrite(reader);
@@ -374,16 +375,16 @@ namespace Lucene.Net.Join
             unchecked
             {
                 int hashCode = base.GetHashCode();
-                hashCode = (hashCode*397) ^ (_origParentQuery != null ? _origParentQuery.GetHashCode() : 0);
-                hashCode = (hashCode*397) ^ _doScores.GetHashCode();
-                hashCode = (hashCode*397) ^ (_parentsFilter != null ? _parentsFilter.GetHashCode() : 0);
+                hashCode = (hashCode * 397) ^ (_origParentQuery != null ? _origParentQuery.GetHashCode() : 0);
+                hashCode = (hashCode * 397) ^ _doScores.GetHashCode();
+                hashCode = (hashCode * 397) ^ (_parentsFilter != null ? _parentsFilter.GetHashCode() : 0);
                 return hashCode;
             }
         }
 
         public override object Clone()
         {
-            return new ToChildBlockJoinQuery((Query) _origParentQuery.Clone(), _parentsFilter, _doScores);
+            return new ToChildBlockJoinQuery((Query)_origParentQuery.Clone(), _parentsFilter, _doScores);
         }
     }
 }
\ No newline at end of file
diff --git a/src/Lucene.Net.Join/ToParentBlockJoinCollector.cs b/src/Lucene.Net.Join/Support/ToParentBlockJoinCollector.cs
similarity index 98%
copy from src/Lucene.Net.Join/ToParentBlockJoinCollector.cs
copy to src/Lucene.Net.Join/Support/ToParentBlockJoinCollector.cs
index 6daa91e..0b70aeb 100644
--- a/src/Lucene.Net.Join/ToParentBlockJoinCollector.cs
+++ b/src/Lucene.Net.Join/Support/ToParentBlockJoinCollector.cs
@@ -6,7 +6,6 @@ using Lucene.Net.Search.Grouping;
 using Lucene.Net.Support;
 using Lucene.Net.Util;
 using System;
-using System.Collections.Concurrent;
 using System.Collections.Generic;
 using System.IO;
 
@@ -76,6 +75,7 @@ namespace Lucene.Net.Join
     /// 
     /// @lucene.experimental
     /// </summary>
+    [Obsolete("Use Lucene.Net.Search.Join.ToParentBlockJoinCollector instead. This class will be removed in 4.8.0 release candidate."), System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
     public class ToParentBlockJoinCollector : ICollector
     {
         private readonly Sort sort;
@@ -128,7 +128,7 @@ namespace Lucene.Net.Join
 
         private sealed class OneGroup : FieldValueHitQueue.Entry
         {
-            public OneGroup(int comparerSlot, int parentDoc, float parentScore, int numJoins, bool doScores) 
+            public OneGroup(int comparerSlot, int parentDoc, float parentScore, int numJoins, bool doScores)
                 : base(comparerSlot, parentDoc, parentScore)
             {
                 //System.out.println("make OneGroup parentDoc=" + parentDoc);
@@ -152,7 +152,7 @@ namespace Lucene.Net.Join
             internal float[][] scores;
             internal int[] counts;
         }
-        
+
         public virtual void Collect(int parentDoc)
         {
             //System.out.println("\nC parentDoc=" + parentDoc);
@@ -304,7 +304,7 @@ namespace Lucene.Net.Join
                 }
             }
         }
-        
+
         public virtual void SetNextReader(AtomicReaderContext context)
         {
             currentReaderContext = context;
@@ -486,7 +486,7 @@ namespace Lucene.Net.Join
                     fakeScorer.doc = doc;
                     if (trackScores)
                     {
-                        fakeScorer._score = og.scores[slot][docIdx];
+                        fakeScorer.score = og.scores[slot][docIdx];
                     }
                     collector.Collect(doc);
                 }
@@ -510,15 +510,15 @@ namespace Lucene.Net.Join
                 TopDocs topDocs;
                 if (withinGroupSort == null)
                 {
-                    var tempCollector = (TopScoreDocCollector) collector;
+                    var tempCollector = (TopScoreDocCollector)collector;
                     topDocs = tempCollector.GetTopDocs(withinGroupOffset, numDocsInGroup);
                 }
                 else
                 {
-                    var tempCollector = (TopFieldCollector) collector;
+                    var tempCollector = (TopFieldCollector)collector;
                     topDocs = tempCollector.GetTopDocs(withinGroupOffset, numDocsInGroup);
                 }
-                
+
                 groups[groupIdx - offset] = new GroupDocs<int>(og.Score, topDocs.MaxScore, numChildDocs, topDocs.ScoreDocs, og.Doc, groupSortValues);
             }
 
diff --git a/src/Lucene.Net.Join/ToParentBlockJoinFieldComparator.cs b/src/Lucene.Net.Join/Support/ToParentBlockJoinFieldComparator.cs
similarity index 97%
copy from src/Lucene.Net.Join/ToParentBlockJoinFieldComparator.cs
copy to src/Lucene.Net.Join/Support/ToParentBlockJoinFieldComparator.cs
index 54ea12b..fbe1443 100644
--- a/src/Lucene.Net.Join/ToParentBlockJoinFieldComparator.cs
+++ b/src/Lucene.Net.Join/Support/ToParentBlockJoinFieldComparator.cs
@@ -29,6 +29,7 @@ namespace Lucene.Net.Join
     /// 
     /// @lucene.experimental
     /// </summary>
+    [Obsolete("Use Lucene.Net.Search.Join.ToParentBlockJoinFieldComparer instead. This class will be removed in 4.8.0 release candidate."), System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
     public abstract class ToParentBlockJoinFieldComparer : FieldComparer<object>
     {
         private readonly Filter _parentFilter;
@@ -61,7 +62,7 @@ namespace Lucene.Net.Join
         {
             _wrappedComparer.SetTopValue(value);
         }
-        
+
         public override FieldComparer SetNextReader(AtomicReaderContext context)
         {
             DocIdSet innerDocuments = _childFilter.GetDocIdSet(context, null);
@@ -101,7 +102,7 @@ namespace Lucene.Net.Join
         {
             return set == null;
         }
-        
+
         private static FixedBitSet ToFixedBitSet(DocIdSetIterator iterator, int numBits)
         {
             var set = new FixedBitSet(numBits);
@@ -130,11 +131,11 @@ namespace Lucene.Net.Join
             /// <param name="childFilter"><see cref="Filter"/> that defines which child / nested documents participates in sorting. </param>
             /// <param name="spareSlot">The extra slot inside the wrapped comparer that is used to compare which nested document
             ///                  inside the parent document scope is most competitive. </param>
-            public Lowest(FieldComparer wrappedComparer, Filter parentFilter, Filter childFilter, int spareSlot) 
+            public Lowest(FieldComparer wrappedComparer, Filter parentFilter, Filter childFilter, int spareSlot)
                 : base(wrappedComparer, parentFilter, childFilter, spareSlot)
             {
             }
-            
+
             public override int CompareBottom(int parentDoc)
             {
                 if (parentDoc == 0 || _parentDocuments == null || _childDocuments == null)
@@ -175,7 +176,7 @@ namespace Lucene.Net.Join
                     }
                 }
             }
-            
+
             public override void Copy(int slot, int parentDoc)
             {
                 if (parentDoc == 0 || _parentDocuments == null || _childDocuments == null)
@@ -207,7 +208,7 @@ namespace Lucene.Net.Join
                     }
                 }
             }
-            
+
             public override int CompareTop(int parentDoc)
             {
                 if (parentDoc == 0 || _parentDocuments == null || _childDocuments == null)
@@ -265,11 +266,11 @@ namespace Lucene.Net.Join
             /// <param name="childFilter"><see cref="Filter"/> that defines which child / nested documents participates in sorting. </param>
             /// <param name="spareSlot">The extra slot inside the wrapped comparer that is used to compare which nested document
             ///                  inside the parent document scope is most competitive. </param>
-            public Highest(FieldComparer wrappedComparer, Filter parentFilter, Filter childFilter, int spareSlot) 
+            public Highest(FieldComparer wrappedComparer, Filter parentFilter, Filter childFilter, int spareSlot)
                 : base(wrappedComparer, parentFilter, childFilter, spareSlot)
             {
             }
-            
+
             public override int CompareBottom(int parentDoc)
             {
                 if (parentDoc == 0 || _parentDocuments == null || _childDocuments == null)
@@ -311,7 +312,7 @@ namespace Lucene.Net.Join
                     }
                 }
             }
-            
+
             public override void Copy(int slot, int parentDoc)
             {
                 if (parentDoc == 0 || _parentDocuments == null || _childDocuments == null)
@@ -342,7 +343,7 @@ namespace Lucene.Net.Join
                     }
                 }
             }
-            
+
             public override int CompareTop(int parentDoc)
             {
                 if (parentDoc == 0 || _parentDocuments == null || _childDocuments == null)
diff --git a/src/Lucene.Net.Join/ToParentBlockJoinQuery.cs b/src/Lucene.Net.Join/Support/ToParentBlockJoinQuery.cs
similarity index 96%
copy from src/Lucene.Net.Join/ToParentBlockJoinQuery.cs
copy to src/Lucene.Net.Join/Support/ToParentBlockJoinQuery.cs
index caf4533..3d8c4f4 100644
--- a/src/Lucene.Net.Join/ToParentBlockJoinQuery.cs
+++ b/src/Lucene.Net.Join/Support/ToParentBlockJoinQuery.cs
@@ -68,6 +68,7 @@ namespace Lucene.Net.Join
     /// 
     /// @lucene.experimental
     /// </summary>
+    [Obsolete("Use Lucene.Net.Search.Join.ToParentBlockJoinQuery instead. This class will be removed in 4.8.0 release candidate."), System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
     public class ToParentBlockJoinQuery : Query
     {
         private readonly Filter _parentsFilter;
@@ -100,7 +101,7 @@ namespace Lucene.Net.Join
             _scoreMode = scoreMode;
         }
 
-        private ToParentBlockJoinQuery(Query origChildQuery, Query childQuery, Filter parentsFilter, ScoreMode scoreMode) 
+        private ToParentBlockJoinQuery(Query origChildQuery, Query childQuery, Filter parentsFilter, ScoreMode scoreMode)
             : base()
         {
             _origChildQuery = origChildQuery;
@@ -108,7 +109,7 @@ namespace Lucene.Net.Join
             _parentsFilter = parentsFilter;
             _scoreMode = scoreMode;
         }
-        
+
         public override Weight CreateWeight(IndexSearcher searcher)
         {
             return new BlockJoinWeight(this, _childQuery.CreateWeight(searcher), _parentsFilter, _scoreMode);
@@ -121,7 +122,7 @@ namespace Lucene.Net.Join
             private readonly Filter parentsFilter;
             private readonly ScoreMode scoreMode;
 
-            public BlockJoinWeight(Query joinQuery, Weight childWeight, Filter parentsFilter, ScoreMode scoreMode) 
+            public BlockJoinWeight(Query joinQuery, Weight childWeight, Filter parentsFilter, ScoreMode scoreMode)
                 : base()
             {
                 this.joinQuery = joinQuery;
@@ -134,7 +135,7 @@ namespace Lucene.Net.Join
 
             public override float GetValueForNormalization()
             {
-                return childWeight.GetValueForNormalization() * joinQuery.Boost*joinQuery.Boost;
+                return childWeight.GetValueForNormalization() * joinQuery.Boost * joinQuery.Boost;
             }
 
             public override void Normalize(float norm, float topLevelBoost)
@@ -179,7 +180,7 @@ namespace Lucene.Net.Join
 
                 return new BlockJoinScorer(this, childScorer, (FixedBitSet)parents, firstChildDoc, scoreMode, acceptDocs);
             }
-            
+
             public override Explanation Explain(AtomicReaderContext context, int doc)
             {
                 BlockJoinScorer scorer = (BlockJoinScorer)GetScorer(context, context.AtomicReader.LiveDocs);
@@ -258,7 +259,7 @@ namespace Lucene.Net.Join
                 }
                 return ret;
             }
-            
+
             public override int NextDoc()
             {
                 //System.out.println("Q.nextDoc() nextChildDoc=" + nextChildDoc);
@@ -421,7 +422,7 @@ namespace Lucene.Net.Join
                 //System.out.println("  return nextParentDoc=" + nd);
                 return nd;
             }
-            
+
             public virtual Explanation Explain(int docBase)
             {
                 int start = docBase + _prevParentDoc + 1; // +1 b/c prevParentDoc is previous parent doc
@@ -451,7 +452,7 @@ namespace Lucene.Net.Join
         {
             _childQuery.ExtractTerms(terms);
         }
-        
+
         public override Query Rewrite(IndexReader reader)
         {
             Query childRewrite = _childQuery.Rewrite(reader);
@@ -490,9 +491,9 @@ namespace Lucene.Net.Join
             unchecked
             {
                 int hashCode = base.GetHashCode();
-                hashCode = (hashCode*397) ^ (_parentsFilter != null ? _parentsFilter.GetHashCode() : 0);
-                hashCode = (hashCode*397) ^ (int) _scoreMode;
-                hashCode = (hashCode*397) ^ (_origChildQuery != null ? _origChildQuery.GetHashCode() : 0);
+                hashCode = (hashCode * 397) ^ (_parentsFilter != null ? _parentsFilter.GetHashCode() : 0);
+                hashCode = (hashCode * 397) ^ (int)_scoreMode;
+                hashCode = (hashCode * 397) ^ (_origChildQuery != null ? _origChildQuery.GetHashCode() : 0);
                 return hashCode;
             }
         }
diff --git a/src/Lucene.Net.Join/ToParentBlockJoinSortField.cs b/src/Lucene.Net.Join/Support/ToParentBlockJoinSortField.cs
similarity index 93%
copy from src/Lucene.Net.Join/ToParentBlockJoinSortField.cs
copy to src/Lucene.Net.Join/Support/ToParentBlockJoinSortField.cs
index b12d30b..18c2f57 100644
--- a/src/Lucene.Net.Join/ToParentBlockJoinSortField.cs
+++ b/src/Lucene.Net.Join/Support/ToParentBlockJoinSortField.cs
@@ -1,5 +1,6 @@
 // Lucene version compatibility level 4.8.1
 using Lucene.Net.Search;
+using System;
 
 namespace Lucene.Net.Join
 {
@@ -26,6 +27,7 @@ namespace Lucene.Net.Join
     /// 
     /// @lucene.experimental
     /// </summary>
+    [Obsolete("Use Lucene.Net.Search.Join.ToParentBlockJoinSortField instead. This class will be removed in 4.8.0 release candidate."), System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
     public class ToParentBlockJoinSortField : SortField
     {
         private readonly bool order;
@@ -40,7 +42,7 @@ namespace Lucene.Net.Join
         /// <param name="reverse"> Whether natural order should be reversed on the nested / child level. </param>
         /// <param name="parentFilter"> <see cref="Filter"/> that identifies the parent documents. </param>
         /// <param name="childFilter"> <see cref="Filter"/> that defines which child documents participates in sorting. </param>
-        public ToParentBlockJoinSortField(string field, SortFieldType type, bool reverse, Filter parentFilter, Filter childFilter) 
+        public ToParentBlockJoinSortField(string field, SortFieldType type, bool reverse, Filter parentFilter, Filter childFilter)
             : base(field, type, reverse)
         {
             this.order = reverse;
@@ -57,14 +59,14 @@ namespace Lucene.Net.Join
         /// <param name="order"> Whether natural order should be reversed on the parent level. </param>
         /// <param name="parentFilter"> <see cref="Filter"/> that identifies the parent documents. </param>
         /// <param name="childFilter"> <see cref="Filter"/> that defines which child documents participates in sorting. </param>
-        public ToParentBlockJoinSortField(string field, SortFieldType type, bool reverse, bool order, Filter parentFilter, Filter childFilter) 
+        public ToParentBlockJoinSortField(string field, SortFieldType type, bool reverse, bool order, Filter parentFilter, Filter childFilter)
             : base(field, type, reverse)
         {
             this.order = order;
             this.parentFilter = parentFilter;
             this.childFilter = childFilter;
         }
-        
+
         public override FieldComparer GetComparer(int numHits, int sortPos)
         {
             var wrappedFieldComparer = base.GetComparer(numHits + 1, sortPos);
diff --git a/src/Lucene.Net.Join/TermsCollector.cs b/src/Lucene.Net.Join/TermsCollector.cs
index e744438..9df0615 100644
--- a/src/Lucene.Net.Join/TermsCollector.cs
+++ b/src/Lucene.Net.Join/TermsCollector.cs
@@ -1,9 +1,8 @@
 // Lucene version compatibility level 4.8.1
 using Lucene.Net.Index;
-using Lucene.Net.Search;
 using Lucene.Net.Util;
 
-namespace Lucene.Net.Join
+namespace Lucene.Net.Search.Join
 {
     /*
      * Licensed to the Apache Software Foundation (ASF) under one or more
diff --git a/src/Lucene.Net.Join/TermsIncludingScoreQuery.cs b/src/Lucene.Net.Join/TermsIncludingScoreQuery.cs
index 7725045..41c172f 100644
--- a/src/Lucene.Net.Join/TermsIncludingScoreQuery.cs
+++ b/src/Lucene.Net.Join/TermsIncludingScoreQuery.cs
@@ -1,11 +1,10 @@
 // Lucene version compatibility level 4.8.1
 using Lucene.Net.Index;
-using Lucene.Net.Search;
 using Lucene.Net.Util;
 using System;
 using System.Collections.Generic;
 
-namespace Lucene.Net.Join
+namespace Lucene.Net.Search.Join
 {
     /*
      * Licensed to the Apache Software Foundation (ASF) under one or more
@@ -23,7 +22,7 @@ namespace Lucene.Net.Join
      * See the License for the specific language governing permissions and
      * limitations under the License.
      */
-     
+
     internal class TermsIncludingScoreQuery : Query
     {
         private readonly string _field;
diff --git a/src/Lucene.Net.Join/TermsQuery.cs b/src/Lucene.Net.Join/TermsQuery.cs
index b2b3022..0ecd8f6 100644
--- a/src/Lucene.Net.Join/TermsQuery.cs
+++ b/src/Lucene.Net.Join/TermsQuery.cs
@@ -1,10 +1,9 @@
 // Lucene version compatibility level 4.8.1
-using System.Collections.Generic;
 using Lucene.Net.Index;
-using Lucene.Net.Search;
 using Lucene.Net.Util;
+using System.Collections.Generic;
 
-namespace Lucene.Net.Join
+namespace Lucene.Net.Search.Join
 {
     /*
      * Licensed to the Apache Software Foundation (ASF) under one or more
diff --git a/src/Lucene.Net.Join/TermsWithScoreCollector.cs b/src/Lucene.Net.Join/TermsWithScoreCollector.cs
index e79bc43..c8d6f79 100644
--- a/src/Lucene.Net.Join/TermsWithScoreCollector.cs
+++ b/src/Lucene.Net.Join/TermsWithScoreCollector.cs
@@ -1,12 +1,11 @@
 // Lucene version compatibility level 4.8.1
 using Lucene.Net.Index;
-using Lucene.Net.Search;
 using Lucene.Net.Support;
 using Lucene.Net.Util;
 using System;
 using System.Diagnostics.CodeAnalysis;
 
-namespace Lucene.Net.Join
+namespace Lucene.Net.Search.Join
 {
     /*
      * Licensed to the Apache Software Foundation (ASF) under one or more
diff --git a/src/Lucene.Net.Join/ToChildBlockJoinQuery.cs b/src/Lucene.Net.Join/ToChildBlockJoinQuery.cs
index 5557c5b..65e7680 100644
--- a/src/Lucene.Net.Join/ToChildBlockJoinQuery.cs
+++ b/src/Lucene.Net.Join/ToChildBlockJoinQuery.cs
@@ -6,7 +6,7 @@ using Lucene.Net.Util;
 using System;
 using System.Collections.Generic;
 
-namespace Lucene.Net.Join
+namespace Lucene.Net.Search.Join
 {
     /*
      * Licensed to the Apache Software Foundation (ASF) under one or more
diff --git a/src/Lucene.Net.Join/ToParentBlockJoinCollector.cs b/src/Lucene.Net.Join/ToParentBlockJoinCollector.cs
index 6daa91e..d5002c2 100644
--- a/src/Lucene.Net.Join/ToParentBlockJoinCollector.cs
+++ b/src/Lucene.Net.Join/ToParentBlockJoinCollector.cs
@@ -1,16 +1,14 @@
 // Lucene version compatibility level 4.8.1
 using Lucene.Net.Diagnostics;
 using Lucene.Net.Index;
-using Lucene.Net.Search;
 using Lucene.Net.Search.Grouping;
 using Lucene.Net.Support;
 using Lucene.Net.Util;
 using System;
-using System.Collections.Concurrent;
 using System.Collections.Generic;
 using System.IO;
 
-namespace Lucene.Net.Join
+namespace Lucene.Net.Search.Join
 {
     /*
      * Licensed to the Apache Software Foundation (ASF) under one or more
diff --git a/src/Lucene.Net.Join/ToParentBlockJoinFieldComparator.cs b/src/Lucene.Net.Join/ToParentBlockJoinFieldComparator.cs
index 54ea12b..a6c34b2 100644
--- a/src/Lucene.Net.Join/ToParentBlockJoinFieldComparator.cs
+++ b/src/Lucene.Net.Join/ToParentBlockJoinFieldComparator.cs
@@ -1,10 +1,9 @@
 // Lucene version compatibility level 4.8.1
 using Lucene.Net.Index;
-using Lucene.Net.Search;
 using Lucene.Net.Util;
 using System;
 
-namespace Lucene.Net.Join
+namespace Lucene.Net.Search.Join
 {
     /*
      * Licensed to the Apache Software Foundation (ASF) under one or more
diff --git a/src/Lucene.Net.Join/ToParentBlockJoinQuery.cs b/src/Lucene.Net.Join/ToParentBlockJoinQuery.cs
index caf4533..ee9942b 100644
--- a/src/Lucene.Net.Join/ToParentBlockJoinQuery.cs
+++ b/src/Lucene.Net.Join/ToParentBlockJoinQuery.cs
@@ -1,12 +1,11 @@
 // Lucene version compatibility level 4.8.1
 using Lucene.Net.Diagnostics;
 using Lucene.Net.Index;
-using Lucene.Net.Search;
 using Lucene.Net.Util;
 using System;
 using System.Collections.Generic;
 
-namespace Lucene.Net.Join
+namespace Lucene.Net.Search.Join
 {
     /*
      * Licensed to the Apache Software Foundation (ASF) under one or more
diff --git a/src/Lucene.Net.Join/ToParentBlockJoinSortField.cs b/src/Lucene.Net.Join/ToParentBlockJoinSortField.cs
index b12d30b..aa69da3 100644
--- a/src/Lucene.Net.Join/ToParentBlockJoinSortField.cs
+++ b/src/Lucene.Net.Join/ToParentBlockJoinSortField.cs
@@ -1,7 +1,6 @@
 // Lucene version compatibility level 4.8.1
-using Lucene.Net.Search;
 
-namespace Lucene.Net.Join
+namespace Lucene.Net.Search.Join
 {
     /*
      * Licensed to the Apache Software Foundation (ASF) under one or more
diff --git a/src/Lucene.Net.Join/overview.md b/src/Lucene.Net.Join/overview.md
index 4da9148..3364aa7 100644
--- a/src/Lucene.Net.Join/overview.md
+++ b/src/Lucene.Net.Join/overview.md
@@ -1,4 +1,4 @@
----
+---
 uid: Lucene.Net.Join
 summary: *content
 ---
diff --git a/src/Lucene.Net.Join/package.md b/src/Lucene.Net.Join/package.md
index 5c194b4..c31f80c 100644
--- a/src/Lucene.Net.Join/package.md
+++ b/src/Lucene.Net.Join/package.md
@@ -1,5 +1,6 @@
 ---
 uid: Lucene.Net.Join
+title: Lucene.Net.Join
 summary: *content
 ---
 
@@ -20,7 +21,7 @@ summary: *content
  limitations under the License.
 -->
 
-This modules support index-time and query-time joins.
+This module supports index-time and query-time joins.
 
 ## Index-time joins
 
@@ -28,11 +29,11 @@ The index-time joining support joins while searching, where joined documents are
 
 When you index in this way, the documents in your index are divided into parent documents (the last document of each block) and child documents (all others). You provide a <xref:Lucene.Net.Search.Filter> that identifies the parent documents, as Lucene does not currently record any information about doc blocks.
 
-At search time, use <xref:Lucene.Net.Join.ToParentBlockJoinQuery> to remap/join matches from any child <xref:Lucene.Net.Search.Query> (ie, a query that matches only child documents) up to the parent document space. The resulting query can then be used as a clause in any query that matches parent.
+At search time, use <xref:Lucene.Net.Search.Join.ToParentBlockJoinQuery> to remap/join matches from any child <xref:Lucene.Net.Search.Query> (ie, a query that matches only child documents) up to the parent document space. The resulting query can then be used as a clause in any query that matches parent.
 
-If you only care about the parent documents matching the query, you can use any collector to collect the parent hits, but if you'd also like to see which child documents match for each parent document, use the <xref:Lucene.Net.Join.ToParentBlockJoinCollector> to collect the hits. Once the search is done, you retrieve a <xref:Lucene.Net.Search.Grouping.ITopGroups`1> instance from the [ToParentBlockJoinCollector.GetTopGroups()](xref:Lucene.Net.Join.ToParentBlockJoinCollector#Lucene_Net_Joi [...]
+If you only care about the parent documents matching the query, you can use any collector to collect the parent hits, but if you'd also like to see which child documents match for each parent document, use the <xref:Lucene.Net.Search.Join.ToParentBlockJoinCollector> to collect the hits. Once the search is done, you retrieve a <xref:Lucene.Net.Search.Grouping.ITopGroups`1> instance from the [ToParentBlockJoinCollector.GetTopGroups()](xref:Lucene.Net.Search.Join.ToParentBlockJoinCollector# [...]
 
-To map/join in the opposite direction, use <xref:Lucene.Net.Join.ToChildBlockJoinQuery>.  This wraps
+To map/join in the opposite direction, use <xref:Lucene.Net.Search.Join.ToChildBlockJoinQuery>.  This wraps
 any query matching parent documents, creating the joined query
 matching only child documents.
 
@@ -49,12 +50,12 @@ Query time joining has the following input:
 *   `multipleValuesPerDocument`:  Whether the `fromField` contains more than one value per document
 
 *   `scoreMode`:  Defines how scores are translated to the other join side. If you don't care about scoring
-  use [ScoreMode.None](xref:Lucene.Net.Join.ScoreMode#Lucene_Net_Join_ScoreMode_None) mode. This will disable scoring and is therefore more
+  use [ScoreMode.None](xref:Lucene.Net.Search.Join.ScoreMode#Lucene_Net_Search_Join_ScoreMode_None) mode. This will disable scoring and is therefore more
   efficient (requires less memory and is faster).
 
 *   `toField`: The to field to join to
 
-Basically the query-time joining is accessible from one static method. The user of this method supplies the method with the described input and a `IndexSearcher` where the from terms need to be collected from. The returned query can be executed with the same `IndexSearcher`, but also with another `IndexSearcher`. Example usage of the [JoinUtil.CreateJoinQuery()](xref:Lucene.Net.Join.JoinUtil#Lucene_Net_Join_JoinUtil_CreateJoinQuery_System_String_System_Boolean_System_String_Lucene_Net_Se [...]
+Basically the query-time joining is accessible from one static method. The user of this method supplies the method with the described input and a `IndexSearcher` where the from terms need to be collected from. The returned query can be executed with the same `IndexSearcher`, but also with another `IndexSearcher`. Example usage of the [JoinUtil.CreateJoinQuery()](xref:Lucene.Net.Search.Join.JoinUtil#Lucene_Net_Search_Join_JoinUtil_CreateJoinQuery_System_String_System_Boolean_System_String [...]
 
 
 ```cs
diff --git a/src/Lucene.Net.Tests.Join/Support/TestApiConsistency.cs b/src/Lucene.Net.Tests.Join/Support/TestApiConsistency.cs
index 3f347e1..2d4838b 100644
--- a/src/Lucene.Net.Tests.Join/Support/TestApiConsistency.cs
+++ b/src/Lucene.Net.Tests.Join/Support/TestApiConsistency.cs
@@ -1,9 +1,9 @@
-using Lucene.Net.Attributes;
+using Lucene.Net.Attributes;
 using Lucene.Net.Util;
 using NUnit.Framework;
 using System;
 
-namespace Lucene.Net.Join
+namespace Lucene.Net.Search.Join
 {
     /*
      * Licensed to the Apache Software Foundation (ASF) under one or more
@@ -28,56 +28,56 @@ namespace Lucene.Net.Join
     public class TestApiConsistency : ApiScanTestBase
     {
         [Test, LuceneNetSpecific]
-        [TestCase(typeof(Lucene.Net.Join.FakeScorer))]
+        [TestCase(typeof(Lucene.Net.Search.Join.FakeScorer))]
         public override void TestProtectedFieldNames(Type typeFromTargetAssembly)
         {
             base.TestProtectedFieldNames(typeFromTargetAssembly);
         }
 
         [Test, LuceneNetSpecific]
-        [TestCase(typeof(Lucene.Net.Join.FakeScorer))]
+        [TestCase(typeof(Lucene.Net.Search.Join.FakeScorer))]
         public override void TestPrivateFieldNames(Type typeFromTargetAssembly)
         {
             base.TestPrivateFieldNames(typeFromTargetAssembly);
         }
 
         [Test, LuceneNetSpecific]
-        [TestCase(typeof(Lucene.Net.Join.FakeScorer))]
+        [TestCase(typeof(Lucene.Net.Search.Join.FakeScorer))]
         public override void TestPublicFields(Type typeFromTargetAssembly)
         {
             base.TestPublicFields(typeFromTargetAssembly);
         }
 
         [Test, LuceneNetSpecific]
-        [TestCase(typeof(Lucene.Net.Join.FakeScorer))]
+        [TestCase(typeof(Lucene.Net.Search.Join.FakeScorer))]
         public override void TestMethodParameterNames(Type typeFromTargetAssembly)
         {
             base.TestMethodParameterNames(typeFromTargetAssembly);
         }
 
         [Test, LuceneNetSpecific]
-        [TestCase(typeof(Lucene.Net.Join.FakeScorer))]
+        [TestCase(typeof(Lucene.Net.Search.Join.FakeScorer))]
         public override void TestInterfaceNames(Type typeFromTargetAssembly)
         {
             base.TestInterfaceNames(typeFromTargetAssembly);
         }
 
         [Test, LuceneNetSpecific]
-        [TestCase(typeof(Lucene.Net.Join.FakeScorer))]
+        [TestCase(typeof(Lucene.Net.Search.Join.FakeScorer))]
         public override void TestClassNames(Type typeFromTargetAssembly)
         {
             base.TestClassNames(typeFromTargetAssembly);
         }
 
         [Test, LuceneNetSpecific]
-        [TestCase(typeof(Lucene.Net.Join.FakeScorer))]
+        [TestCase(typeof(Lucene.Net.Search.Join.FakeScorer))]
         public override void TestForPropertiesWithNoGetter(Type typeFromTargetAssembly)
         {
             base.TestForPropertiesWithNoGetter(typeFromTargetAssembly);
         }
 
         [Test, LuceneNetSpecific]
-        [TestCase(typeof(Lucene.Net.Join.FakeScorer))]
+        [TestCase(typeof(Lucene.Net.Search.Join.FakeScorer))]
         public override void TestForPropertiesThatReturnArray(Type typeFromTargetAssembly)
         {
             base.TestForPropertiesThatReturnArray(typeFromTargetAssembly);
@@ -85,7 +85,7 @@ namespace Lucene.Net.Join
 
 #if FEATURE_METHODBASE_GETMETHODBODY
         [Test, LuceneNetSpecific]
-        [TestCase(typeof(Lucene.Net.Join.FakeScorer))]
+        [TestCase(typeof(Lucene.Net.Search.Join.FakeScorer))]
         public override void TestForMethodsThatReturnWritableArray(Type typeFromTargetAssembly)
         {
             base.TestForMethodsThatReturnWritableArray(typeFromTargetAssembly);
@@ -93,35 +93,35 @@ namespace Lucene.Net.Join
 #endif
 
         [Test, LuceneNetSpecific]
-        [TestCase(typeof(Lucene.Net.Join.FakeScorer))]
+        [TestCase(typeof(Lucene.Net.Search.Join.FakeScorer))]
         public override void TestForPublicMembersContainingComparer(Type typeFromTargetAssembly)
         {
             base.TestForPublicMembersContainingComparer(typeFromTargetAssembly);
         }
 
         [Test, LuceneNetSpecific]
-        [TestCase(typeof(Lucene.Net.Join.FakeScorer))]
+        [TestCase(typeof(Lucene.Net.Search.Join.FakeScorer))]
         public override void TestForPublicMembersNamedSize(Type typeFromTargetAssembly)
         {
             base.TestForPublicMembersNamedSize(typeFromTargetAssembly);
         }
 
         [Test, LuceneNetSpecific]
-        [TestCase(typeof(Lucene.Net.Join.FakeScorer))]
+        [TestCase(typeof(Lucene.Net.Search.Join.FakeScorer))]
         public override void TestForPublicMembersContainingNonNetNumeric(Type typeFromTargetAssembly)
         {
             base.TestForPublicMembersContainingNonNetNumeric(typeFromTargetAssembly);
         }
 
         [Test, LuceneNetSpecific]
-        [TestCase(typeof(Lucene.Net.Join.FakeScorer))]
+        [TestCase(typeof(Lucene.Net.Search.Join.FakeScorer))]
         public override void TestForTypesContainingNonNetNumeric(Type typeFromTargetAssembly)
         {
             base.TestForTypesContainingNonNetNumeric(typeFromTargetAssembly);
         }
 
         [Test, LuceneNetSpecific]
-        [TestCase(typeof(Lucene.Net.Join.FakeScorer))]
+        [TestCase(typeof(Lucene.Net.Search.Join.FakeScorer))]
         public override void TestForPublicMembersWithNullableEnum(Type typeFromTargetAssembly)
         {
             base.TestForPublicMembersWithNullableEnum(typeFromTargetAssembly);
@@ -130,14 +130,14 @@ namespace Lucene.Net.Join
         // LUCENENET NOTE: This test is only for identifying members who were changed from
         // ICollection, IList or ISet to IEnumerable during the port (that should be changed back)
         //[Test, LuceneNetSpecific]
-        //[TestCase(typeof(Lucene.Net.Join.FakeScorer))]
+        //[TestCase(typeof(Lucene.Net.Search.Join.FakeScorer))]
         //public override void TestForMembersAcceptingOrReturningIEnumerable(Type typeFromTargetAssembly)
         //{
         //    base.TestForMembersAcceptingOrReturningIEnumerable(typeFromTargetAssembly);
         //}
 
         [Test, LuceneNetSpecific]
-        [TestCase(typeof(Lucene.Net.Join.FakeScorer))]
+        [TestCase(typeof(Lucene.Net.Search.Join.FakeScorer))]
         public override void TestForMembersAcceptingOrReturningListOrDictionary(Type typeFromTargetAssembly)
         {
             base.TestForMembersAcceptingOrReturningListOrDictionary(typeFromTargetAssembly);
diff --git a/src/Lucene.Net.Tests.Join/TestBlockJoin.cs b/src/Lucene.Net.Tests.Join/Support/TestBlockJoin.cs
similarity index 99%
copy from src/Lucene.Net.Tests.Join/TestBlockJoin.cs
copy to src/Lucene.Net.Tests.Join/Support/TestBlockJoin.cs
index c12ae3f..5f76f71 100644
--- a/src/Lucene.Net.Tests.Join/TestBlockJoin.cs
+++ b/src/Lucene.Net.Tests.Join/Support/TestBlockJoin.cs
@@ -38,6 +38,7 @@ namespace Lucene.Net.Tests.Join
      * limitations under the License.
      */
 
+    [Obsolete("Production tests are in Lucene.Net.Search.Join. This class will be removed in 4.8.0 release candidate."), System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
     public class TestBlockJoin : LuceneTestCase
     {
         // One resume...
@@ -280,7 +281,7 @@ namespace Lucene.Net.Tests.Join
             r.Dispose();
             dir.Dispose();
         }
-        
+
         protected QueryWrapperFilter Skill(string skill)
         {
             return new QueryWrapperFilter(new TermQuery(new Term("skill", skill)));
@@ -371,7 +372,7 @@ namespace Lucene.Net.Tests.Join
             r.Dispose();
             dir.Dispose();
         }
-        
+
         private void AddSkillless(RandomIndexWriter w)
         {
             if (Random.NextBoolean())
@@ -379,7 +380,7 @@ namespace Lucene.Net.Tests.Join
                 w.AddDocument(MakeResume("Skillless", Random.NextBoolean() ? "United Kingdom" : "United States"));
             }
         }
-        
+
         private Document GetParentDoc(IndexReader reader, Filter parents, int childDocID)
         {
             IList<AtomicReaderContext> leaves = reader.Leaves;
@@ -1092,7 +1093,7 @@ namespace Lucene.Net.Tests.Join
             dir.Dispose();
             joinDir.Dispose();
         }
-        
+
         private void CompareChildHits(IndexReader r, IndexReader joinR, TopDocs results, TopDocs joinResults)
         {
             assertEquals(results.TotalHits, joinResults.TotalHits);
@@ -1116,7 +1117,7 @@ namespace Lucene.Net.Tests.Join
                 assertArrayEquals(hit0.Fields, joinHit0.Fields);
             }
         }
-        
+
         private void CompareHits(IndexReader r, IndexReader joinR, TopDocs results, ITopGroups<int> joinResults)
         {
             // results is 'complete'; joinResults is a subset
diff --git a/src/Lucene.Net.Tests.Join/TestBlockJoinSorting.cs b/src/Lucene.Net.Tests.Join/Support/TestBlockJoinSorting.cs
similarity index 98%
copy from src/Lucene.Net.Tests.Join/TestBlockJoinSorting.cs
copy to src/Lucene.Net.Tests.Join/Support/TestBlockJoinSorting.cs
index f12137f..acda4c6 100644
--- a/src/Lucene.Net.Tests.Join/TestBlockJoinSorting.cs
+++ b/src/Lucene.Net.Tests.Join/Support/TestBlockJoinSorting.cs
@@ -9,6 +9,7 @@ using Lucene.Net.Store;
 using Lucene.Net.Util;
 using NUnit.Framework;
 using RandomizedTesting.Generators;
+using System;
 using System.Collections.Generic;
 
 namespace Lucene.Net.Tests.Join
@@ -30,6 +31,7 @@ namespace Lucene.Net.Tests.Join
      * limitations under the License.
      */
 
+    [Obsolete("Production tests are in Lucene.Net.Search.Join. This class will be removed in 4.8.0 release candidate."), System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
     public class TestBlockJoinSorting : LuceneTestCase
     {
         [Test]
diff --git a/src/Lucene.Net.Tests.Join/TestBlockJoinValidation.cs b/src/Lucene.Net.Tests.Join/Support/TestBlockJoinValidation.cs
similarity index 97%
copy from src/Lucene.Net.Tests.Join/TestBlockJoinValidation.cs
copy to src/Lucene.Net.Tests.Join/Support/TestBlockJoinValidation.cs
index 9e97e12..724b170 100644
--- a/src/Lucene.Net.Tests.Join/TestBlockJoinValidation.cs
+++ b/src/Lucene.Net.Tests.Join/Support/TestBlockJoinValidation.cs
@@ -31,6 +31,7 @@ namespace Lucene.Net.Tests.Join
      * limitations under the License.
      */
 
+    [Obsolete("Production tests are in Lucene.Net.Search.Join. This class will be removed in 4.8.0 release candidate."), System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
     public class TestBlockJoinValidation : LuceneTestCase
     {
         public const int AMOUNT_OF_SEGMENTS = 5;
@@ -42,7 +43,7 @@ namespace Lucene.Net.Tests.Join
         private IndexReader indexReader;
         private IndexSearcher indexSearcher;
         private Filter parentsFilter;
-        
+
         [SetUp]
         public override void SetUp()
         {
@@ -123,7 +124,7 @@ namespace Lucene.Net.Tests.Join
                 assertTrue(ise.Message.Contains(ToChildBlockJoinQuery.INVALID_QUERY_MESSAGE));
             }
         }
-        
+
         [Test]
         public void TestAdvanceValidationForToChildBjq()
         {
@@ -138,7 +139,7 @@ namespace Lucene.Net.Tests.Join
             var childQuery = new WildcardQuery(new Term("child", CreateFieldValue(randomChildNumber)));
             conjunctionQuery.Add(new BooleanClause(childQuery, Occur.MUST));
             conjunctionQuery.Add(new BooleanClause(blockJoinQuery, Occur.MUST));
-            
+
             // LUCENENET: Refactored to allow us to use our IsIllegalStateException() extension method
             try
             {
@@ -233,7 +234,7 @@ namespace Lucene.Net.Tests.Join
             return childQueryWithRandomParent;
         }
 
-        private static int GetRandomParentId() => Random.Next(AMOUNT_OF_PARENT_DOCS*AMOUNT_OF_SEGMENTS);
+        private static int GetRandomParentId() => Random.Next(AMOUNT_OF_PARENT_DOCS * AMOUNT_OF_SEGMENTS);
 
         private static int GetRandomParentNumber() => Random.Next(AMOUNT_OF_PARENT_DOCS);
 
diff --git a/src/Lucene.Net.Tests.Join/Support/TestExceptionSerialization.cs b/src/Lucene.Net.Tests.Join/Support/TestExceptionSerialization.cs
index 099fcc1..72ee2bd 100644
--- a/src/Lucene.Net.Tests.Join/Support/TestExceptionSerialization.cs
+++ b/src/Lucene.Net.Tests.Join/Support/TestExceptionSerialization.cs
@@ -32,7 +32,7 @@ namespace Lucene.Net.Support
         {
             get
             {
-                var exceptionTypes = typeof(Lucene.Net.Join.FakeScorer).Assembly.GetTypes().Where(t => typeof(Exception).IsAssignableFrom(t)).Cast<object>();
+                var exceptionTypes = typeof(Lucene.Net.Search.Join.FakeScorer).Assembly.GetTypes().Where(t => typeof(Exception).IsAssignableFrom(t)).Cast<object>();
 
                 // If the assembly has no exceptions, just provide Exception so the test will pass
                 if (!exceptionTypes.Any())
diff --git a/src/Lucene.Net.Tests.Join/TestJoinUtil.cs b/src/Lucene.Net.Tests.Join/Support/TestJoinUtil.cs
similarity index 98%
copy from src/Lucene.Net.Tests.Join/TestJoinUtil.cs
copy to src/Lucene.Net.Tests.Join/Support/TestJoinUtil.cs
index 9c984dd..e61aff3 100644
--- a/src/Lucene.Net.Tests.Join/TestJoinUtil.cs
+++ b/src/Lucene.Net.Tests.Join/Support/TestJoinUtil.cs
@@ -35,6 +35,7 @@ namespace Lucene.Net.Tests.Join
      * limitations under the License.
      */
 
+    [Obsolete("Production tests are in Lucene.Net.Search.Join. This class will be removed in 4.8.0 release candidate."), System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
     public class TestJoinUtil : LuceneTestCase
     {
         [Test]
@@ -393,13 +394,13 @@ namespace Lucene.Net.Tests.Join
         [Test]
         // [Slow] // LUCENENET specific - Not slow in .NET
         public void TestMultiValueRandomJoin()
-            // this test really takes more time, that is why the number of iterations are smaller.
+        // this test really takes more time, that is why the number of iterations are smaller.
         {
             int maxIndexIter = TestUtil.NextInt32(Random, 3, 6);
             int maxSearchIter = TestUtil.NextInt32(Random, 6, 12);
             ExecuteRandomJoin(true, maxIndexIter, maxSearchIter, TestUtil.NextInt32(Random, 11, 57));
         }
-        
+
         private void ExecuteRandomJoin(bool multipleValuesPerDocument, int maxIndexIter, int maxSearchIter,
             int numberOfDocumentsToIndex)
         {
@@ -438,9 +439,9 @@ namespace Lucene.Net.Tests.Join
                     {
                         Console.WriteLine("actualQuery=" + actualQuery);
                     }
-                    
+
                     var scoreModeLength = Enum.GetNames(typeof(ScoreMode)).Length;
-                    ScoreMode scoreMode = (ScoreMode) Random.Next(scoreModeLength);
+                    ScoreMode scoreMode = (ScoreMode)Random.Next(scoreModeLength);
                     if (Verbose)
                     {
                         Console.WriteLine("scoreMode=" + scoreMode);
@@ -536,7 +537,7 @@ namespace Lucene.Net.Tests.Join
 
 
             private int _docBase;
-            
+
             public virtual void Collect(int doc)
             {
                 actualResult.Set(doc + _docBase);
@@ -548,7 +549,7 @@ namespace Lucene.Net.Tests.Join
                 _docBase = context.DocBase;
                 topScoreDocCollector.SetNextReader(context);
             }
-            
+
             public virtual void SetScorer(Scorer scorer)
             {
                 topScoreDocCollector.SetScorer(scorer);
@@ -556,12 +557,12 @@ namespace Lucene.Net.Tests.Join
 
             public virtual bool AcceptsDocsOutOfOrder => scoreDocsInOrder;
         }
-        
+
         private IndexIterationContext CreateContext(int nDocs, RandomIndexWriter writer, bool multipleValuesPerDocument, bool scoreDocsInOrder)
         {
             return CreateContext(nDocs, writer, writer, multipleValuesPerDocument, scoreDocsInOrder);
         }
-        
+
         private IndexIterationContext CreateContext(int nDocs, RandomIndexWriter fromWriter, RandomIndexWriter toWriter,
             bool multipleValuesPerDocument, bool scoreDocsInOrder)
         {
@@ -762,7 +763,7 @@ namespace Lucene.Net.Tests.Join
             private Scorer scorer;
             private SortedSetDocValues docTermOrds;
             internal readonly BytesRef joinValue;
-            
+
             public virtual void Collect(int doc)
             {
                 docTermOrds.SetDocument(doc);
@@ -777,7 +778,7 @@ namespace Lucene.Net.Tests.Join
                     joinScore.AddScore(scorer.GetScore());
                 }
             }
-            
+
             public virtual void SetNextReader(AtomicReaderContext context)
             {
                 docTermOrds = FieldCache.DEFAULT.GetDocTermOrds(context.AtomicReader, fromField);
@@ -809,7 +810,7 @@ namespace Lucene.Net.Tests.Join
             private BinaryDocValues terms;
             private IBits docsWithField;
             private readonly BytesRef spare;
-            
+
             public virtual void Collect(int doc)
             {
                 terms.Get(doc, spare);
@@ -825,7 +826,7 @@ namespace Lucene.Net.Tests.Join
                 }
                 joinScore.AddScore(scorer.GetScore());
             }
-            
+
             public virtual void SetNextReader(AtomicReaderContext context)
             {
                 terms = FieldCache.DEFAULT.GetTerms(context.AtomicReader, fromField, true);
@@ -851,7 +852,7 @@ namespace Lucene.Net.Tests.Join
             private int docBase;
 
             public CollectorAnonymousClass5(
-                string toField, IDictionary<BytesRef, JoinScore> joinValueToJoinScores, 
+                string toField, IDictionary<BytesRef, JoinScore> joinValueToJoinScores,
                 IDictionary<int, JoinScore> docToJoinScore)
             {
                 this.toField = toField;
@@ -879,7 +880,7 @@ namespace Lucene.Net.Tests.Join
                     }
                 }
             }
-            
+
             public virtual void SetNextReader(AtomicReaderContext context)
             {
                 docBase = context.DocBase;
@@ -904,8 +905,8 @@ namespace Lucene.Net.Tests.Join
             private readonly BytesRef spare = new BytesRef();
 
             public CollectorAnonymousClass6(
-                string toField, 
-                IDictionary<BytesRef, JoinScore> joinValueToJoinScores, 
+                string toField,
+                IDictionary<BytesRef, JoinScore> joinValueToJoinScores,
                 IDictionary<int, JoinScore> docToJoinScore)
             {
                 this.toField = toField;
@@ -922,7 +923,7 @@ namespace Lucene.Net.Tests.Join
                 }
                 docToJoinScore[docBase + doc] = joinScore;
             }
-            
+
             public virtual void SetNextReader(AtomicReaderContext context)
             {
                 terms = FieldCache.DEFAULT.GetTerms(context.AtomicReader, toField, false);
@@ -946,18 +947,18 @@ namespace Lucene.Net.Tests.Join
                 : context.ToHitsToJoinScore[queryValue];
 
             var hits = new List<KeyValuePair<int, JoinScore>>(hitsToJoinScores);
-            hits.Sort(Comparer< KeyValuePair<int, JoinScore>>.Create( (hit1, hit2) =>
-            {
-                float score1 = hit1.Value.Score(scoreMode);
-                float score2 = hit2.Value.Score(scoreMode);
-
-                int cmp = score2.CompareTo(score1);
-                if (cmp != 0)
-                {
-                    return cmp;
-                }
-                return hit1.Key - hit2.Key;
-            }));
+            hits.Sort(Comparer<KeyValuePair<int, JoinScore>>.Create((hit1, hit2) =>
+          {
+              float score1 = hit1.Value.Score(scoreMode);
+              float score2 = hit2.Value.Score(scoreMode);
+
+              int cmp = score2.CompareTo(score1);
+              if (cmp != 0)
+              {
+                  return cmp;
+              }
+              return hit1.Key - hit2.Key;
+          }));
             ScoreDoc[] scoreDocs = new ScoreDoc[Math.Min(10, hits.Count)];
             for (int i = 0; i < scoreDocs.Length; i++)
             {
diff --git a/src/Lucene.Net.Tests.Join/TestBlockJoin.cs b/src/Lucene.Net.Tests.Join/TestBlockJoin.cs
index c12ae3f..f04cecf 100644
--- a/src/Lucene.Net.Tests.Join/TestBlockJoin.cs
+++ b/src/Lucene.Net.Tests.Join/TestBlockJoin.cs
@@ -5,8 +5,6 @@ using Lucene.Net.Documents;
 using Lucene.Net.Documents.Extensions;
 using Lucene.Net.Index;
 using Lucene.Net.Index.Extensions;
-using Lucene.Net.Join;
-using Lucene.Net.Search;
 using Lucene.Net.Search.Grouping;
 using Lucene.Net.Store;
 using Lucene.Net.Util;
@@ -19,7 +17,7 @@ using System.Linq;
 using System.Text;
 using Console = Lucene.Net.Util.SystemConsole;
 
-namespace Lucene.Net.Tests.Join
+namespace Lucene.Net.Search.Join
 {
     /*
      * Licensed to the Apache Software Foundation (ASF) under one or more
diff --git a/src/Lucene.Net.Tests.Join/TestBlockJoinSorting.cs b/src/Lucene.Net.Tests.Join/TestBlockJoinSorting.cs
index f12137f..fc1258c 100644
--- a/src/Lucene.Net.Tests.Join/TestBlockJoinSorting.cs
+++ b/src/Lucene.Net.Tests.Join/TestBlockJoinSorting.cs
@@ -3,15 +3,13 @@ using Lucene.Net.Analysis;
 using Lucene.Net.Documents;
 using Lucene.Net.Index;
 using Lucene.Net.Index.Extensions;
-using Lucene.Net.Join;
-using Lucene.Net.Search;
 using Lucene.Net.Store;
 using Lucene.Net.Util;
 using NUnit.Framework;
 using RandomizedTesting.Generators;
 using System.Collections.Generic;
 
-namespace Lucene.Net.Tests.Join
+namespace Lucene.Net.Search.Join
 {
     /*
      * Licensed to the Apache Software Foundation (ASF) under one or more
diff --git a/src/Lucene.Net.Tests.Join/TestBlockJoinValidation.cs b/src/Lucene.Net.Tests.Join/TestBlockJoinValidation.cs
index 9e97e12..40ae57f 100644
--- a/src/Lucene.Net.Tests.Join/TestBlockJoinValidation.cs
+++ b/src/Lucene.Net.Tests.Join/TestBlockJoinValidation.cs
@@ -2,8 +2,6 @@
 using Lucene.Net.Analysis;
 using Lucene.Net.Documents;
 using Lucene.Net.Index;
-using Lucene.Net.Join;
-using Lucene.Net.Search;
 using Lucene.Net.Store;
 using Lucene.Net.Util;
 using NUnit.Framework;
@@ -12,7 +10,7 @@ using System;
 using System.Collections.Generic;
 using System.Text;
 
-namespace Lucene.Net.Tests.Join
+namespace Lucene.Net.Search.Join
 {
     /*
      * Licensed to the Apache Software Foundation (ASF) under one or more
diff --git a/src/Lucene.Net.Tests.Join/TestJoinUtil.cs b/src/Lucene.Net.Tests.Join/TestJoinUtil.cs
index 9c984dd..1bcc291 100644
--- a/src/Lucene.Net.Tests.Join/TestJoinUtil.cs
+++ b/src/Lucene.Net.Tests.Join/TestJoinUtil.cs
@@ -4,8 +4,6 @@ using Lucene.Net.Diagnostics;
 using Lucene.Net.Documents;
 using Lucene.Net.Index;
 using Lucene.Net.Index.Extensions;
-using Lucene.Net.Join;
-using Lucene.Net.Search;
 using Lucene.Net.Store;
 using Lucene.Net.Util;
 using NUnit.Framework;
@@ -16,7 +14,7 @@ using System.Globalization;
 using Console = Lucene.Net.Util.SystemConsole;
 using JCG = J2N.Collections.Generic;
 
-namespace Lucene.Net.Tests.Join
+namespace Lucene.Net.Search.Join
 {
     /*
      * Licensed to the Apache Software Foundation (ASF) under one or more
diff --git a/src/Lucene.Net.Tests/Support/ExceptionHandling/TestExceptionExtensions.cs b/src/Lucene.Net.Tests/Support/ExceptionHandling/TestExceptionExtensions.cs
index f7f0213..628b09e 100644
--- a/src/Lucene.Net.Tests/Support/ExceptionHandling/TestExceptionExtensions.cs
+++ b/src/Lucene.Net.Tests/Support/ExceptionHandling/TestExceptionExtensions.cs
@@ -126,7 +126,7 @@ namespace Lucene
             typeof(Lucene.Net.Facet.Facets).Assembly,                              // Lucene.Net.Facet
             typeof(Lucene.Net.Search.Grouping.ICollectedSearchGroup).Assembly,     // Lucene.Net.Grouping
             typeof(Lucene.Net.Search.Highlight.DefaultEncoder).Assembly,           // Lucene.Net.Highlighter
-            typeof(Lucene.Net.Join.JoinUtil).Assembly,                             // Lucene.Net.Join
+            typeof(Lucene.Net.Search.Join.JoinUtil).Assembly,                      // Lucene.Net.Join
             typeof(Lucene.Net.Index.Memory.MemoryIndex).Assembly,                  // Lucene.Net.Memory
             typeof(Lucene.Net.Misc.SweetSpotSimilarity).Assembly,                  // Lucene.Net.Misc
             typeof(Lucene.Net.Queries.BooleanFilter).Assembly,                     // Lucene.Net.Queries
diff --git a/websites/apidocs/docfx.join.json b/websites/apidocs/docfx.join.json
index e713688..8ce0f4a 100644
--- a/websites/apidocs/docfx.join.json
+++ b/websites/apidocs/docfx.join.json
@@ -1,4 +1,4 @@
-{
+{
   "metadata": [
     {
       "src": [
@@ -20,7 +20,13 @@
     }
   ],
   "build": {
-    "content": [       
+    "content": [
+      {
+        "files": [
+          "package.md"
+        ],
+        "src": "../../src/Lucene.Net.Join"
+      },    
       {
         "files": [
           "**.yml",
@@ -44,7 +50,7 @@
         ],
         "src": "../../src/Lucene.Net.Join",
         "exclude": [
-          "overview.md"
+          "package.md"
         ]
       },     
       {