/*
* Licensed to Elasticsearch under one or more contributor
* license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright
* ownership. Elasticsearch 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.
*/
package org.elasticsearch.index;
import org.apache.lucene.search.Sort;
import org.apache.lucene.search.SortField;
import org.apache.lucene.search.SortedNumericSortField;
import org.apache.lucene.search.SortedSetSortField;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.test.ESIntegTestCase;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import java.io.IOException;
import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
import static org.hamcrest.Matchers.containsString;
public class IndexSortIT extends ESIntegTestCase {
private static final XContentBuilder TEST_MAPPING = createTestMapping();
private static XContentBuilder createTestMapping() {
try {
return jsonBuilder()
.startObject()
.startObject("properties")
.startObject("date")
.field("type", "date")
.endObject()
.startObject("numeric")
.field("type", "integer")
.field("doc_values", false)
.endObject()
.startObject("numeric_dv")
.field("type", "integer")
.field("doc_values", true)
.endObject()
.startObject("keyword_dv")
.field("type", "keyword")
.field("doc_values", true)
.endObject()
.startObject("keyword")
.field("type", "keyword")
.field("doc_values", false)
.endObject()
.endObject().endObject();
} catch (IOException e) {
throw new IllegalStateException(e);
}
}
public void testIndexSort() {
SortField dateSort = new SortedNumericSortField("date", SortField.Type.LONG, false);
dateSort.setMissingValue(Long.MAX_VALUE);
SortField numericSort = new SortedNumericSortField("numeric_dv", SortField.Type.LONG, false);
numericSort.setMissingValue(Long.MAX_VALUE);
SortField keywordSort = new SortedSetSortField("keyword_dv", false);
keywordSort.setMissingValue(SortField.STRING_LAST);
Sort indexSort = new Sort(dateSort, numericSort, keywordSort);
prepareCreate("test")
.setSettings(Settings.builder()
.put(indexSettings())
.put("index.number_of_shards", "1")
.put("index.number_of_replicas", "1")
.putArray("index.sort.field", "date", "numeric_dv", "keyword_dv")
)
.addMapping("test", TEST_MAPPING)
.get();
for (int i = 0; i < 20; i++) {
client().prepareIndex("test", "test", Integer.toString(i))
.setSource("numeric_dv", randomInt(), "keyword_dv", randomAlphaOfLengthBetween(10, 20))
.get();
}
flushAndRefresh();
ensureYellow();
assertSortedSegments("test", indexSort);
}
public void testInvalidIndexSort() {
IllegalArgumentException exc = expectThrows(IllegalArgumentException.class,
() -> prepareCreate("test")
.setSettings(Settings.builder()
.put(indexSettings())
.putArray("index.sort.field", "invalid_field")
)
.addMapping("test", TEST_MAPPING)
.get()
);
assertThat(exc.getMessage(), containsString("unknown index sort field:[invalid_field]"));
exc = expectThrows(IllegalArgumentException.class,
() -> prepareCreate("test")
.setSettings(Settings.builder()
.put(indexSettings())
.putArray("index.sort.field", "numeric")
)
.addMapping("test", TEST_MAPPING)
.get()
);
assertThat(exc.getMessage(), containsString("docvalues not found for index sort field:[numeric]"));
exc = expectThrows(IllegalArgumentException.class,
() -> prepareCreate("test")
.setSettings(Settings.builder()
.put(indexSettings())
.putArray("index.sort.field", "keyword")
)
.addMapping("test", TEST_MAPPING)
.get()
);
assertThat(exc.getMessage(), containsString("docvalues not found for index sort field:[keyword]"));
}
}