Сгруппируйте несколько документов с одинаковым идентификатором в поле, используя ElasticSearch - PullRequest
0 голосов
/ 30 мая 2018

У нас есть набор данных, как показано ниже в ElasticSearch.Список продуктов, индексируемых из бэкэнда электронной коммерции.

“hts” : [
{
   "_index": "test",
    "_type": "commerce_products_index",
    "_id": "466174",
    "_score": 1,
"_source": {
      "id": 261776,
      "changed": "1516367458",
      "commerce_price:amount": "2700",
      "field_product_node:nid": [
        "66741"
      ],
      "field_uom_type": "g",
      "field_weight": "337",
      "product_id": "261776",
      "title": "Brown Lobia",
    }
  },
{
   "_index": "test",
    "_type": "commerce_products_index",
    "_id": "466175",
    "_score": 1,
   "_source": {
      "id": 261781,
      "changed": "1526448108",
      "commerce_price:amount": "5900",
      "field_product_node:nid": [
        "66741"
      ],
      "field_uom_type": "g",
      "field_weight": "339",
      "product_id": "261781",
      "title": "Brown Lobia",
    }
 },
 {
   "_index": "test",
    "_type": "commerce_products_index",
    "_id": "466176",
    "_score": 1,
   "_source": {
      "id": 466176,
      "changed": "1515568794",
      "commerce_price:amount": "5400",
      "commerce_store": "651",
      "field_product_node:nid": [
        "84651"
      ],
      "field_uom_type": "g",
      "field_weight": "337",
      "product_id": "466176",
      "title": "Maggi Rich Tomato Ketchup",
    }
  }
]

Как видите, первые 2 документа имеют field_product_node:nid.(т.е. 66741).Это два разных размера (варианта) одного и того же продукта.

В поиске мы хотим показать этот же продукт как один.Для этого нам нужен результат с полем field_product_node:nid, которое будет уникальным для каждого одинакового товара.Например, 1 кг белого риса и 500 г белого риса будут иметь одинаковое значение в field_product_node:nid.Поэтому при поиске обе детали продукта должны быть сгруппированы по одному nid.

В настоящее время мы получаем разные документы для каждого продукта.Однако мы хотим получить оба продукта как один документ.

Мы попробовали выполнить следующие запросы:

GET /commerce_products_index/_search
{
  "size": 20, 
  "query" : {
    "bool": {
      "must": [
        { "match": { "commerce_store": "651"}}
      ]
     }
   },
  "aggs": {
    "group_by_node": {
      "terms": {
        "field": "field_product_node:nid"
      }
    }
  }
}

GET /commerce_products_index/_search
 {
   "aggregations": {
     "grp_report": {
       "terms": {
         "field": "field_product_node:nid"
       },
      "aggregations": {
        "nested_node": {
          "nested": {
            "path": "node"
          },
        "aggregations": {
          "filters_customer": {
            "filters": {
              "filters": [
               {
                  "match": {
                    "node.commerce_store": "651"
                  }
                }
              ]
            }
          }
        }
      }
    }
  }
 },
  "query" : {
     "bool": {
       "must": [
         { "match": { "commerce_store": "651"}}
       ]
     }
   },
  "from": 0,
  "size": 100
}

Мы не можем найти правильный метод.Если это невозможно, мы должны перестроить часть индексации и попробовать проиндексировать несколько продуктов с одинаковым nid в одном документе.Это будет значительное переписать.

1 Ответ

0 голосов
/ 01 июня 2018

Я пробовал следующий запрос.Это сработало для нашей проблемы.

GET /commerce_products_index/_search
{       
   "size": 20,        
   "aggs": {
     "by_node": {
       "terms": {
         "field": "field_product_node:nid",
         "size": 11,
         "order": {
          "max_score": "desc"
         }
       },
       "aggs": {
         "by_top_hit": {
         "top_hits": {
         "size": 15
        }
      },
      "max_score": {
        "max": {
          "field": "field_product_node:nid",
          "script": "_score"
         }
       }
      }
    }
  }
 }

Это может помочь кому-то, кто сталкивается с той же проблемой.

...