2014-12-02 8 views
5

Ho un indice elasticsearch avere utenti con campi come .. "name": "kai" "età": "23" "location": "Delhi , India tag" "": [ "ricerca", "NoSQL"] eccCercando più stringhe in tutti i campi di elasticsearch utilizzando Java API

voglio interrogare stringhe multiple in tutti i campi di utente (ad esempio. [ "NoSQL", "delhi"]). È possibile utilizzare l'API Java?

Ecco un esempio di codice che sto usando. (Ma è irrilevante per la domanda) È solo per conoscere gli oggetti che sto usando in questo momento.

BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery() 
       .must(QueryBuilders.matchAllQuery()); 
     if(location!=null) { 
      queryBuilder.must(QueryBuilders.matchQuery("location",location)); 
     } 
     BoolFilterBuilder filerBuilder=FilterBuilders.boolFilter();  
     for(String skill:skills){ 
      filerBuilder.must(FilterBuilders.rangeFilter("tags."+skill).from(0)); 
     } 
     filerBuilder.must(FilterBuilders.queryFilter(queryBuilder)); 
     if(age!=null) { 
      filerBuilder.must(FilterBuilders.rangeFilter("age").from(age[0]).to(age[1])); 
     } 
     SearchResponse response = client.prepareSearch("skillbin") 
       .setTypes("stackdump") 
       .setSearchType(SearchType.QUERY_AND_FETCH) 
       .setQuery(queryBuilder) 
       .setPostFilter(filerBuilder) 
       .addSort("reputation", SortOrder.DESC) 
       .execute() 
       .actionGet(); 
     SearchHits hits=response.getHits(); 

Grazie in anticipo. :)

risposta

1

Se si utilizza l'analizzatore standard, elasticsearch tokenizza ogni parola per impostazione predefinita utilizzando tokenizzatore di spazio bianco.

È possibile utilizzare query string query per la ricerca in questo caso, in cui è possibile aggiungere più campi in cui eseguire la ricerca. Inoltre, l'operatore di query di query dell'interrogazione della stringa è "OR". Quindi se il termine di ricerca è "nosql delhi" (come nel tuo caso), viene tradotto in "nosql OR delhi" e ricercato in tutti i campi specificati nella query. In questo modo puoi cercare più termini in più campi.

Spero che questo aiuti.

7

Nell'API Java, è possibile eseguire una query sul campo "_all", che per impostazione predefinita include tutti i campi di un documento. Un modo alternativo è utilizzare MultiMatchQuery che è più flessibile e consente di specificare un elenco di campi su cui si desidera eseguire una query.

Ecco alcuni esempi di codice su come accedere al campo "_all" e su come creare un MultiMatchQuery utilizzando MultiMatchQueryBuilder e QueryBuilders. multiMatchQuery lungo un query per cercare in all the fields:

String queryString = "nosql delhi"; 

String allField = "_all"; 

MultiMatchQueryBuilder mmqb = QueryBuilders.multiMatchQuery(queryString, allField); 
+0

Grazie @hexabunny. –

Problemi correlati