2015-03-31 36 views
0

我對elasticsearch非常陌生,文檔真的讓我困惑,所以請在這裏忍受一下。Elasticsearch:與其中的數組匹配文檔

我有一個指標叫zproducts並根據它稱爲被映射item類型看起來有點像這樣:

{ 
    "item_name" : "Product A", 
    "category_ids" : [ "id1", "id2" ] 
}, 
{ 
    "item_name" : "Product B", 
    "category_ids" : [ "id1" ] 
}, 
{ 
    "item_name" : "Product C", 
    "category_ids" : [ "id2" ] 
} 

我希望能夠查詢匹配的的至少一個項目類別。即。查詢id2將返回產品A和C.

看起來我有和this傢伙一模一樣的問題。

但是,建議的解決方案並不適合我。

這是我當前的查詢:

/zproducts/items/_search

{ 
    "query": { 
     "bool": { 
      "must": [ 
       { 
        "term": { 
         "category_ids": "id2" 
        } 
       } 
      ] 
     } 
    } 
} 

後續測試查詢:

{ 
    "query": { 
     "filtered": { 
      "filter": { 
       "term": { 
        "category_ids": "id2" 
       } 
      } 
     } 
    } 
} 

兩個查詢返回上存儲所有的項目,不只是我想的那些查詢。

還有原來的查詢,由於某種原因,曾經工作但完全停止工作。

{ 
    "query": { 
     "bool": { 
      "must": [ 
       { 
        "match": { 
         "category_ids": { 
          "query": "id2", 
          "operator": "or" 
         } 
        } 
       } 
      ] 
     } 
    } 
} 

那麼我在這裏做錯了什麼?任何人都可以擺脫一些光?

+0

如果'category_ids'的類型是'string',所有的查詢都會給你預期的結果。我只是在我的本地設置上嘗試過它們。你可以分享'GET zproducts/item/_mapping'的結果嗎? – bittusarkar 2015-03-31 16:01:40

+0

@ baskar-讓我把它放在[pastebin](http://pastebin.com/K9bv6vNp)中,因爲它很長。我很確定'category_ids'的類型是'string'。 – rgin 2015-03-31 16:19:12

回答

1

這個查詢:

{ 
    "query": { 
     "filtered": { 
      "filter": { 
       "term": { 
        "category_ids": "id2" 
       } 
      } 
     } 
    } 
} 

是正確的。確保你的請求是POST /zproducts/items/_search,而不是GET /zproducts/items/_search - 爲查詢獲取索引中的所有文檔是一個很好的提示,表明查詢正在被忽略,這是一個很好的暗示,你正在使用GET;許多客戶端不會發送帶有GET請求的請求體,該請求將被ES解釋爲空白查詢。

+0

我的椅子幾乎從臉上掉下來了。我一直在使用'GET',我沒有意識到你需要使用POST來進行查詢。但是現在我得到了一個不同的問題,使用帶POST的查詢返回一個空集。 – rgin 2015-03-31 17:58:08

+0

嘗試擴大查詢範圍,直到它開始返回結果,然後修剪它。如果您只有一種文檔類型,您也可以嘗試「POST/zproducts/_search」。 – 2015-03-31 18:00:53

+0

有趣的是,查詢無法正常工作,但原來的查詢(請參閱最後一個問題查詢)開始重新開始工作。我想我離瘋狂一英里遠。不過,感謝您的幫助,以及有關「GET」與「POST」的指針。希望這可以幫助別人。 – rgin 2015-03-31 19:03:10

相關問題