2016-08-28 8 views
7

uczę o elastycznego wyszukiwania i śledzę the next tutorial, ale pojawia się następny błądElastic Search numer obiektu przekazany musi być nawet

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) 

mógłbyś mi pomóc to naprawić proszę?

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()); 
    } 
} 

Odpowiedz

6

Podsumowanie:

  1. Json obiekt nie może być stosowany jako źródło do indeksowania
  2. Albo stringify Twój json używając coś podobnego Jackson lub ustaw źródło jako Mapie

Jackson :

String stringifiedJson = objectMapper.writeValueAsString (jsonObject)

1

przypadku korzystania z biblioteki org.json do zarządzania zawartością JSON i wystąpienia tego błędu, można rozwiązać to w ten sposób (ustawienie jako źródło map jako skgemini zaproponowany w 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));