2013-01-31 57 views
7

पर मल्टी लेवल नेस्टेड फ़ील्ड क्वेरी करना मैं लोचदार खोज और गैर-एसक्यूएल प्रतिमान के लिए नया हूं। मैं ईएस ट्यूटोरियल का पालन कर रहा हूं, लेकिन एक चीज है जिसे मैं काम नहीं कर सका।लोचदार खोज

निम्नलिखित कोड में (मैं PyES का उपयोग ईएस के साथ बातचीत करने के लिए कर रहा हूं) मैं एक नेस्टेड फ़ील्ड (विषयों) के साथ एक एकल दस्तावेज़ बनाता हूं, जिसमें एक और नेस्टेड फ़ील्ड (अवधारणाएं) होती हैं।

query1 = { 
    "nested": { 
     "path": "subjects", 
     "score_mode": "avg", 
     "query": { 
      "bool": { 
       "must": [ 
        { 
         "text": {"subjects.subjectname": "subject1"} 
        }, 
        { 
         "range": {"subjects.subjectkey": {"gt": 1}} 
        } 
       ] 
      } 
     } 
    } 
} 


results = conn.search(query=query1) 
for r in results: 
    print r # as expected, it returns the entire document. 

लेकिन मैं अवधारणाओं नेस्टेड क्षेत्र के आधार पर क्वेरी करने के लिए कैसे समझ नहीं कर सकते हैं:

from pyes import * 

conn = ES('127.0.0.1:9200') # Use HTTP 

# Delete and Create a new index. 
conn.indices.delete_index("documents-index") 
conn.create_index("documents-index") 

# Create a single document. 
document = { 
    "docid": 123456789, 
    "title": "This is the doc title.", 
    "description": "This is the doc description.", 
    "datepublished": 2005, 
    "author": ["Joe", "John", "Charles"], 
    "subjects": [{ 
        "subjectname": 'subject1', 
        "subjectid": [210, 311, 1012, 784, 568], 
        "subjectkey": 2, 
        "concepts": [ 
            {"name": "concept1", "score": 75}, 
            {"name": "concept2", "score": 55} 
            ] 
       }, 
       { 
        "subjectname": 'subject2', 
        "subjectid": [111, 300, 141, 457, 748], 
        "subjectkey": 0, 
        "concepts": [ 
            {"name": "concept3", "score": 88}, 
            {"name": "concept4", "score": 55}, 
            {"name": "concept5", "score": 66} 
            ] 
       }], 
    } 


# Define the nested elements. 
mapping1 = { 
      'subjects': { 
       'type': 'nested' 
      } 
     } 
mapping2 = { 
      'concepts': { 
       'type': 'nested' 
      } 
     } 
conn.put_mapping("document", {'properties': mapping1}, ["documents-index"]) 
conn.put_mapping("subjects", {'properties': mapping2}, ["documents-index"]) 


# Insert document in 'documents-index' index. 
conn.index(document, "documents-index", "document", 1) 

# Refresh connection to make queries. 
conn.refresh() 

मैं विषयों नेस्टेड क्षेत्र क्वेरी करने के लिए सक्षम हूँ।

ES documentation संदर्भित करता है कि

मल्टी स्तर नेस्टिंग स्वचालित रूप से समर्थित है, और पता चला, एक आंतरिक नेस्टेड क्वेरी में जिसके परिणामस्वरूप स्वचालित रूप से (और नहीं रूट) प्रासंगिक नेस्टिंग स्तर मिलान करने के लिए अगर यह एक और नेस्टेड के भीतर मौजूद है क्वेरी।

query2 = { 
     "nested": { 
      "path": "concepts", 
      "score_mode": "avg", 
      "query": { 
       "bool": { 
        "must": [ 
         { 
          "text": {"concepts.name": "concept1"} 
         }, 
         { 
          "range": {"concepts.score": {"gt": 0}} 
         } 
        ] 
       } 
      } 
     } 
} 

जो लौट आए 0 परिणाम:

तो, मैं निम्न स्वरूप के साथ एक क्वेरी बनाने के लिए tryed।

मुझे पता नहीं है कि क्या गुम है और मुझे घोंसले के दो स्तरों के आधार पर प्रश्नों के साथ कोई उदाहरण नहीं मिला है।

उत्तर

12

ठीक है, संयोजन की एक स्वर कोशिश कर के बाद, मैं अंत में यह निम्न क्वेरी का उपयोग कर मिल गया:

query3 = { 
    "nested": { 
     "path": "subjects", 
     "score_mode": "avg", 
     "query": { 
      "bool": { 
       "must": [ 
        { 
         "text": {"subjects.concepts.name": "concept1"} 
        } 
       ] 
      } 
     } 
    } 
} 

तो, नेस्टेड पथ विशेषता (विषयों) हमेशा एक ही है, नेस्टेड विशेषता स्तर से कोई फर्क नहीं पड़ता, और क्वेरी परिभाषा में मैंने विशेषता का पूरा पथ (subject.concepts.name) का उपयोग किया।

+0

चूंकि मैं केवल एक बूलियन स्थिति का उपयोग करता हूं, इसलिए "क्वेरी" का उपयोग करने के लिए एक और सही क्वेरी परिभाषा होगी: {"text": {"subjects.concepts.name": "concept1"}} – JCJS

1

अंधेरे में गोली मार दी क्योंकि मैंने व्यक्तिगत रूप से यह कोशिश नहीं की है, लेकिन क्या आपने अवधारणाओं के पूर्ण योग्य मार्ग की कोशिश की है?

query2 = { 
     "nested": { 
      "path": "subjects.concepts", 
      "score_mode": "avg", 
      "query": { 
       "bool": { 
        "must": [ 
         { 
          "text": {"subjects.concepts.name": "concept1"} 
         }, 
         { 
          "range": {"subjects.concepts.score": {"gt": 0}} 
         } 
        ] 
       } 
      } 
     } 
    } 
+0

मैंने पृष्ठ को रीफ्रेश किए बिना अपना उत्तर पोस्ट किया और मुझे आपका जवाब नहीं मिला। यह लगभग था, पथ मान केवल "विषयों" होना चाहिए। – JCJS

0

मेरे पास जेसीजेएस के उत्तर के लिए कुछ सवाल है। क्यों आपकी मानचित्रण को यह पसंद नहीं करना चाहिए?

mapping = { 
    "subjects": { 
     "type": "nested", 
     "properties": { 
      "concepts": { 
       "type": "nested" 
      } 
     } 
    } 
} 

मैं दो टाइप-मैपिंग को परिभाषित करने का प्रयास करता हूं जो शायद काम नहीं करता है, लेकिन एक फ़्लैट डेटा हो; मुझे लगता है कि हम नेस्टेड संपत्ति में पिछले नेस्ट चाहिए ..

... अगर हम इस मानचित्रण नेस्ट क्वेरी यह पसंद चाहिए का उपयोग करें ...

{ 
    "query": { 
     "nested": { 
      "path": "subjects.concepts", 
      "query": { 
       "term": { 
        "name": { 
         "value": "concept1" 
        } 
       } 
      } 
     } 
    } 
} 

यह पथ विशेषता के लिए full path प्रयोग करने के लिए महत्वपूर्ण है ... लेकिन टर्म कुंजी के लिए पूर्ण-पथ या सापेक्ष-पथ नहीं हो सकता है।