SortField for SortedSetDocValues. A SortedSetDocValues contains multiple values for a field, so sorting with this technique "selects" a value as the representative sort value for the document. By default, the minimum value in the set is selected as the sort value, but this can be customized. Selectors other than the default do have some limitations (see below) to ensure that all selections happen in constant-time for performance. Like sorting by string, this also supports sorting missing values as first or last, via SetMissingValue(object). Limitations: Fields containing int.MaxValue or more unique values are unsupported. Selectors other than the default Selector.MIN require optional codec support. However several codecs provided by Lucene, including the current default codec, support this.
Наследование: Lucene.Net.Search.SortField
        public void TestMiddleMaxMissingLast()
        {
            Directory         dir    = NewDirectory();
            RandomIndexWriter writer = new RandomIndexWriter(
#if FEATURE_INSTANCE_TESTDATA_INITIALIZATION
                this,
#endif
                Random, dir);
            Document doc = new Document();

            doc.Add(NewStringField("id", "3", Field.Store.YES));
            writer.AddDocument(doc);
            doc = new Document();
            doc.Add(new SortedSetDocValuesField("value", new BytesRef("a")));
            doc.Add(new SortedSetDocValuesField("value", new BytesRef("b")));
            doc.Add(new SortedSetDocValuesField("value", new BytesRef("c")));
            doc.Add(new SortedSetDocValuesField("value", new BytesRef("d")));
            doc.Add(NewStringField("id", "1", Field.Store.YES));
            writer.AddDocument(doc);
            doc = new Document();
            doc.Add(new SortedSetDocValuesField("value", new BytesRef("b")));
            doc.Add(NewStringField("id", "2", Field.Store.YES));
            writer.AddDocument(doc);
            IndexReader ir = writer.GetReader();

            writer.Dispose();

            // slow wrapper does not support random access ordinals (there is no need for that!)
            IndexSearcher searcher  = NewSearcher(ir, false);
            SortField     sortField = new SortedSetSortField("value", false, Selector.MIDDLE_MAX);

            sortField.MissingValue = SortField.STRING_LAST;
            Sort sort = new Sort(sortField);

            TopDocs td = searcher.Search(new MatchAllDocsQuery(), 10, sort);

            assertEquals(3, td.TotalHits);
            // 'b' comes before 'c'
            assertEquals("2", searcher.Doc(td.ScoreDocs[0].Doc).Get("id"));
            assertEquals("1", searcher.Doc(td.ScoreDocs[1].Doc).Get("id"));
            // null comes last
            assertEquals("3", searcher.Doc(td.ScoreDocs[2].Doc).Get("id"));
            assertNoFieldCaches();

            ir.Dispose();
            dir.Dispose();
        }
Пример #2
0
        public void TestMissingLast()
        {
            Directory         dir    = NewDirectory();
            RandomIndexWriter writer = new RandomIndexWriter(
#if FEATURE_INSTANCE_TESTDATA_INITIALIZATION
                this,
#endif
                Random, dir);
            Document doc = new Document();

            doc.Add(new SortedSetDocValuesField("value", new BytesRef("baz")));
            doc.Add(NewStringField("id", "2", Field.Store.YES));
            writer.AddDocument(doc);
            doc = new Document();
            doc.Add(new SortedSetDocValuesField("value", new BytesRef("foo")));
            doc.Add(new SortedSetDocValuesField("value", new BytesRef("bar")));
            doc.Add(NewStringField("id", "1", Field.Store.YES));
            writer.AddDocument(doc);
            doc = new Document();
            doc.Add(NewStringField("id", "3", Field.Store.YES));
            writer.AddDocument(doc);
            IndexReader ir = writer.GetReader();

            writer.Dispose();

            IndexSearcher searcher  = NewSearcher(ir);
            SortField     sortField = new SortedSetSortField("value", false);

            sortField.MissingValue = SortField.STRING_LAST;
            Sort sort = new Sort(sortField);

            TopDocs td = searcher.Search(new MatchAllDocsQuery(), 10, sort);

            assertEquals(3, td.TotalHits);
            // 'bar' comes before 'baz'
            assertEquals("1", searcher.Doc(td.ScoreDocs[0].Doc).Get("id"));
            assertEquals("2", searcher.Doc(td.ScoreDocs[1].Doc).Get("id"));
            // null comes last
            assertEquals("3", searcher.Doc(td.ScoreDocs[2].Doc).Get("id"));
            assertNoFieldCaches();

            ir.Dispose();
            dir.Dispose();
        }
        public void TestMiddleMinMissingFirst()
        {
            Directory         dir    = NewDirectory();
            RandomIndexWriter writer = new RandomIndexWriter(Random(), dir, Similarity, TimeZone);
            Document          doc    = new Document();

            doc.Add(NewStringField("id", "3", Field.Store.YES));
            writer.AddDocument(doc);
            doc = new Document();
            doc.Add(new SortedSetDocValuesField("value", new BytesRef("c")));
            doc.Add(NewStringField("id", "2", Field.Store.YES));
            writer.AddDocument(doc);
            doc = new Document();
            doc.Add(new SortedSetDocValuesField("value", new BytesRef("a")));
            doc.Add(new SortedSetDocValuesField("value", new BytesRef("b")));
            doc.Add(new SortedSetDocValuesField("value", new BytesRef("c")));
            doc.Add(new SortedSetDocValuesField("value", new BytesRef("d")));
            doc.Add(NewStringField("id", "1", Field.Store.YES));
            writer.AddDocument(doc);
            IndexReader ir = writer.Reader;

            writer.Dispose();

            // slow wrapper does not support random access ordinals (there is no need for that!)
            IndexSearcher searcher  = NewSearcher(ir, false);
            SortField     sortField = new SortedSetSortField("value", false, Selector.MIDDLE_MIN);

            sortField.MissingValue = SortField.STRING_FIRST;
            Sort sort = new Sort(sortField);

            TopDocs td = searcher.Search(new MatchAllDocsQuery(), 10, sort);

            assertEquals(3, td.TotalHits);
            // null comes first
            assertEquals("3", searcher.Doc(td.ScoreDocs[0].Doc).Get("id"));
            // 'b' comes before 'c'
            assertEquals("1", searcher.Doc(td.ScoreDocs[1].Doc).Get("id"));
            assertEquals("2", searcher.Doc(td.ScoreDocs[2].Doc).Get("id"));
            assertNoFieldCaches();

            ir.Dispose();
            dir.Dispose();
        }
Пример #4
0
        public void TestEquals()
        {
            SortField sf = new SortedSetSortField("a", false);

            assertFalse(sf.equals(null));


            assertEquals(sf, sf);

            SortField sf2 = new SortedSetSortField("a", false);

            assertEquals(sf, sf2);
            assertEquals(sf.GetHashCode(), sf2.GetHashCode());


            assertFalse(sf.equals(new SortedSetSortField("a", true)));
            assertFalse(sf.equals(new SortedSetSortField("b", false)));
            assertFalse(sf.equals(new SortedSetSortField("a", false, Selector.MAX)));
            assertFalse(sf.equals("foo"));
        }
Пример #5
0
        public void TestMissingFirst()
        {
            Directory         dir    = NewDirectory();
            RandomIndexWriter writer = new RandomIndexWriter(Random(), dir, Similarity, TimeZone);
            Document          doc    = new Document();

            doc.Add(new SortedSetDocValuesField("value", new BytesRef("baz")));
            doc.Add(NewStringField("id", "2", Field.Store.YES));
            writer.AddDocument(doc);
            doc = new Document();
            doc.Add(new SortedSetDocValuesField("value", new BytesRef("foo")));
            doc.Add(new SortedSetDocValuesField("value", new BytesRef("bar")));
            doc.Add(NewStringField("id", "1", Field.Store.YES));
            writer.AddDocument(doc);
            doc = new Document();
            doc.Add(NewStringField("id", "3", Field.Store.YES));
            writer.AddDocument(doc);
            IndexReader ir = writer.Reader;

            writer.Dispose();

            IndexSearcher searcher  = NewSearcher(ir);
            SortField     sortField = new SortedSetSortField("value", false);

            sortField.MissingValue = SortField.STRING_FIRST;
            Sort sort = new Sort(sortField);

            TopDocs td = searcher.Search(new MatchAllDocsQuery(), 10, sort);

            assertEquals(3, td.TotalHits);
            // 'bar' comes before 'baz'
            // null comes first
            assertEquals("3", searcher.Doc(td.ScoreDocs[0].Doc).Get("id"));
            assertEquals("1", searcher.Doc(td.ScoreDocs[1].Doc).Get("id"));
            assertEquals("2", searcher.Doc(td.ScoreDocs[2].Doc).Get("id"));
            assertNoFieldCaches();

            ir.Dispose();
            dir.Dispose();
        }
Пример #6
0
        public override bool Equals(object obj)
        {
            if (this == obj)
            {
                return(true);
            }
            if (!base.Equals(obj))
            {
                return(false);
            }
            if (GetType() != obj.GetType())
            {
                return(false);
            }
            SortedSetSortField other = (SortedSetSortField)obj;

            if (selector != other.selector)
            {
                return(false);
            }
            return(true);
        }
Пример #7
0
        public void TestMissingLast()
        {
            Directory         dir    = NewDirectory();
            RandomIndexWriter writer = new RandomIndexWriter(Random, dir);
            Document          doc    = new Document();

            doc.Add(NewStringField("value", "baz", Field.Store.NO));
            doc.Add(NewStringField("id", "2", Field.Store.YES));
            writer.AddDocument(doc);
            doc = new Document();
            doc.Add(NewStringField("value", "foo", Field.Store.NO));
            doc.Add(NewStringField("value", "bar", Field.Store.NO));
            doc.Add(NewStringField("id", "1", Field.Store.YES));
            writer.AddDocument(doc);
            doc = new Document();
            doc.Add(NewStringField("id", "3", Field.Store.YES));
            writer.AddDocument(doc);
            IndexReader ir = writer.GetReader();

            writer.Dispose();

            IndexSearcher searcher  = NewSearcher(ir);
            SortField     sortField = new SortedSetSortField("value", false);

            sortField.SetMissingValue(SortField.STRING_LAST);
            Sort sort = new Sort(sortField);

            TopDocs td = searcher.Search(new MatchAllDocsQuery(), 10, sort);

            assertEquals(3, td.TotalHits);
            // 'bar' comes before 'baz'
            assertEquals("1", searcher.Doc(td.ScoreDocs[0].Doc).Get("id"));
            assertEquals("2", searcher.Doc(td.ScoreDocs[1].Doc).Get("id"));
            // null comes last
            assertEquals("3", searcher.Doc(td.ScoreDocs[2].Doc).Get("id"));

            ir.Dispose();
            dir.Dispose();
        }
        public void TestMiddleMaxMissingLast()
        {
            Directory dir = NewDirectory();
            RandomIndexWriter writer = new RandomIndexWriter(Random(), dir, Similarity, TimeZone);
            Document doc = new Document();
            doc.Add(NewStringField("id", "3", Field.Store.YES));
            writer.AddDocument(doc);
            doc = new Document();
            doc.Add(new SortedSetDocValuesField("value", new BytesRef("a")));
            doc.Add(new SortedSetDocValuesField("value", new BytesRef("b")));
            doc.Add(new SortedSetDocValuesField("value", new BytesRef("c")));
            doc.Add(new SortedSetDocValuesField("value", new BytesRef("d")));
            doc.Add(NewStringField("id", "1", Field.Store.YES));
            writer.AddDocument(doc);
            doc = new Document();
            doc.Add(new SortedSetDocValuesField("value", new BytesRef("b")));
            doc.Add(NewStringField("id", "2", Field.Store.YES));
            writer.AddDocument(doc);
            IndexReader ir = writer.Reader;
            writer.Dispose();

            // slow wrapper does not support random access ordinals (there is no need for that!)
            IndexSearcher searcher = NewSearcher(ir, false);
            SortField sortField = new SortedSetSortField("value", false, Selector.MIDDLE_MAX);
            sortField.MissingValue = (SortField.STRING_LAST);
            Sort sort = new Sort(sortField);

            TopDocs td = searcher.Search(new MatchAllDocsQuery(), 10, sort);
            assertEquals(3, td.TotalHits);
            // 'b' comes before 'c'
            assertEquals("2", searcher.Doc(td.ScoreDocs[0].Doc).Get("id"));
            assertEquals("1", searcher.Doc(td.ScoreDocs[1].Doc).Get("id"));
            // null comes last
            assertEquals("3", searcher.Doc(td.ScoreDocs[2].Doc).Get("id"));
            assertNoFieldCaches();

            ir.Dispose();
            dir.Dispose();
        }
Пример #9
0
 public TermOrdValComparerAnonymousClass(SortedSetSortField outerInstance, int numHits)
     : base(numHits, outerInstance.Field, outerInstance.m_missingValue == STRING_LAST)
 {
     this.outerInstance = outerInstance;
 }
Пример #10
0
        public void TestMissingFirst()
        {
            Directory dir = NewDirectory();
            RandomIndexWriter writer = new RandomIndexWriter(Random(), dir, Similarity, TimeZone);
            Document doc = new Document();
            doc.Add(NewStringField("value", "baz", Field.Store.NO));
            doc.Add(NewStringField("id", "2", Field.Store.YES));
            writer.AddDocument(doc);
            doc = new Document();
            doc.Add(NewStringField("value", "foo", Field.Store.NO));
            doc.Add(NewStringField("value", "bar", Field.Store.NO));
            doc.Add(NewStringField("id", "1", Field.Store.YES));
            writer.AddDocument(doc);
            doc = new Document();
            doc.Add(NewStringField("id", "3", Field.Store.YES));
            writer.AddDocument(doc);
            IndexReader ir = writer.Reader;
            writer.Dispose();

            IndexSearcher searcher = NewSearcher(ir);
            SortField sortField = new SortedSetSortField("value", false);
            sortField.MissingValue = (SortField.STRING_FIRST);
            Sort sort = new Sort(sortField);

            TopDocs td = searcher.Search(new MatchAllDocsQuery(), 10, sort);
            assertEquals(3, td.TotalHits);
            // 'bar' comes before 'baz'
            // null comes first
            assertEquals("3", searcher.Doc(td.ScoreDocs[0].Doc).Get("id"));
            assertEquals("1", searcher.Doc(td.ScoreDocs[1].Doc).Get("id"));
            assertEquals("2", searcher.Doc(td.ScoreDocs[2].Doc).Get("id"));

            ir.Dispose();
            dir.Dispose();
        }
Пример #11
0
        public void TestEquals()
        {
            SortField sf = new SortedSetSortField("a", false);
            assertFalse(sf.equals(null));


            assertEquals(sf, sf);

            SortField sf2 = new SortedSetSortField("a", false);
            assertEquals(sf, sf2);
            assertEquals(sf.GetHashCode(), sf2.GetHashCode());


            assertFalse(sf.equals(new SortedSetSortField("a", true)));
            assertFalse(sf.equals(new SortedSetSortField("b", false)));
            assertFalse(sf.equals(new SortedSetSortField("a", false, Selector.MAX)));
            assertFalse(sf.equals("foo"));
        }
Пример #12
0
 public TermOrdValComparatorAnonymousHelper(SortedSetSortField outerInstance, int numHits)
     : base(numHits, outerInstance.Field, outerInstance.missingValue == STRING_LAST)
 {
     this.outerInstance = outerInstance;
     this.numHits       = numHits;
 }
Пример #13
0
 public TermOrdValComparatorAnonymousHelper(SortedSetSortField outerInstance, int numHits)
     : base(numHits, outerInstance.Field, outerInstance.missingValue == STRING_LAST)
 {
     this.outerInstance = outerInstance;
     this.numHits = numHits;
 }