2017-02-01 1 views
0

ich eine Abbildung, die für Elasticsearch 2.2 wie folgt aussieht:ElasticSerach Suche nach gleicher ID in mehreren verschachtelten Objekten

PUT /index/test_type/_mapping 
{ 
    "test_type":{ 
     "properties":{ 
      "nested_one":{ 
       "type":"nested", 
       "properties":{ 
        "some_id":{ 
         "type":"string" 
        } 
       } 
      }, 
      "nested_two":{ 
       "type":"nested", 
       "properties":{ 
        "some_id":{ 
         "type":"string" 
        } 
       } 
      } 
     } 
    } 

Ich habe eine Suche nach some_id erstellen, die als Eigenschaft sowohl nested_one und nested_two erscheinen würden innerhalb des Objekts test_type (und ja, ich muss diesen test_type-Wrapper behalten).

Also wäre die Abfrage etwas wie wenn test_type.nested_one.some_id = 1 ODER test_type.nested_two.some_id = 1 return elasticId (beachten Sie, dass some_id hier gleich ist).

Ich fand Dokumentation für die Suche nach verschachtelten Datentypen und mit 'oder', aber nichts, das über 'oder' nach der gleichen Eigenschaft in mehreren verschachtelten Objekten innerhalb eines Objekts suchen kann. Meine Frage ist, ist das mit diesem Mapping möglich?

Antwort

0

Es folgt die Zuordnungen

PUT index_name1 
{ 
    "settings": { 
     "analysis": { 
      "analyzer": {}, 
      "filter": {} 
     } 
    }, 
    "mappings": { 
     "test_type":{ 
     "properties":{ 
      "nested_one":{ 
       "type":"nested", 
       "properties":{ 
        "some_id":{ 
         "type":"string" 
        } 
       } 
      }, 
      "nested_two":{ 
       "type":"nested", 
       "properties":{ 
        "some_id":{ 
         "type":"string" 
        } 
       } 
      } 
     } 
    } 
    } 
} 

Es folgt das Dokument i

POST index_name1/test_type 
{ 
    "nested_one" : [{ 
    "some_id" : 78 
    }, 
    { 
    "some_id" : 80 
    },{ 
    "some_id" : 100 
    }], 
    "nested_two" : [{ 
    "some_id" : 79 
    }, 
    { 
    "some_id" : 80 
    },{ 
    "some_id" : 101 
    }] 
} 

indiziert Nach der Abfrage

POST index_name1/_search 
{ 
    "query": { 
     "bool": { 
      "should": [{ 
       "nested": { 
        "path": "nested_one", 
        "query": { 
         "term": { 
          "nested_one.some_id": { 
           "value": 101 
          } 
         } 
        } 
       } 
      }, { 
       "nested": { 
        "path": "nested_two", 
        "query": { 
         "term": { 
          "nested_two.some_id": { 
           "value": 101 
          } 
         } 
        } 
       } 
      }] 
     } 
    } 
} 

Reponse

{ 
    "took": 6, 
    "timed_out": false, 
    "_shards": { 
    "total": 5, 
    "successful": 5, 
    "failed": 0 
    }, 
    "hits": { 
    "total": 3, 
    "max_score": 0.9808292, 
    "hits": [ 
     { 
     "_index": "index_name1", 
     "_type": "test_type", 
     "_id": "AVn788XeNIJY0Ao5vbA8", 
     "_score": 0.9808292, 
     "_source": { 
      "nested_one": [ 
      { 
       "some_id": 78 
      }, 
      { 
       "some_id": 80 
      }, 
      { 
       "some_id": 100 
      } 
      ], 
      "nested_two": [ 
      { 
       "some_id": 79 
      }, 
      { 
       "some_id": 80 
      }, 
      { 
       "some_id": 101 
      } 
      ] 
     } 
     }, 
     { 
     "_index": "index_name1", 
     "_type": "test_type", 
     "_id": "AVn8BMr_NIJY0Ao5vbA_", 
     "_score": 0.9808292, 
     "_source": { 
      "title": "harley harley harley", 
      "nested_one": [ 
      { 
       "some_id": 78 
      }, 
      { 
       "some_id": 80 
      }, 
      { 
       "some_id": 100 
      } 
      ], 
      "nested_two": [ 
      { 
       "some_id": 79 
      }, 
      { 
       "some_id": 80 
      }, 
      { 
       "some_id": 101 
      } 
      ] 
     } 
     }, 
     { 
     "_index": "index_name1", 
     "_type": "test_type", 
     "_id": "AVn8BKlmNIJY0Ao5vbA-", 
     "_score": 0.9808292, 
     "_source": { 
      "title": "harley harley", 
      "nested_one": [ 
      { 
       "some_id": 78 
      }, 
      { 
       "some_id": 80 
      }, 
      { 
       "some_id": 100 
      } 
      ], 
      "nested_two": [ 
      { 
       "some_id": 79 
      }, 
      { 
       "some_id": 80 
      }, 
      { 
       "some_id": 101 
      } 
      ] 
     } 
     } 
    ] 
    } 
} 

hoffte, das hilft Dank

+0

sehr, sehr nahe denke ich, aber nested_two.some_id und nested_one.some_id ist die gleiche ID von 80. Also soll ich einen Schlag bekommen, wenn some_id: 80 in ENTWEDER nested_one oder nested_two ist! – arturobelano

+0

ja es wird genau so funktionieren. Sie können die Abfrage mit 101 anstelle von 80 – user3775217

+0

ausführen @arturobelano den Beitrag mit geänderter Abfrage und Antwort ebenfalls bearbeitet. danke – user3775217

Verwandte Themen