2014-09-21 140 views
3

在我eleasticsearch指數,我有兩個文件索引,如下過濾器一起:期限和範圍內,在elasticsearch查詢

POST dyn-props/item 
{ 
    "name": "bar foo", 
    "properties": [ 
     { 
      "type": "foo", 
      "value": 1.45 
     }, 

     { 
      "type": "bar", 
      "value": 256.34 
     }, 

     { 
      "type": "foobar", 
      "value": 43.43 
     } 
    ] 
} 

POST dyn-props/item 
{ 
    "name": "foo bar", 
    "properties": [ 
     { 
      "type": "foo", 
      "value": 33.34 
     }, 

     { 
      "type": "bar", 
      "value": 22.23 
     } 
    ] 
} 

在此項目類型,我想查詢具有物業項目其價值大於。我可以篩選結果下來有一個類型爲FOO與下面的查詢屬性的項目:

POST dyn-props/item/_search 
{ 
    "query": { 
     "filtered": { 
     "query": { 
      "match_all": {} 
     }, 
     "filter": { 
      "term": { 
       "properties.type": "foo" 
      } 
     } 
     } 
    } 
} 

,但我不知道我怎麼能應用範圍過濾器。任何想法?

編輯:

發出下面的查詢給了我預期的錯誤的結果:

POST dyn-props/item/_search 
{ 
    "query": { 
     "filtered": { 
     "query": { 
      "match_all": {} 
     }, 
     "filter": { 
      "bool": { 
      "must": [ 
       { 
        "term": { 
        "properties.type": "foo" 
        } 
       }, 

       { 
        "range": { 
         "properties.value": { 
         "gte" : 10 
         } 
        } 
       } 
      ] 
      } 
     } 
     } 
    } 
} 

結果:

{ 
    "took": 2, 
    "timed_out": false, 
    "_shards": { 
     "total": 5, 
     "successful": 5, 
     "failed": 0 
    }, 
    "hits": { 
     "total": 2, 
     "max_score": 1, 
     "hits": [ 
     { 
      "_index": "dyn-props", 
      "_type": "item", 
      "_id": "PetPVxwARLOcZqlv28xjpw", 
      "_score": 1, 
      "_source": { 
       "name": "bar foo", 
       "properties": [ 
        { 
        "type": "foo", 
        "value": 1.45 
        }, 
        { 
        "type": "bar", 
        "value": 256.34 
        }, 
        { 
        "type": "foobar", 
        "value": 43.43 
        } 
       ] 
      } 
     }, 
     { 
      "_index": "dyn-props", 
      "_type": "item", 
      "_id": "KqOTXcC9RG6FzPsDDDs8Hw", 
      "_score": 1, 
      "_source": { 
       "name": "foo bar", 
       "properties": [ 
        { 
        "type": "foo", 
        "value": 33.34 
        }, 
        { 
        "type": "bar", 
        "value": 22.23 
        } 
       ] 
      } 
     } 
     ] 
    } 
} 
+0

試試這個http://www.elasticsearch.org/guide/en/elasticsearch/reference/0.90/query-dsl-numeric-range-filter。 html – 2014-09-21 13:14:06

+1

@Undefined_variable不確定你的意思。我知道我需要使用範圍過濾器。問題在於如何。 – tugberk 2014-09-21 13:17:25

+1

使用和過濾器的細節可以在http://www.elasticsearch.org/guide/en/elasticsearch/reference/0.90/query-dsl-and-filter.html – 2014-09-21 13:25:39

回答

5

找到了答案。這篇文章幫助了很多:ElasticSearch – nested mappings and filters

改變類型的映射:

PUT dyn-props 
{ 
    "mappings": { 
     "item": { 
       "properties": { 
        "name": { 
          "type": "string" 
        }, 
        "properties": { 
          "type": "nested" 
        } 
       } 
     } 
    } 
} 

通過使性能nested type,我能夠保持typevalue領域之間的關聯。

最後,我能發出這種嵌套查詢:

POST dyn-props/item/_search 
{ 
    "query": { 
     "filtered": { 
     "query": { 
      "match_all": {} 
     }, 
     "filter": { 
      "nested": { 
       "path": "properties", 
       "filter": { 
        "bool": { 
        "must": [ 
         { 
          "term": { 
           "type": "foo" 
          } 
         }, 
         { 
          "range": { 
           "value": { 
           "gte": 10 
           } 
          } 
         } 
        ] 
        } 
       } 
      } 
     } 
     } 
    } 
} 

這讓我正確的結果:

{ 
    "took": 2, 
    "timed_out": false, 
    "_shards": { 
     "total": 5, 
     "successful": 5, 
     "failed": 0 
    }, 
    "hits": { 
     "total": 1, 
     "max_score": 1, 
     "hits": [ 
     { 
      "_index": "dyn-props", 
      "_type": "item", 
      "_id": "CzTL4sseR2GVYtvf-0slVQ", 
      "_score": 1, 
      "_source": { 
       "name": "foo bar", 
       "properties": [ 
        { 
        "type": "foo", 
        "value": 33.34 
        }, 
        { 
        "type": "bar", 
        "value": 22.23 
        } 
       ] 
      } 
     } 
     ] 
    } 
} 
+1

找到我真的很感謝你分享你的發現,謝謝! – blong 2016-12-02 18:21:41