blob: bda42ea536a36deea6fc2d962a4b2bbe978bdf1c [file] [log] [blame]
<!DOCTYPE html>
<!--[if IE]><![endif]-->
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>Namespace Lucene.Net.Index.Sorter
| Apache Lucene.NET 4.8.0-beta00010 Documentation </title>
<meta name="viewport" content="width=device-width">
<meta name="title" content="Namespace Lucene.Net.Index.Sorter
| Apache Lucene.NET 4.8.0-beta00010 Documentation ">
<meta name="generator" content="docfx 2.56.0.0">
<link rel="shortcut icon" href="https://lucenenet.apache.org/docs/4.8.0-beta00009/logo/favicon.ico">
<link rel="stylesheet" href="https://lucenenet.apache.org/docs/4.8.0-beta00009/styles/docfx.vendor.css">
<link rel="stylesheet" href="https://lucenenet.apache.org/docs/4.8.0-beta00009/styles/docfx.css">
<link rel="stylesheet" href="https://lucenenet.apache.org/docs/4.8.0-beta00009/styles/main.css">
<meta property="docfx:navrel" content="toc.html">
<meta property="docfx:tocrel" content="misc/toc.html">
<meta property="docfx:rel" content="https://lucenenet.apache.org/docs/4.8.0-beta00009/">
</head>
<body data-spy="scroll" data-target="#affix" data-offset="120">
<div id="wrapper">
<header>
<nav id="autocollapse" class="navbar ng-scope" role="navigation">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="/">
<img id="logo" class="svg" src="https://lucenenet.apache.org/docs/4.8.0-beta00009/logo/lucene-net-color.png" alt="">
</a>
</div>
<div class="collapse navbar-collapse" id="navbar">
<form class="navbar-form navbar-right" role="search" id="search">
<div class="form-group">
<input type="text" class="form-control" id="search-query" placeholder="Search" autocomplete="off">
</div>
</form>
</div>
</div>
</nav>
<div class="subnav navbar navbar-default">
<div class="container hide-when-search">
<ul class="level0 breadcrumb">
<li>
<a href="https://lucenenet.apache.org/docs/4.8.0-beta00009/">API</a>
<span id="breadcrumb">
<ul class="breadcrumb">
<li></li>
</ul>
</span>
</li>
</ul>
</div>
</div>
</header>
<div class="container body-content">
<div id="search-results">
<div class="search-list"></div>
<div class="sr-items">
<p><i class="glyphicon glyphicon-refresh index-loading"></i></p>
</div>
<ul id="pagination"></ul>
</div>
</div>
<div role="main" class="container body-content hide-when-search">
<div class="sidenav hide-when-search">
<a class="btn toc-toggle collapse" data-toggle="collapse" href="#sidetoggle" aria-expanded="false" aria-controls="sidetoggle">Show / Hide Table of Contents</a>
<div class="sidetoggle collapse" id="sidetoggle">
<div id="sidetoc"></div>
</div>
</div>
<div class="article row grid-right">
<div class="col-md-10">
<article class="content wrap" id="_content" data-uid="Lucene.Net.Index.Sorter">
<h1 id="Lucene_Net_Index_Sorter" data-uid="Lucene.Net.Index.Sorter" class="text-break">Namespace Lucene.Net.Index.Sorter
</h1>
<div class="markdown level0 summary"><!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<p>Provides index sorting capablities. The application can use any
Sort specification, e.g. to sort by fields using DocValues or FieldCache, or to
reverse the order of the documents (by using SortField.Type.DOC in reverse).
Multi-level sorts can be specified the same way you would when searching, by
building Sort from multiple SortFields.</p>
<p><a class="xref" href="Lucene.Net.Index.Sorter.SortingMergePolicy.html">SortingMergePolicy</a> can be used to
make Lucene sort segments before merging them. This will ensure that every
segment resulting from a merge will be sorted according to the provided
&lt;xref:Lucene.Net.Search.Sort&gt;. This however makes merging and
thus indexing slower.</p>
<p>Sorted segments allow for early query termination when the sort order
matches index order. This makes query execution faster since not all documents
need to be visited. Please note that this is an expert feature and should not
be used without a deep understanding of Lucene merging and document collection.</p>
</div>
<div class="markdown level0 conceptual"></div>
<div class="markdown level0 remarks"></div>
<h3 id="classes">Classes
</h3>
<h4><a class="xref" href="Lucene.Net.Index.Sorter.BlockJoinComparerSource.html">BlockJoinComparerSource</a></h4>
<section><p>Helper class to sort readers that contain blocks of documents.
<p>
Note that this class is intended to used with <a class="xref" href="Lucene.Net.Index.Sorter.SortingMergePolicy.html">SortingMergePolicy</a>,
and for other purposes has some limitations:
<ul><li>Cannot yet be used with <a class="xref" href="http://localhost:8080/api/core/Lucene.Net.Search.IndexSearcher.html#Lucene_Net_Search_IndexSearcher_SearchAfter_Lucene_Net_Search_ScoreDoc_Lucene_Net_Search_Query_Lucene_Net_Search_Filter_System_Int32_Lucene_Net_Search_Sort_">SearchAfter(ScoreDoc, Query, Filter, Int32, Sort)</a></li><li>Filling sort field values is not yet supported.</li></ul></p>
<div class="lucene-block lucene-experimental">This is a Lucene.NET EXPERIMENTAL API, use at your own risk</div><p>
</section>
<h4><a class="xref" href="Lucene.Net.Index.Sorter.EarlyTerminatingSortingCollector.html">EarlyTerminatingSortingCollector</a></h4>
<section><p>A <span class="xref">Lucene.Net.Search.ICollector</span> that early terminates collection of documents on a
per-segment basis, if the segment was sorted according to the given
<span class="xref">Lucene.Net.Search.Sort</span>.</p>
<p>
<strong>NOTE:</strong> the <span class="xref">Lucene.Net.Search.ICollector</span> detects sorted segments according to
<a class="xref" href="Lucene.Net.Index.Sorter.SortingMergePolicy.html">SortingMergePolicy</a>, so it&apos;s best used in conjunction with it. Also,
it collects up to a specified <a class="xref" href="Lucene.Net.Index.Sorter.EarlyTerminatingSortingCollector.html#Lucene_Net_Index_Sorter_EarlyTerminatingSortingCollector_m_numDocsToCollect">m_numDocsToCollect</a> from each segment,
and therefore is mostly suitable for use in conjunction with collectors such as
<a class="xref" href="http://localhost:8080/api/core/Lucene.Net.Search.TopDocsCollector-1.html">TopDocsCollector&lt;T&gt;</a>, and not e.g. <a class="xref" href="http://localhost:8080/api/core/Lucene.Net.Search.TotalHitCountCollector.html">TotalHitCountCollector</a>.
</p>
<p>
<strong>NOTE</strong>: If you wrap a <a class="xref" href="http://localhost:8080/api/core/Lucene.Net.Search.TopDocsCollector-1.html">TopDocsCollector&lt;T&gt;</a> that sorts in the same
order as the index order, the returned <a class="xref" href="http://localhost:8080/api/core/Lucene.Net.Search.TopDocsCollector-1.html#Lucene_Net_Search_TopDocsCollector_1_GetTopDocs">GetTopDocs()</a>
will be correct. However the total of <a class="xref" href="http://localhost:8080/api/core/Lucene.Net.Search.TopDocsCollector-1.html#Lucene_Net_Search_TopDocsCollector_1_TotalHits">TotalHits</a>
hit count will be underestimated since not all matching documents will have
been collected.
</p>
<p>
<strong>NOTE</strong>: This <span class="xref">Lucene.Net.Search.ICollector</span> uses <a class="xref" href="http://localhost:8080/api/core/Lucene.Net.Search.Sort.html#Lucene_Net_Search_Sort_ToString">ToString()</a> to detect
whether a segment was sorted with the same <span class="xref">Lucene.Net.Search.Sort</span>. This has
two implications:
<ul>
<li>if a custom comparer is not implemented correctly and returns
different identifiers for equivalent instances, this collector will not
detect sorted segments,</li>
<li>if you suddenly change the <span class="xref">Lucene.Net.Index.IndexWriter</span>&apos;s
<a class="xref" href="Lucene.Net.Index.Sorter.SortingMergePolicy.html">SortingMergePolicy</a> to sort according to another criterion and if both
the old and the new <span class="xref">Lucene.Net.Search.Sort</span>s have the same identifier, this
<span class="xref">Lucene.Net.Search.ICollector</span> will incorrectly detect sorted segments.</li>
</ul>
@lucene.experimental
</p>
</section>
<h4><a class="xref" href="Lucene.Net.Index.Sorter.SortingAtomicReader.html">SortingAtomicReader</a></h4>
<section><p>An <span class="xref">Lucene.Net.Index.AtomicReader</span> which supports sorting documents by a given
<span class="xref">Lucene.Net.Search.Sort</span>. You can use this class to sort an index as follows:</p>
<pre><code>IndexWriter writer; // writer to which the sorted index will be added
DirectoryReader reader; // reader on the input index
Sort sort; // determines how the documents are sorted
AtomicReader sortingReader = SortingAtomicReader.Wrap(SlowCompositeReaderWrapper.Wrap(reader), sort);
writer.AddIndexes(reader);
reader.Dispose(); // alternatively, you can use a using block
writer.Dispose(); // alternatively, you can use a using block</code></pre>
<div class="lucene-block lucene-experimental">This is a Lucene.NET EXPERIMENTAL API, use at your own risk</div></section>
<h4><a class="xref" href="Lucene.Net.Index.Sorter.SortingMergePolicy.html">SortingMergePolicy</a></h4>
<section><p>A <span class="xref">Lucene.Net.Index.MergePolicy</span> that reorders documents according to a <span class="xref">Lucene.Net.Search.Sort</span>
before merging them. As a consequence, all segments resulting from a merge
will be sorted while segments resulting from a flush will be in the order
in which documents have been added.
<p><strong>NOTE</strong>: Never use this policy if you rely on
<a class="xref" href="http://localhost:8080/api/core/Lucene.Net.Index.IndexWriter.html#Lucene_Net_Index_IndexWriter_AddDocuments_System_Collections_Generic_IEnumerable_System_Collections_Generic_IEnumerable_Lucene_Net_Index_IIndexableField___Lucene_Net_Analysis_Analyzer_">AddDocuments(IEnumerable&lt;IEnumerable&lt;IIndexableField&gt;&gt;, Analyzer)</a>
to have sequentially-assigned doc IDs, this policy will scatter doc IDs.
</p>
<p><strong>NOTE</strong>: This policy should only be used with idempotent <span class="xref">Lucene.Net.Search.Sort</span>s
so that the order of segments is predictable. For example, using
<a class="xref" href="http://localhost:8080/api/core/Lucene.Net.Search.Sort.html#Lucene_Net_Search_Sort_INDEXORDER">INDEXORDER</a> in reverse (which is not idempotent) will make
the order of documents in a segment depend on the number of times the segment
has been merged.</p>
<div class="lucene-block lucene-experimental">This is a Lucene.NET EXPERIMENTAL API, use at your own risk</div><p>
</p></p>
</section>
</article>
</div>
<div class="hidden-sm col-md-2" role="complementary">
<div class="sideaffix">
<div class="contribution">
<ul class="nav">
<li>
<a href="https://github.com/apache/lucenenet/blob/docs/4.8.0-beta00010/src/Lucene.Net.Misc/Index/Sorter/package.md/#L2" class="contribution-link">Improve this Doc</a>
</li>
</ul>
</div>
<nav class="bs-docs-sidebar hidden-print hidden-xs hidden-sm affix" id="affix">
<!-- <p><a class="back-to-top" href="#top">Back to top</a><p> -->
</nav>
</div>
</div>
</div>
</div>
<footer>
<div class="grad-bottom"></div>
<div class="footer">
<div class="container">
<span class="pull-right">
<a href="#top">Back to top</a>
</span>
Copyright © 2020 Licensed to the Apache Software Foundation (ASF)
</div>
</div>
</footer>
</div>
<script type="text/javascript" src="https://lucenenet.apache.org/docs/4.8.0-beta00009/styles/docfx.vendor.js"></script>
<script type="text/javascript" src="https://lucenenet.apache.org/docs/4.8.0-beta00009/styles/docfx.js"></script>
<script type="text/javascript" src="https://lucenenet.apache.org/docs/4.8.0-beta00009/styles/main.js"></script>
</body>
</html>