The elastic search number of the object passed must be even

I study elastic search and I follow the next tutorial , but I get the following error

Exception in thread "main" java.lang.IllegalArgumentException: The number of object passed must be even but was [1] at org.elasticsearch.action.index.IndexRequest.source(IndexRequest.java:451) at elastic.elasti.App.lambda$0(App.java:55) at java.util.ArrayList.forEach(ArrayList.java:1249) at elastic.elasti.App.indexExampleData(App.java:53) at elastic.elasti.App.main(App.java:45) 

Could you help me fix this?

 public class App { public static void main( String[] args ) throws TwitterException, UnknownHostException { System.out.println( "Hello World!" ); List tweetJsonList = searchForTweets(); Client client = TransportClient.builder().build() .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300)); String index = "tweets_juan"; client.admin().indices() .create(new CreateIndexRequest(index)) .actionGet(); indexExampleData(client, tweetJsonList, index); searchExample(client); } public static void indexExampleData(Client client, List tweetJsonList, String index) { BulkRequestBuilder bulkRequestBuilder = client.prepareBulk(); tweetJsonList.forEach((jsonTweet) -> { bulkRequestBuilder.add(new IndexRequest(index, "tweets_juan") .source(jsonTweet)); }); BulkResponse bulkItemResponses = bulkRequestBuilder.get(); } public static void searchExample(Client client) { BoolQueryBuilder queryBuilder = QueryBuilders .boolQuery() .must(termsQuery("text", "espaΓ±a")); SearchResponse searchResponse = client.prepareSearch("tweets_juan") .setQuery(queryBuilder) .setSize(25) .execute() .actionGet(); } public static List searchForTweets() throws TwitterException { Twitter twitter = new TwitterFactory().getInstance(); Query query = new Query("mundial baloncesto"); List tweetList = new ArrayList<>(); for (int i = 0; i < 10; i++) { QueryResult queryResult = twitter.search(query); tweetList.addAll(queryResult.getTweets()); if (!queryResult.hasNext()) { break; } query = queryResult.nextQuery(); } Gson gson = new Gson(); return (List) tweetList.stream().map(gson::toJson).collect(Collectors.toList()); } } 
+7
elasticsearch
source share
2 answers

Summary:

  • Json object cannot be used as source for indexing
  • Either Stringify json using something like Jackson, or set the source as Map

Jackson:

String stringifiedJson = objectMapper.writeValueAsString (jsonObject)

+6
source share

If you use the org.json library to manage JSON content and encounter this error, you can solve it this way (setting the source as Map, like skgemini suggested in his answer ):

 JSONObject dataAsJson = new JSONObject(dataAsJsonFormattedString); HashMap<String, Object> dataAsMap = new HashMap<String, Object>(dataAsJson.toMap()); bulkRequestBuilder.add(new IndexRequest(index, "tweets_juan").source(dataAsMap, XContentType.JSON)); 
+1
source share

All Articles