Search in sources :

Example 51 with SortField

use of org.apache.lucene.search.SortField in project lucene-solr by apache.

the class TestGrouping method getComparator.

private Comparator<GroupDoc> getComparator(Sort sort) {
    final SortField[] sortFields = sort.getSort();
    return new Comparator<GroupDoc>() {

        @Override
        public int compare(GroupDoc d1, GroupDoc d2) {
            for (SortField sf : sortFields) {
                final int cmp;
                if (sf.getType() == SortField.Type.SCORE) {
                    if (d1.score > d2.score) {
                        cmp = -1;
                    } else if (d1.score < d2.score) {
                        cmp = 1;
                    } else {
                        cmp = 0;
                    }
                } else if (sf.getField().equals("sort1")) {
                    cmp = d1.sort1.compareTo(d2.sort1);
                } else if (sf.getField().equals("sort2")) {
                    cmp = d1.sort2.compareTo(d2.sort2);
                } else {
                    assertEquals(sf.getField(), "id");
                    cmp = d1.id - d2.id;
                }
                if (cmp != 0) {
                    return sf.getReverse() ? -cmp : cmp;
                }
            }
            // Our sort always fully tie breaks:
            fail();
            return 0;
        }
    };
}
Also used : SortField(org.apache.lucene.search.SortField) Comparator(java.util.Comparator)

Example 52 with SortField

use of org.apache.lucene.search.SortField in project lucene-solr by apache.

the class TestLatLonPointDistanceSort method doRandomTest.

private void doRandomTest(int numDocs, int numQueries) throws IOException {
    Directory dir = newDirectory();
    IndexWriterConfig iwc = newIndexWriterConfig();
    // else seeds may not to reproduce:
    iwc.setMergeScheduler(new SerialMergeScheduler());
    RandomIndexWriter writer = new RandomIndexWriter(random(), dir, iwc);
    for (int i = 0; i < numDocs; i++) {
        Document doc = new Document();
        doc.add(new StoredField("id", i));
        doc.add(new NumericDocValuesField("id", i));
        if (random().nextInt(10) > 7) {
            double latRaw = GeoTestUtil.nextLatitude();
            double lonRaw = GeoTestUtil.nextLongitude();
            // pre-normalize up front, so we can just use quantized value for testing and do simple exact comparisons
            double lat = decodeLatitude(encodeLatitude(latRaw));
            double lon = decodeLongitude(encodeLongitude(lonRaw));
            doc.add(new LatLonDocValuesField("field", lat, lon));
            doc.add(new StoredField("lat", lat));
            doc.add(new StoredField("lon", lon));
        }
        // otherwise "missing"
        writer.addDocument(doc);
    }
    IndexReader reader = writer.getReader();
    IndexSearcher searcher = newSearcher(reader);
    for (int i = 0; i < numQueries; i++) {
        double lat = GeoTestUtil.nextLatitude();
        double lon = GeoTestUtil.nextLongitude();
        double missingValue = Double.POSITIVE_INFINITY;
        Result[] expected = new Result[reader.maxDoc()];
        for (int doc = 0; doc < reader.maxDoc(); doc++) {
            Document targetDoc = reader.document(doc);
            final double distance;
            if (targetDoc.getField("lat") == null) {
                // missing
                distance = missingValue;
            } else {
                double docLatitude = targetDoc.getField("lat").numericValue().doubleValue();
                double docLongitude = targetDoc.getField("lon").numericValue().doubleValue();
                distance = SloppyMath.haversinMeters(lat, lon, docLatitude, docLongitude);
            }
            int id = targetDoc.getField("id").numericValue().intValue();
            expected[doc] = new Result(id, distance);
        }
        Arrays.sort(expected);
        // randomize the topN a bit
        int topN = TestUtil.nextInt(random(), 1, reader.maxDoc());
        // sort by distance, then ID
        SortField distanceSort = LatLonDocValuesField.newDistanceSort("field", lat, lon);
        distanceSort.setMissingValue(missingValue);
        Sort sort = new Sort(distanceSort, new SortField("id", SortField.Type.INT));
        TopDocs topDocs = searcher.search(new MatchAllDocsQuery(), topN, sort);
        for (int resultNumber = 0; resultNumber < topN; resultNumber++) {
            FieldDoc fieldDoc = (FieldDoc) topDocs.scoreDocs[resultNumber];
            Result actual = new Result((Integer) fieldDoc.fields[1], (Double) fieldDoc.fields[0]);
            assertEquals(expected[resultNumber], actual);
        }
        // get page2 with searchAfter()
        if (topN < reader.maxDoc()) {
            int page2 = TestUtil.nextInt(random(), 1, reader.maxDoc() - topN);
            TopDocs topDocs2 = searcher.searchAfter(topDocs.scoreDocs[topN - 1], new MatchAllDocsQuery(), page2, sort);
            for (int resultNumber = 0; resultNumber < page2; resultNumber++) {
                FieldDoc fieldDoc = (FieldDoc) topDocs2.scoreDocs[resultNumber];
                Result actual = new Result((Integer) fieldDoc.fields[1], (Double) fieldDoc.fields[0]);
                assertEquals(expected[topN + resultNumber], actual);
            }
        }
    }
    reader.close();
    writer.close();
    dir.close();
}
Also used : IndexSearcher(org.apache.lucene.search.IndexSearcher) FieldDoc(org.apache.lucene.search.FieldDoc) SortField(org.apache.lucene.search.SortField) MatchAllDocsQuery(org.apache.lucene.search.MatchAllDocsQuery) SerialMergeScheduler(org.apache.lucene.index.SerialMergeScheduler) TopDocs(org.apache.lucene.search.TopDocs) IndexReader(org.apache.lucene.index.IndexReader) Sort(org.apache.lucene.search.Sort) RandomIndexWriter(org.apache.lucene.index.RandomIndexWriter) Directory(org.apache.lucene.store.Directory) IndexWriterConfig(org.apache.lucene.index.IndexWriterConfig)

Example 53 with SortField

use of org.apache.lucene.search.SortField in project lucene-solr by apache.

the class BaseSegmentInfoFormatTestCase method testSort.

/** Test sort */
public void testSort() throws IOException {
    assumeTrue("test requires a codec that can read/write index sort", supportsIndexSort());
    final int iters = atLeast(5);
    for (int i = 0; i < iters; ++i) {
        Sort sort;
        if (i == 0) {
            sort = null;
        } else {
            final int numSortFields = TestUtil.nextInt(random(), 1, 3);
            SortField[] sortFields = new SortField[numSortFields];
            for (int j = 0; j < numSortFields; ++j) {
                sortFields[j] = randomIndexSortField();
            }
            sort = new Sort(sortFields);
        }
        Directory dir = newDirectory();
        Codec codec = getCodec();
        byte[] id = StringHelper.randomId();
        SegmentInfo info = new SegmentInfo(dir, getVersions()[0], getVersions()[0], "_123", 1, false, codec, Collections.<String, String>emptyMap(), id, new HashMap<>(), sort);
        info.setFiles(Collections.<String>emptySet());
        codec.segmentInfoFormat().write(dir, info, IOContext.DEFAULT);
        SegmentInfo info2 = codec.segmentInfoFormat().read(dir, "_123", id, IOContext.DEFAULT);
        assertEquals(sort, info2.getIndexSort());
        dir.close();
    }
}
Also used : Codec(org.apache.lucene.codecs.Codec) Sort(org.apache.lucene.search.Sort) SortedSetSortField(org.apache.lucene.search.SortedSetSortField) SortField(org.apache.lucene.search.SortField) SortedNumericSortField(org.apache.lucene.search.SortedNumericSortField) Directory(org.apache.lucene.store.Directory)

Example 54 with SortField

use of org.apache.lucene.search.SortField in project lucene-solr by apache.

the class BaseSegmentInfoFormatTestCase method randomIndexSortField.

private SortField randomIndexSortField() {
    boolean reversed = random().nextBoolean();
    SortField sortField;
    switch(random().nextInt(10)) {
        case 0:
            sortField = new SortField(TestUtil.randomSimpleString(random()), SortField.Type.INT, reversed);
            if (random().nextBoolean()) {
                sortField.setMissingValue(random().nextInt());
            }
            break;
        case 1:
            sortField = new SortedNumericSortField(TestUtil.randomSimpleString(random()), SortField.Type.INT, reversed);
            if (random().nextBoolean()) {
                sortField.setMissingValue(random().nextInt());
            }
            break;
        case 2:
            sortField = new SortField(TestUtil.randomSimpleString(random()), SortField.Type.LONG, reversed);
            if (random().nextBoolean()) {
                sortField.setMissingValue(random().nextLong());
            }
            break;
        case 3:
            sortField = new SortedNumericSortField(TestUtil.randomSimpleString(random()), SortField.Type.LONG, reversed);
            if (random().nextBoolean()) {
                sortField.setMissingValue(random().nextLong());
            }
            break;
        case 4:
            sortField = new SortField(TestUtil.randomSimpleString(random()), SortField.Type.FLOAT, reversed);
            if (random().nextBoolean()) {
                sortField.setMissingValue(random().nextFloat());
            }
            break;
        case 5:
            sortField = new SortedNumericSortField(TestUtil.randomSimpleString(random()), SortField.Type.FLOAT, reversed);
            if (random().nextBoolean()) {
                sortField.setMissingValue(random().nextFloat());
            }
            break;
        case 6:
            sortField = new SortField(TestUtil.randomSimpleString(random()), SortField.Type.DOUBLE, reversed);
            if (random().nextBoolean()) {
                sortField.setMissingValue(random().nextDouble());
            }
            break;
        case 7:
            sortField = new SortedNumericSortField(TestUtil.randomSimpleString(random()), SortField.Type.DOUBLE, reversed);
            if (random().nextBoolean()) {
                sortField.setMissingValue(random().nextDouble());
            }
            break;
        case 8:
            sortField = new SortField(TestUtil.randomSimpleString(random()), SortField.Type.STRING, reversed);
            if (random().nextBoolean()) {
                sortField.setMissingValue(SortField.STRING_LAST);
            }
            break;
        case 9:
            sortField = new SortedSetSortField(TestUtil.randomSimpleString(random()), reversed);
            if (random().nextBoolean()) {
                sortField.setMissingValue(SortField.STRING_LAST);
            }
            break;
        default:
            sortField = null;
            fail();
    }
    return sortField;
}
Also used : SortedNumericSortField(org.apache.lucene.search.SortedNumericSortField) SortedSetSortField(org.apache.lucene.search.SortedSetSortField) SortedSetSortField(org.apache.lucene.search.SortedSetSortField) SortField(org.apache.lucene.search.SortField) SortedNumericSortField(org.apache.lucene.search.SortedNumericSortField)

Example 55 with SortField

use of org.apache.lucene.search.SortField in project lucene-solr by apache.

the class LongPointField method getSortField.

@Override
public SortField getSortField(SchemaField field, boolean top) {
    field.checkSortability();
    Object missingValue = null;
    boolean sortMissingLast = field.sortMissingLast();
    boolean sortMissingFirst = field.sortMissingFirst();
    if (sortMissingLast) {
        missingValue = top ? Long.MIN_VALUE : Long.MAX_VALUE;
    } else if (sortMissingFirst) {
        missingValue = top ? Long.MAX_VALUE : Long.MIN_VALUE;
    }
    SortField sf = new SortField(field.getName(), SortField.Type.LONG, top);
    sf.setMissingValue(missingValue);
    return sf;
}
Also used : SortField(org.apache.lucene.search.SortField)

Aggregations

SortField (org.apache.lucene.search.SortField)231 Sort (org.apache.lucene.search.Sort)175 Document (org.apache.lucene.document.Document)116 Directory (org.apache.lucene.store.Directory)110 IndexSearcher (org.apache.lucene.search.IndexSearcher)90 MatchAllDocsQuery (org.apache.lucene.search.MatchAllDocsQuery)75 TopDocs (org.apache.lucene.search.TopDocs)74 IndexReader (org.apache.lucene.index.IndexReader)65 RandomIndexWriter (org.apache.lucene.index.RandomIndexWriter)62 SortedNumericSortField (org.apache.lucene.search.SortedNumericSortField)56 SortedSetSortField (org.apache.lucene.search.SortedSetSortField)56 MockAnalyzer (org.apache.lucene.analysis.MockAnalyzer)49 NumericDocValuesField (org.apache.lucene.document.NumericDocValuesField)37 TermQuery (org.apache.lucene.search.TermQuery)36 SortedNumericDocValuesField (org.apache.lucene.document.SortedNumericDocValuesField)32 Query (org.apache.lucene.search.Query)29 Term (org.apache.lucene.index.Term)25 BytesRef (org.apache.lucene.util.BytesRef)25 TopFieldDocs (org.apache.lucene.search.TopFieldDocs)24 StoredField (org.apache.lucene.document.StoredField)23