2016-07-28 1 views
0

Intention: ElasticSearch Java requête MoreLikeThis en Java pour faire exactement ce que la première ci-dessous more_like_this requête filtrée via le point final de repos /_search est en train de faire.ElasticSearch API Java MoreLikeThis pas de documents de retour par rapport à « _search » repos point final

GET /index/type/_search 
{ 
    "query": { 
    "filtered": { 
     "query": { 
     "more_like_this": { 
      "fields": [ 
      "title", 
      "body", 
      "description", 
      "organisations", 
      "locations" 
      ], 
      "min_term_freq": 2, 
      "max_query_terms": 25, 
      "ids": [ 
      "http://xxx/doc/doc" 
      ] 
     } 
     }, 
     "filter": { 
     "range": { 
      "datePublished": { 
      "gte": "2016-01-01T12:30:00+01:00" 
      } 
     } 
     } 
    } 
    }, 
    "fields": [ 
    "title", 
    "description", 
    "datePublished" 
    ] 
} 

Et ceci est mon implémentation de Java pour ce qui précède:

FilteredQueryBuilder queryBuilder = new FilteredQueryBuilder(QueryBuilders.matchAllQuery(),FilterBuilders.rangeFilter("datePublished").gte(("2016-01-01T12:30:00+01:00"))); 
SearchSourceBuilder query = SearchSourceBuilder.searchSource().query(queryBuilder); 
return client.prepareMoreLikeThis("index", "type", "http://xxx/doc/doc") 
    .setField("title", "description", "body", "organisations","locations") 
    .setMinTermFreq(2) 
    .maxQueryTerms(25) 
    .setSearchSource(query); 

Cependant, les résultats diffèrent loin du point final de repos more_like_this était de retour. Je reçois des correspondances d'environ 4/5 de tous mes documents dans l'index. Comme si aucun des filtres sont appliqués

ciblage ES v1.4.2 et v1.6.2

Tous les conseils please.Thanks

+0

Vous avez différents datePublié les filtres – alpert

+0

vous voulez dire la différence de dates? si c'était le cas, c'était une faute de frappe de ma part d'écrire ceci pour ce post. Si c'est une différence dans le mécanisme de filtrage, veuillez élaborer, merci @alpert – DaddyMoe

Répondre

0

Je suis les résultats du désir avec QueryBuilders.moreLikeThisQuery(). Inspirations de ce poste here.

FilterBuilder filterBuilder = FilterBuilders.rangeFilter("datePublished") 
     .gte("2016-01-01T12:30:00+01:00") 
     .includeLower(false).includeUpper(false); 

    MoreLikeThisQueryBuilder mltQueryBuilder = QueryBuilders.moreLikeThisQuery("title", "description", "body", "organisations","locations") 
     .minTermFreq(2) 
     .maxQueryTerms(25) 
     .ids("http://xxx/doc/doc"); 

    SearchRequestBuilder searchRequestBuilder = client.prepareSearch("index"); 

    searchRequestBuilder.setTypes("type"); 
    searchRequestBuilder.addFields("title","description","datePublished"); 
    searchRequestBuilder.setQuery(mltQueryBuilder).setPostFilter(filterBuilder); 

    searchRequestBuilder.execute().actionGet() 

Notes:

  • QueryBuilders semble être la voie à suivre en termes de compatibilité avec v2.0 ES et Beyound
  • @MoreLikeThisRequestBuilder seront dépréciés en ES v1.6 + et retiré dans la version 2.0