2016-04-27 67 views
1

排序我有2種型號:ProductsSkus,其中Product有一個或多個SkusSku屬於一個Product。它們有以下欄目:Elasticsearch搜索和跨2款

Product: id, title, content, category_id 
Sku:  id, product_id, price 

我希望能夠在不同的搜索每頁顯示48個產品和排序配置,但我有麻煩翻譯這elasticsearch。

例如,我不清楚如何在搜索title時搜索相關結果,並將最低價格Sku分類爲Product。我已經嘗試了一些不同的東西,最近一直以指數作爲一切屬於該Sku,然後搜索像這樣:

size: '48', 
aggs: { 
    group_by_product: { 
    terms: { field: 'product_id' } 
    } 
}, 
filter: { 
    and: [{ 
    bool: { 
     must: { range: { price: { gte: 0, lte: 50 } } } 
    },{ 
    bool: { 
     must: { terms: { category_id: [ 1, 2, 3, 4, 5, 6 ] } } 
    } 
    }] 
}, 
query: { 
    fuzzy_like_this: { 
    fields: [ 'title', 'content' ], 
    like_text: 'Chair', 
    fuzziness: 1 
    } 
} 

但是這給48匹配Skus,其中許多屬於同一Product,所以如果我在搜索後嘗試將它們合併,我的分頁就會關閉。

什麼是處理此用例的最佳方法?

更新

與嵌套的方法嘗試使用以下結構:

{ 
    size: '48', 
    query: 
    { bool: 
     { should: 
     { fuzzy_like_this: 
      { fields: [ 'title' ], 
      like_text: 'chair', 
      fuzziness: 1 }, 
     }, 
     { must: 
     { nested: 
      { path: 'skus', 
      query: 
       { bool: 
       { must: { range: { price: { gte: 0, lte: 100 } } } 
       } 
      } 
     } 
     } 
    } 
    } 
}, 
sort: 
    { _score: 'asc', 
    'skus.price': 
     { nested_path: 'skus', 
     nested_filter: 
      { range: { 'skus.price': { gte: 0, lte: 100 } } }, 
     order: 'asc', 
     mode: 'min' 
     } 
    } 
} 

這可能是更接近,但仍不能確定如何對其進行格式化。以上提供了按價格排序的產品,但似乎完全忽視了搜索領域。

+0

包括SKU內的產品的方法是正確的。我相信它可以改進的地方是聚合部分。你實際需要的是桶的數量是48,而不是文檔的數量。因爲桶代表產品。關於分頁,彙總[這不是atm可能的](https://github.com/elastic/elasticsearch/issues/4915)。 –

+0

你嘗試過嵌套的對象,其中Skus是嵌套的對象嗎? –

+0

@AndreiStefan是的,我已經試過在產品下嵌套skus,但無法找出正確的價格排序方式。如果桶分頁是不可能的,那麼似乎會排除聚合方法? – tyler

回答

1

由於paginating aggregation results is not possible,即使包括productsku的方法是一個很好的,我會nested對象取決於用於查詢的要求去。

作爲示例查詢:

GET /product/test/_search 
{ 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "match": { 
      "title": { 
       "query": "whatever", 
       "fuzziness": 1, 
       "prefix_length": 3 
      } 
      } 
     }, 
     { 
      "nested": { 
      "path": "skus", 
      "query": { 
       "range": { 
       "skus.price": { 
        "gte": 11, 
        "lte": 50 
       } 
       } 
      } 
      } 
     } 
     ] 
    } 
    }, 
    "sort": [ 
    { 
     "skus.price": { 
     "nested_path": "skus", 
     "order": "asc", 
     "mode": "min" 
     } 
    } 
    ] 
} 
+0

謝謝,我現在正在嘗試此操作,並會讓您知道它是怎麼回事 – tyler

+0

仍然不是完全能夠得到它的工作。我在標題上使用模糊搜索,所以請查看我的問題的更新代碼,看看你是否能夠發現如何修復查詢。 – tyler

+0

在您更新的查詢中,您需要擁有「skus.price」,因爲它是一個嵌套過濾器。 –