2014-12-02 14 views
5

kullanarak Elasticsearch tüm alanlarda birden dizeleri aranıyor "Delhi , Hindistan" "etiket": [ "arama", "NoSQL"] vbBen gibi alanlarda kullanıcılara sahip bir elasticsearch indeksi .. "ad" ettik Java API

Ben kullanıcının tüm alanlarda birden dizeleri sorgulamak istiyorum

(Ör. [ "NoSQL", "delhi"]). Java API kullanarak mümkün mü?

Kullandığım kod örneğidir. (Ama bu soruyla alakasızdır) Sadece şu an kullandığım nesneleri tanımak.

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

Şimdiden teşekkürler.

cevap

1

Standart analiz cihazı kullanıyorsanız, elasticsearch her boşluk kelimesini varsayılan olarak beyaz boşluk belirteçleri kullanarak belirtir.

Aramanız için query string query numaralı telefonu kullanabilirsiniz. Bu durumda, arama yapmak için birden fazla alan ekleyebilirsiniz. Ayrıca sorgu dizisi sorgusunun varsayılan işleci "VEYA" olur. Dolayısıyla, arama teriminiz "nosql delhi" ise (sizin durumunuzda olduğu gibi), "nosql OR delhi" ye çevrilir ve sorguda belirtilen tüm alanlarda araştırılır. Bu sayede birden çok alanda birden çok terim arayabilirsiniz.

Bu yardımcı olur umarım.

7

Java API'sinde, varsayılan olarak bir belgenin tüm alanlarını içeren "_all" alanına karşı sorgulayabilirsiniz. Alternatif olarak, daha esnek olan ve sorgulamak istediğiniz alanların bir listesini belirtmenizi sağlayan MultiMatchQuery kullanın.

"_all" alanına nasıl erişileceği ve MultiMatchQueryBuilder ve QueryBuilders kullanarak MultiMatchQuery'un nasıl oluşturulacağı ile ilgili bazı örnek kodlar. Bir query boyunca multiMatchQueryin all the fields aramak için:

String queryString = "nosql delhi"; 

String allField = "_all"; 

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

teşekkürler @hexabunny. –

İlgili konular