2012-05-27 13 views
6

निम्न स्वरूप में ES सूचकांक में JSON को देखते हुए:Elasticsearch QueryBuilder मैच एकाधिक शर्तें

{ 
    "pin": { 
     "id": 123, 
     "location": { 
      "lat": 456, 
      "lon":-789 
     } 
    } 
} 

निम्नलिखित id क्षेत्र मिलान दस्तावेज़ हो जाता है:

client.prepareSearch("index_name") 
     .setTypes("pin") 
     .setQuery(QueryBuilders.termQuery("id", 123)) 
     .execute() 
     .actionGet(); 

बजाय ', मैं मैच के लिए कोशिश कर रहा हूँ एकाधिक फ़ील्ड, यानी। (location.lat, location.lon)।

QueryBuilders.termQuery(); // accepts only a single term 

कुछ विकल्प की कोशिश की लेकिन इसके बारे में कोई नहीं है, काम करने के लिए जैसे लगता है:

QueryBuilder queryBuilder = QueryBuilders.boolQuery() 
     .must(QueryBuilders.termQuery("location.lat", 456)) 
     .must(QueryBuilders.termQuery("location.lon", -789)); 

client.prepareSearch("index_name") 
     .setTypes("pin") 
     .setQuery(queryBuilder) 
     .execute() 
     .actionGet(); 
+0

स्थान geo_point रूप में सूचीबद्ध किया है? – imotov

+0

हां, इसे 'geo_point' के रूप में मैप किया गया है। – ahmedyha

उत्तर

4

डिफ़ॉल्ट रूप से, एक geo_point क्षेत्र दो क्षेत्रों (location.lat और location.lon) के रूप में सूचीबद्ध नहीं है, यह एक भी क्षेत्र है कि दोनों अक्षांश और देशांतर में शामिल है के रूप में सूचीबद्ध है।

आप lat_lonmapping option चालू करके अक्षांश और देशांतर की अनुक्रमणिका को चालू कर सकते हैं। हालांकि, आपके उदाहरण में, अक्षांश और देशांतर के लिए मूल्य बहुत बड़े हैं। इसलिए, वे सामान्यीकृत होते हैं, 456 और -78 9 के बजाय -84.0 और -69.0 के रूप में डबल और अनुक्रमित होते हैं। इसलिए, यदि आप lat_lon सक्षम करेंगे और प्रश्नों में मान को प्रतिस्थापित करेंगे, तो आपको परिणाम प्राप्त करने में सक्षम होना चाहिए।

कृपया ध्यान दें कि अक्षांश और देशांतर के लिए मान इंडेक्सिंग से पहले दो बार परिवर्तित हो जाते हैं। तो दीर्घकालिक अवधि में शब्द प्रश्नों का उपयोग करना बहुत व्यावहारिक नहीं हो सकता है क्योंकि आपको हमेशा त्रुटियों को ध्यान में रखना होगा। यह range queries या elasticsearch geospatial queries का उपयोग करने के लिए और अधिक उपयोगी हो सकता है।

1

चेक बाहर bool query ElasticSearch में, आप उचित मिश्रण प्राप्त करने के लिए must, should या should_not निर्दिष्ट करने के लिए सक्षम होना चाहिए आपकी क्वेरी के लिए और/या।

+1

मुझे लगता है कि मैंने कोशिश की है, ऊपर कोड स्निपेट। – ahmedyha

0

आप QueryBuilders.termQuery के बजाय QueryBuilders.multiMatchQuery उपयोग कर सकते हैं