anchor.diff:              for i in 0 .. flexIndex.Shards.Length - 1 do
                   let searcher = (flexIndex.Shards.[i].NRTManager :> ReferenceManager).acquire() :?> IndexSearcher
                   indexSearchers.Add(searcher)
  -                    
  -            let searchResults = ConcurrentDictionary<int, TopDocs>()
  -            
  +            
  +            // Each thread only works on a separate part of the array and as no parts are shared across
  +            // multiple threads the belows variables are thread safe. The cost of using blockingcollection vs 
  +            // array per search is high
  +            let topDocsCollection: TopDocs array = Array.zeroCreate indexSearchers.Count
  +            let searchCount: int array = Array.zeroCreate indexSearchers.Count
  +
               let sort =
                   match search.OrderBy with
                   | null -> Sort.RELEVANCE
  
positive.code:                 // This is to enable proper sorting
                  let topFieldCollector = TopFieldCollector.create(sort, search.Count, true, true, true, true) 
                  indexSearchers.[x.ShardNumber].search(query, topFieldCollector)
                  searchResults.TryAdd(x.ShardNumber, topFieldCollector.topDocs()) |> ignore
              )
  
              // TODO: optimize this code to use a f# pattern
              let topDocsCollection =
                  searchResults 
                  |> Seq.sortBy(fun x -> x.Key)
                  |> Seq.map(fun x -> x.Value)
                  |> Seq.toArray
  
              let totalDocs = TopDocs.merge(sort, search.Count, topDocsCollection)
              let hits = totalDocs.scoreDocs
  
  
negative.code:     [<ExportMetadata("Name", "fuzzy_match")>]
      type FlexFuzzyQuery() =
          interface IFlexQuery with
              member this.GetQuery(flexIndexField, condition) =
                 
                  let terms = GetTerms(flexIndexField, condition.Values.[0])
  