पर मल्टी लेवल नेस्टेड फ़ील्ड क्वेरी करना मैं लोचदार खोज और गैर-एसक्यूएल प्रतिमान के लिए नया हूं। मैं ईएस ट्यूटोरियल का पालन कर रहा हूं, लेकिन एक चीज है जिसे मैं काम नहीं कर सका।लोचदार खोज
निम्नलिखित कोड में (मैं 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।
मुझे पता नहीं है कि क्या गुम है और मुझे घोंसले के दो स्तरों के आधार पर प्रश्नों के साथ कोई उदाहरण नहीं मिला है।
चूंकि मैं केवल एक बूलियन स्थिति का उपयोग करता हूं, इसलिए "क्वेरी" का उपयोग करने के लिए एक और सही क्वेरी परिभाषा होगी: {"text": {"subjects.concepts.name": "concept1"}} – JCJS