Requête pour récupérer champs avec java sous elasticsearch version 6.6

Bonjour
Jai indexer des documents et jai besoin de récupérer uniquement ces champs en JAVA que j'arrive à visiualiser avec le plugin chrome elasticsearh HEAD.

LES CHAMPS RECHERCHE:

  • "attachment": {
    • "date": "2009-03-25T13:32:21Z",
    • "content_type": "application/pdf",
    • "author": "Vincent",
    • "language": "fr",
    • "title": "Microsoft cv.doc",
      imgelastic
      LES CHAMPS DISPONIBLES

valeur de la cle : entreprise
valeur de la cle : data
valeur de la cle : attachment
valeur de la cle : typeDocument
valeur de la cle : nomFichier
valeur de la cle : url
valeur de la cle : timestamp

LE CODE PARTIEL UTILISE

RestHighLevelClient client = new RestHighLevelClient(
		        RestClient.builder(
		                new HttpHost("localhost", 9200, "http"),
		                new HttpHost("localhost", 9201, "http")));
			
			SearchRequest searchRequest = new SearchRequest("dossier"); 
			SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); 
			searchSourceBuilder.query(QueryBuilders.matchAllQuery()); 
			searchSourceBuilder.size(1);
			searchRequest.source(searchSourceBuilder);
	        SearchResponse response = client.search(searchRequest);		
	        SearchHit[] searchHits = response.getHits().getHits();	 
	        
	        for (SearchHit hit : searchHits) {

	        	Map<String, Object> map = hit.getSourceAsMap();

	        	System.out.println("valeur  : "+ map.get("attachment"));
	        	System.out.println("valeur  : "+ map.get("data"));
	        	
	        	/*
	        	 * 	valeur de la cle : entreprise
					valeur de la cle : data
					valeur de la cle : attachment
					valeur de la cle : typeDocument
					valeur de la cle : nomFichier
					valeur de la cle : url
					valeur de la cle : timestamp
	        	 * */

	        	
	        	
	        }

Et ? Qu'est ce qui ne fonctionne pas ?

je cherchais à recupere des informations sur les documents déjà indexer , mais j'y arrivais pas jai trouvé une solution .

String [] includeFields = new String [ ] {"attachment.content_type","attachment.language"};
String [] excludeFields = new String[] {"url"};
searchSourceBuilder.fetchSource(includeFields,excludeFields);

enfin dans une boucle recupere les champs ainsi :

 for (SearchHit hit : searchHits) {
	        	Map<String, Object> map = hit.getSourceAsMap();
	        
	        	//conversion json
	        	String json = gson.toJson(map);
	        	//System.out.println(json);
	        	
	        	//lecture du champs 
	        	String content_type = JsonPath.read(json, "$.attachment.content_type");
	       	 	System.out.println(content_type);
				
	       	 	String language = JsonPath.read(json, "$.attachment.language");
	       	 	System.out.println(language);
	       	 	
	        }

Je ne pense pas que ce soit la bonne méthode donc je suis toujours à l'écoute.

C'est une méthode. Elle a l'avantage de faire passer sur le réseau moins de données.

Une petite question comment traduire cette requete sous java api

 { "query" : { 
                        "bool":{
                            "must":[
                                   {"match": { "attachment.content": "test" }},
                                   {"match": { "typeDocument": "pdf" }},
                                    {"match": { "entreprise": "fr"}},
                                 ]        
                            }
                        }

je l'ecrirai ainsi mais cependant c'est correct ??

searchSourceBuilder.query(QueryBuilders.matchQuery("attachment.content","test")
searchSourceBuilder.query(QueryBuilders.matchQuery("typeDocument","pdf")
searchSourceBuilder.query(QueryBuilders.matchQuery("entreprise","fr")

Non. Il faut que tu fasses une bool query. Et que tu appelles la méthode must pour chaque clause que tu veux mettre.

Je comprends alors ceci :

searchSourceBuilder.query(QueryBuilders.boolQuery().must(QueryBuilders.matchQuery("attachment.content",hit)));

Maintenant j’ai un souci je veux que ce soit plusieurs mots clés qui sont chercher à la fois sur le même champs ("attachment.content","test") et ("attachment.content","test2") .

Mais cependant sans savoir à l'avance le nombre de mot clé utilisé.

Tu fais un boucle for sur tes mots clés et pour chaque tu appelles:

boolQuery.must(QueryBuilders.matchQuery("attachment.content", motcle));

Merci pour votre réponse je vois :

 BoolQueryBuilder constBool = QueryBuilders.boolQuery();
 for(String hit : rechParams) {		 
 	constBool.must(QueryBuilders.matchQuery("attachment.content",hit));
 }

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.