package org.xbib.elasticsearch.index.analysis.naturalsort;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.search.sort.SortOrder;
import org.junit.Test;
import org.xbib.elasticsearch.NodeTestUtils;
import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
import static org.junit.Assert.assertEquals;
/**
*
*/
public class NaturalSortKeyTests extends NodeTestUtils {
@Test
public void testSort() throws Exception {
startCluster();
try {
Settings settings = Settings.builder()
.build();
client().admin().indices().prepareCreate("test")
.setSettings(settings)
.addMapping("type1", jsonBuilder().startObject()
.startObject("type1")
.startObject("properties")
.startObject("points")
.field("type", "text")
.field("store", true)
.startObject("fields")
.startObject("sort")
.field("type", "text")
.field("analyzer", "naturalsort")
.field("fielddata", true)
.endObject()
.endObject()
.endObject()
.endObject()
.endObject()
.endObject())
.execute().actionGet();
client().admin().cluster().prepareHealth().setWaitForYellowStatus().execute().actionGet();
String[] words = new String[]{
"Bob: 3 points", "Bob: 10 points", "Bob: 2 points"
};
for (String word : words) {
client().prepareIndex("test", "type1")
.setSource(jsonBuilder().startObject()
.field("points", word)
.endObject()).execute().actionGet();
}
client().admin().indices().prepareRefresh().execute().actionGet();
SearchResponse searchResponse = client().prepareSearch()
.addStoredField("points")
.addSort("points.sort", SortOrder.ASC)
.execute().actionGet();
assertEquals(3L, searchResponse.getHits().getTotalHits());
assertEquals("Bob: 2 points", searchResponse.getHits().getAt(0).getFields().get("points").getValue().toString());
assertEquals("Bob: 3 points", searchResponse.getHits().getAt(1).getFields().get("points").getValue().toString());
assertEquals("Bob: 10 points", searchResponse.getHits().getAt(2).getFields().get("points").getValue().toString());
} finally {
stopCluster();
}
}
@Test
public void testComplex() throws Exception {
startCluster();
try {
Settings settings = Settings.builder()
.build();
client().admin().indices().prepareCreate("test")
.setSettings(settings)
.addMapping("type1", jsonBuilder().startObject()
.startObject("type1")
.startObject("properties")
.startObject("points")
.field("type", "text")
.field("store", true)
.startObject("fields")
.startObject("sort")
.field("type", "text")
.field("analyzer", "naturalsort")
.field("fielddata", true)
.endObject()
.endObject()
.endObject()
.endObject()
.endObject()
.endObject())
.execute().actionGet();
client().admin().cluster().prepareHealth().setWaitForGreenStatus().execute().actionGet();
String[] words = new String[]{
"7 201 2 1", "7 25 2 1", "7 1 1 1", "7 10 1 1", "7 2 1 2", "7 20 2 1"
};
for (String word : words) {
client().prepareIndex("test", "type1")
.setSource(jsonBuilder().startObject().field("points", word).endObject()).execute().actionGet();
}
client().admin().indices().prepareRefresh().execute().actionGet();
SearchResponse searchResponse = client().prepareSearch()
.addStoredField("points")
.addSort("points.sort", SortOrder.ASC)
.execute().actionGet();
assertEquals(6L, searchResponse.getHits().getTotalHits());
assertEquals("7 1 1 1", searchResponse.getHits().getAt(0).getField("points").getValue().toString());
assertEquals("7 2 1 2", searchResponse.getHits().getAt(1).getField("points").getValue().toString());
assertEquals("7 10 1 1", searchResponse.getHits().getAt(2).getField("points").getValue().toString());
assertEquals("7 20 2 1", searchResponse.getHits().getAt(3).getField("points").getValue().toString());
assertEquals("7 25 2 1", searchResponse.getHits().getAt(4).getField("points").getValue().toString());
assertEquals("7 201 2 1", searchResponse.getHits().getAt(5).getField("points").getValue().toString());
searchResponse = client().prepareSearch()
.addStoredField("points")
.addSort("points.sort", SortOrder.DESC)
.execute().actionGet();
assertEquals(6L, searchResponse.getHits().getTotalHits());
assertEquals("7 201 2 1", searchResponse.getHits().getAt(0).getField("points").getValue().toString());
assertEquals("7 25 2 1", searchResponse.getHits().getAt(1).getField("points").getValue().toString());
assertEquals("7 20 2 1", searchResponse.getHits().getAt(2).getField("points").getValue().toString());
assertEquals("7 10 1 1", searchResponse.getHits().getAt(3).getField("points").getValue().toString());
assertEquals("7 2 1 2", searchResponse.getHits().getAt(4).getField("points").getValue().toString());
assertEquals("7 1 1 1", searchResponse.getHits().getAt(5).getField("points").getValue().toString());
} finally {
stopCluster();
}
}
@Test
public void testDewey() throws Exception {
startCluster();
try {
Settings settings = Settings.builder()
.build();
client().admin().indices().prepareCreate("test")
.setSettings(settings)
.addMapping("type1", jsonBuilder().startObject()
.startObject("type1")
.startObject("properties")
.startObject("notation")
.field("type", "text")
.field("store", true)
.startObject("fields")
.startObject("sort")
.field("type", "text")
.field("analyzer", "naturalsort")
.field("fielddata", true)
.endObject()
.endObject()
.endObject()
.endObject()
.endObject()
.endObject())
.execute().actionGet();
client().admin().cluster().prepareHealth().setWaitForGreenStatus().execute().actionGet();
String[] notations = new String[]{
"10.10.1", "10.1.1", "2.11.0", "2.10.1", "2.1.1", "1.10.0", "1.0.0"
};
for (String notation : notations) {
client().prepareIndex("test", "type1")
.setSource(jsonBuilder().startObject()
.field("notation", notation)
.endObject()).execute().actionGet();
}
client().admin().indices().prepareRefresh().execute().actionGet();
SearchResponse searchResponse = client().prepareSearch()
.addStoredField("notation")
.addSort("notation.sort", SortOrder.ASC)
.execute().actionGet();
assertEquals(7L, searchResponse.getHits().getTotalHits());
assertEquals("1.0.0", searchResponse.getHits().getAt(0).getFields().get("notation").getValue().toString());
assertEquals("1.10.0", searchResponse.getHits().getAt(1).getFields().get("notation").getValue().toString());
assertEquals("2.1.1", searchResponse.getHits().getAt(2).getFields().get("notation").getValue().toString());
assertEquals("2.10.1", searchResponse.getHits().getAt(3).getFields().get("notation").getValue().toString());
assertEquals("2.11.0", searchResponse.getHits().getAt(4).getFields().get("notation").getValue().toString());
assertEquals("10.1.1", searchResponse.getHits().getAt(5).getFields().get("notation").getValue().toString());
assertEquals("10.10.1", searchResponse.getHits().getAt(6).getFields().get("notation").getValue().toString());
} finally {
stopCluster();
}
}
}