2017-02-01 52 views
0

我有一個映射,看起來像這樣的ElasticSearch 2.2相同的ID:ElasticSerach尋求在多個嵌套對象

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" 
        } 
       } 
      } 
     } 
    } 

我必須創造一個SOME_ID搜索會同時顯示爲nested_one和nested_two的屬性在對象test_type中(是的,我必須保持這個test_type包裝)。

因此,查詢將是類似如果test_type.nested_one.some_id = 1或test_type.nested_two.some_id = 1返回elasticId(注意some_id在這裏是相同的)。

我找到了搜索嵌套數據類型和'or'的文檔,但沒有任何可以通過'或'在對象內的多個嵌套對象中搜索同一個屬性。我的問題是,這是可能的這種映射?

回答

0

以下是映射

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" 
        } 
       } 
      } 
     } 
    } 
    } 
} 

以下是我索引

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 
    }] 
} 

以下是查詢

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 
          } 
         } 
        } 
       } 
      }] 
     } 
    } 
} 

效應初探

{ 
    "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 
      } 
      ] 
     } 
     } 
    ] 
    } 
} 
文檔

希望這有助於 感謝

+0

非常非常接近,我認爲,但nested_two.some_id和nested_one.some_id是80相同ID,因此我應該得到一擊,如果SOME_ID:80在任一nested_one或nested_two! – arturobelano

+0

是的,它確實會以這種方式工作。您可以使用101而不是80來運行查詢 – user3775217

+0

@arturobelano編輯了更改後的查詢和響應的帖子。謝謝 – user3775217