Elasticsearch搜索和排序2个模型

时间:2016-04-27 20:00:09

标签: elasticsearch

我有2个模型:grepProducts,其中Skus有一个或多个Product,而Skus只属于Sku Product 1}}。它们包含以下列:

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 } } ,然后搜索如下:

Skus

但这会产生48个匹配的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' } } } ,所以如果我在搜索后尝试将它们组合起来,我的分页就会关闭。

处理此用例的最佳方法是什么?

更新

尝试使用嵌套方法,使用以下结构:

    int id = 0, age, exp;
    double avgAge = 0, avgExp;
    char type;
    string eligibility = "";

这可能更接近,但仍不确定如何格式化它。以上是按价格订购的产品,但似乎完全忽略了搜索字段。

1 个答案:

答案 0 :(得分:1)

paginating aggregation results is not possible以来,即使在sku中包含product的方法很好,我也会根据查询要求使用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"
      }
    }
  ]
}