Make _all field accessible with GET

GET only returned null even when stored if requested with GET like this:

`curl -XGET "http://localhost:9200/test/test/1?fields=_all"`

Instead, it should simply behave like a String field and return the
concatenated fields as String.

closes #6924
This commit is contained in:
Britta Weber 2014-07-18 16:02:14 +02:00
parent 08f8731b6f
commit 734e656a91
2 changed files with 31 additions and 9 deletions

View File

@ -56,7 +56,7 @@ import static org.elasticsearch.index.mapper.core.TypeParsers.parseField;
/**
*
*/
public class AllFieldMapper extends AbstractFieldMapper<Void> implements InternalMapper, RootMapper {
public class AllFieldMapper extends AbstractFieldMapper<String> implements InternalMapper, RootMapper {
public interface IncludeInAll extends Mapper {
@ -237,15 +237,13 @@ public class AllFieldMapper extends AbstractFieldMapper<Void> implements Interna
}
return analyzer;
}
@Override
public Void value(Object value) {
return null;
}
@Override
public Object valueForSearch(Object value) {
return null;
public String value(Object value) {
if (value == null) {
return null;
}
return value.toString();
}
@Override

View File

@ -885,4 +885,28 @@ public class GetActionTests extends ElasticsearchIntegrationTest {
assertThat(getResponse.getField(field).getValues().get(1).toString(), equalTo("value2"));
}
@Test
public void testGet_allField() throws Exception {
prepareCreate("my-index")
.addMapping("my-type1", jsonBuilder()
.startObject()
.startObject("my-type1")
.startObject("_all")
.field("store", true)
.endObject()
.startObject("properties")
.startObject("some_field")
.field("type", "string")
.endObject()
.endObject()
.endObject()
.endObject())
.get();
index("my-index", "my-type1", "1", "some_field", "some text");
refresh();
GetResponse getResponse = client().prepareGet("my-index", "my-type1", "1").setFields("_all").get();
assertNotNull(getResponse.getField("_all").getValue());
assertThat(getResponse.getField("_all").getValue().toString(), equalTo("some text" + " "));
}
}