15
15
*/
16
16
package org .springframework .data .elasticsearch .core ;
17
17
18
+
18
19
import org .elasticsearch .action .get .GetResponse ;
19
20
import org .elasticsearch .action .search .SearchResponse ;
21
+ import org .elasticsearch .common .base .Strings ;
22
+ import org .elasticsearch .common .jackson .core .JsonEncoding ;
23
+ import org .elasticsearch .common .jackson .core .JsonFactory ;
24
+ import org .elasticsearch .common .jackson .core .JsonGenerator ;
20
25
import org .elasticsearch .search .SearchHit ;
26
+ import org .elasticsearch .search .SearchHitField ;
21
27
import org .elasticsearch .search .facet .Facet ;
22
28
import org .springframework .data .domain .Pageable ;
23
29
import org .springframework .data .elasticsearch .core .facet .DefaultFacetMapper ;
24
30
import org .springframework .data .elasticsearch .core .facet .FacetResult ;
25
31
32
+ import java .io .ByteArrayOutputStream ;
33
+ import java .io .IOException ;
34
+ import java .nio .charset .Charset ;
26
35
import java .util .ArrayList ;
36
+ import java .util .Collection ;
27
37
import java .util .List ;
28
38
29
39
/**
@@ -45,7 +55,11 @@ public <T> FacetedPage<T> mapResults(SearchResponse response, Class<T> clazz, Pa
45
55
List <T > results = new ArrayList <T >();
46
56
for (SearchHit hit : response .getHits ()) {
47
57
if (hit != null ) {
48
- results .add (mapEntity (hit .sourceAsString (), clazz ));
58
+ if (!Strings .isNullOrEmpty (hit .sourceAsString ())) {
59
+ results .add (mapEntity (hit .sourceAsString (), clazz ));
60
+ } else {
61
+ results .add (mapEntity (hit .getFields ().values (), clazz ));
62
+ }
49
63
}
50
64
}
51
65
List <FacetResult > facets = new ArrayList <FacetResult >();
@@ -61,6 +75,35 @@ public <T> FacetedPage<T> mapResults(SearchResponse response, Class<T> clazz, Pa
61
75
return new FacetedPageImpl <T >(results , pageable , totalHits , facets );
62
76
}
63
77
78
+ private <T > T mapEntity (Collection <SearchHitField > values , Class <T > clazz ) {
79
+ return mapEntity (buildJSONFromFields (values ), clazz );
80
+ }
81
+
82
+ private String buildJSONFromFields (Collection <SearchHitField > values ) {
83
+ JsonFactory nodeFactory = new JsonFactory ();
84
+ try {
85
+ ByteArrayOutputStream stream = new ByteArrayOutputStream ();
86
+ JsonGenerator generator = nodeFactory .createGenerator (stream , JsonEncoding .UTF8 );
87
+ generator .writeStartObject ();
88
+ for (SearchHitField value : values ) {
89
+ if (value .getValues ().size () > 1 ) {
90
+ generator .writeArrayFieldStart (value .getName ());
91
+ for (Object val : value .getValues ()) {
92
+ generator .writeObject (val );
93
+ }
94
+ generator .writeEndArray ();
95
+ } else {
96
+ generator .writeObjectField (value .getName (), value .getValue ());
97
+ }
98
+ }
99
+ generator .writeEndObject ();
100
+ generator .flush ();
101
+ return new String (stream .toByteArray (), Charset .forName ("UTF-8" ));
102
+ } catch (IOException e ) {
103
+ return null ;
104
+ }
105
+ }
106
+
64
107
@ Override
65
108
public <T > T mapResult (GetResponse response , Class <T > clazz ) {
66
109
return mapEntity (response .getSourceAsString (),clazz );
0 commit comments