使用数组中的匹配属性检索对象 - Elasticsearch

时间:2018-03-12 09:53:02

标签: elasticsearch

我执行查询的JSON如下所示。 如果我只想要使用价格为82.00的对象检索变量(对象数组),那么查询应该是什么。

[
   {
      "id":"Z2lkOi8vc2hvcGlmeS9Qcm9kdWN0LzIyODA5MjA1MTQ4NQ==",
      "createdAt":"2017-10-23T11:05:40Z",
      "updatedAt":"2018-03-10T05:24:40Z",
      "descriptionHtml":"Et blanditiis autem. Molestiae delectus vero voluptatem libero cum. Aliquam tempore ex id sed aut excepturi facilis sunt.",
      "description":"Et blanditiis autem. Molestiae delectus vero voluptatem libero cum. Aliquam tempore ex id sed aut excepturi facilis sunt.",
      "handle":"future-proofed-re-engineered-handmade-cotton-chicken",
      "productType":"Computers",
      "title":"Future-proofed Re-engineered Handmade Cotton Chicken",
      "vendor":"Bednar LLC",
      "tags":[
         {
            "value":"data-generator"
         }
      ],
      "publishedAt":"2018-03-07T08:25:38Z",
      "onlineStoreUrl":null,
      "options":[
         {
            "id":"Z2lkOi8vc2hvcGlmeS9Qcm9kdWN0T3B0aW9uLzM2NTQ0NDI2ODA2MQ==",
            "name":"Title",
            "values":[
               {
                  "value":"Concrete blue - 71y-9a6"
               },
               {
                  "value":"Concrete teal - oxh-g1z"
               }
            ]
         }
      ],
      "images":[

      ],
      "variants":[
         {
            "id":"Z2lkOi8vc2hvcGlmeS9Qcm9kdWN0VmFyaWFudC8zMzczOTAzODcyMDI5",
            "title":"Concrete blue - 71y-9a6",
            "price":"82.00",
            "weight":14,
            "available":true,
            "sku":"",
            "compareAtPrice":null,
            "image":null,
            "selectedOptions":[
               {
                  "name":"Title",
                  "value":"Concrete blue - 71y-9a6"
               }
            ],
            "product":{
               "id":"Z2lkOi8vc2hvcGlmeS9Qcm9kdWN0LzIyODA5MjA1MTQ4NQ==",
               "images":[

               ]
            }
         },
         {
            "id":"Z2lkOi8vc2hvcGlmeS9Qcm9kdWN0VmFyaWFudC8zMzczOTA0MDAzMTAx",
            "title":"Concrete teal - oxh-g1z",
            "price":"196.00",
            "weight":7,
            "available":true,
            "sku":"",
            "compareAtPrice":null,
            "image":null,
            "selectedOptions":[
               {
                  "name":"Title",
                  "value":"Concrete teal - oxh-g1z"
               }
            ],
            "product":{
               "id":"Z2lkOi8vc2hvcGlmeS9Qcm9kdWN0LzIyODA5MjA1MTQ4NQ==",
               "images":[

               ]
            }
         }
      ]
   }
]

我目前正在使用以下方式来索引数据。

var bulkIndex = function bulkIndex(index, type, data) {
    let bulkBody = [];

    data.forEach(item => {
        bulkBody.push({
            index: {
                _index: index,
                _type: type,
                _id: item.id
            }

        });

        bulkBody.push(item);
    });

    esClient.bulk({body: bulkBody})
        .then(response => {
            let errorCount = 0;
            response.items.forEach(item => {
                if (item.index && item.index.error) {
                    console.log(++errorCount, item.index.error);
                }
            });
            console.log(`Successfully indexed ${data.length - errorCount} out of ${data.length} items`);
        })
        .catch(console.err);
};

创建的映射如下。

{
  "shopify": {
    "mappings": {
      "products": {
        "properties": {
          "createdAt": {
            "type": "date"
          },
          "description": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "descriptionHtml": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "handle": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "id": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "images": {
            "properties": {
              "id": {
                "type": "text",
                "fields": {
                  "keyword": {
                    "type": "keyword",
                    "ignore_above": 256
                  }
                }
              },
              "src": {
                "type": "text",
                "fields": {
                  "keyword": {
                    "type": "keyword",
                    "ignore_above": 256
                  }
                }
              }
            }
          },
          "options": {
            "properties": {
              "id": {
                "type": "text",
                "fields": {
                  "keyword": {
                    "type": "keyword",
                    "ignore_above": 256
                  }
                }
              },
              "name": {
                "type": "text",
                "fields": {
                  "keyword": {
                    "type": "keyword",
                    "ignore_above": 256
                  }
                }
              },
              "values": {
                "properties": {
                  "value": {
                    "type": "text",
                    "fields": {
                      "keyword": {
                        "type": "keyword",
                        "ignore_above": 256
                      }
                    }
                  }
                }
              }
            }
          },
          "productType": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "publishedAt": {
            "type": "date"
          },
          "tags": {
            "properties": {
              "value": {
                "type": "text",
                "fields": {
                  "keyword": {
                    "type": "keyword",
                    "ignore_above": 256
                  }
                }
              }
            }
          },
          "title": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "updatedAt": {
            "type": "date"
          },
          "variants": {
            "properties": {
              "available": {
                "type": "boolean"
              },
              "id": {
                "type": "text",
                "fields": {
                  "keyword": {
                    "type": "keyword",
                    "ignore_above": 256
                  }
                }
              },
              "price": {
                "type": "text",
                "fields": {
                  "keyword": {
                    "type": "keyword",
                    "ignore_above": 256
                  }
                }
              },
              "product": {
                "properties": {
                  "id": {
                    "type": "text",
                    "fields": {
                      "keyword": {
                        "type": "keyword",
                        "ignore_above": 256
                      }
                    }
                  },
                  "images": {
                    "properties": {
                      "id": {
                        "type": "text",
                        "fields": {
                          "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                          }
                        }
                      },
                      "src": {
                        "type": "text",
                        "fields": {
                          "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                          }
                        }
                      }
                    }
                  }
                }
              },
              "selectedOptions": {
                "properties": {
                  "name": {
                    "type": "text",
                    "fields": {
                      "keyword": {
                        "type": "keyword",
                        "ignore_above": 256
                      }
                    }
                  },
                  "value": {
                    "type": "text",
                    "fields": {
                      "keyword": {
                        "type": "keyword",
                        "ignore_above": 256
                      }
                    }
                  }
                }
              },
              "sku": {
                "type": "text",
                "fields": {
                  "keyword": {
                    "type": "keyword",
                    "ignore_above": 256
                  }
                }
              },
              "title": {
                "type": "text",
                "fields": {
                  "keyword": {
                    "type": "keyword",
                    "ignore_above": 256
                  }
                }
              },
              "weight": {
                "type": "long"
              }
            }
          },
          "vendor": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          }
        }
      }
    }
  }
}

1 个答案:

答案 0 :(得分:2)

根据我的理解,您希望检索包含"82.00"的变体项目的文档,即variant - "Concrete blue - 71y-9a6"而不是"Concrete teal - oxh-g1z"

在常规情况下,如果您搜索具有变体价格"82.00"的文档,它将查找并返回与variant price匹配的所有文档以及数组中的其他variants项目价格不是"82.00"

{
    "query" : {
        "match":{
            "variants.price" :"82.00"
        }
    }
}

//Will return above document with variants items both "Concrete blue - 71y-9a6" and "Concrete teal - oxh-g1z". 

但是,如果您只想检索价格为"82.00"的变体商品,则需要能够单独查询该变体商品,解决方案是在您的数据映射中使用nested datatype

  

嵌套类型是对象数据类型的专用版本   允许独立于索引和查询对象数组   彼此。

{
  "mappings": {
    "foo": {
      "properties": {
        "createdAt": {
          "type": "date"
        },
        "description": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "descriptionHtml": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "handle": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "id": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "options": {
          "properties": {
            "id": {
              "type": "text",
              "fields": {
                "keyword": {
                  "type": "keyword",
                  "ignore_above": 256
                }
              }
            },
            "name": {
              "type": "text",
              "fields": {
                "keyword": {
                  "type": "keyword",
                  "ignore_above": 256
                }
              }
            },
            "values": {
              "properties": {
                "value": {
                  "type": "text",
                  "fields": {
                    "keyword": {
                      "type": "keyword",
                      "ignore_above": 256
                    }
                  }
                }
              }
            }
          }
        },
        "productType": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "publishedAt": {
          "type": "date"
        },
        "tags": {
          "properties": {
            "value": {
              "type": "text",
              "fields": {
                "keyword": {
                  "type": "keyword",
                  "ignore_above": 256
                }
              }
            }
          }
        },
        "title": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "updatedAt": {
          "type": "date"
        },
        "variants": {
          "type": "nested",
          "properties": {
            "available": {
              "type": "boolean"
            },
            "id": {
              "type": "text",
              "fields": {
                "keyword": {
                  "type": "keyword",
                  "ignore_above": 256
                }
              }
            },
            "price": {
              "type": "text",
              "fields": {
                "keyword": {
                  "type": "keyword",
                  "ignore_above": 256
                }
              }
            },
            "product": {
              "properties": {
                "id": {
                  "type": "text",
                  "fields": {
                    "keyword": {
                      "type": "keyword",
                      "ignore_above": 256
                    }
                  }
                }
              }
            },
            "selectedOptions": {
              "properties": {
                "name": {
                  "type": "text",
                  "fields": {
                    "keyword": {
                      "type": "keyword",
                      "ignore_above": 256
                    }
                  }
                },
                "value": {
                  "type": "text",
                  "fields": {
                    "keyword": {
                      "type": "keyword",
                      "ignore_above": 256
                    }
                  }
                }
              }
            },
            "sku": {
              "type": "text",
              "fields": {
                "keyword": {
                  "type": "keyword",
                  "ignore_above": 256
                }
              }
            },
            "title": {
              "type": "text",
              "fields": {
                "keyword": {
                  "type": "keyword",
                  "ignore_above": 256
                }
              }
            },
            "weight": {
              "type": "long"
            }
          }
        },
        "vendor": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        }
      }
    }
  }
}

查询您的文档:

{
  "query": {
    "nested": {
      "path": "variants",
      "query": {
        "match": {
          "variants.price": "82.00"
        }
      },
      "inner_hits": {}
    }
  }
}

在上述查询中,使用变体价格variants显式查询"82.00"嵌套字段。请注意,inner_hits允许我们突出显示匹配的嵌套文档,因为弹性返回完整文档以及所有变体项,inner_hits将仅包含匹配的变体项(这是我们需要的)。此外,您可以使用_source限制字段投影(例如,您可能不需要变体字段根文档,但只需要inner_hits中的变体项)。

{
  "took": 45,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 0.6931472,
    "hits": [
      {
        "_index": "foo",
        "_type": "foo",
        "_id": "1",
        "_score": 0.6931472,
        "_source": {
          "id": "Z2lkOi8vc2hvcGlmeS9Qcm9kdWN0LzIyODA5MjA1MTQ4NQ==",
          "createdAt": "2017-10-23T11:05:40Z",
          "updatedAt": "2018-03-10T05:24:40Z",
          "descriptionHtml": "Et blanditiis autem. Molestiae delectus vero voluptatem libero cum. Aliquam tempore ex id sed aut excepturi facilis sunt.",
          "description": "Et blanditiis autem. Molestiae delectus vero voluptatem libero cum. Aliquam tempore ex id sed aut excepturi facilis sunt.",
          "handle": "future-proofed-re-engineered-handmade-cotton-chicken",
          "productType": "Computers",
          "title": "Future-proofed Re-engineered Handmade Cotton Chicken",
          "vendor": "Bednar LLC",
          "tags": [
            {
              "value": "data-generator"
            }
          ],
          "publishedAt": "2018-03-07T08:25:38Z",
          "onlineStoreUrl": null,
          "options": [
            {
              "id": "Z2lkOi8vc2hvcGlmeS9Qcm9kdWN0T3B0aW9uLzM2NTQ0NDI2ODA2MQ==",
              "name": "Title",
              "values": [
                {
                  "value": "Concrete blue - 71y-9a6"
                },
                {
                  "value": "Concrete teal - oxh-g1z"
                }
              ]
            }
          ],
          "images": [],
          "variants": [
            {
              "id": "Z2lkOi8vc2hvcGlmeS9Qcm9kdWN0VmFyaWFudC8zMzczOTAzODcyMDI5",
              "title": "Concrete blue - 71y-9a6",
              "price": "82.00",
              "weight": 14,
              "available": true,
              "sku": "",
              "compareAtPrice": null,
              "image": null,
              "selectedOptions": [
                {
                  "name": "Title",
                  "value": "Concrete blue - 71y-9a6"
                }
              ],
              "product": {
                "id": "Z2lkOi8vc2hvcGlmeS9Qcm9kdWN0LzIyODA5MjA1MTQ4NQ==",
                "images": []
              }
            },
            {
              "id": "Z2lkOi8vc2hvcGlmeS9Qcm9kdWN0VmFyaWFudC8zMzczOTA0MDAzMTAx",
              "title": "Concrete teal - oxh-g1z",
              "price": "196.00",
              "weight": 7,
              "available": true,
              "sku": "",
              "compareAtPrice": null,
              "image": null,
              "selectedOptions": [
                {
                  "name": "Title",
                  "value": "Concrete teal - oxh-g1z"
                }
              ],
              "product": {
                "id": "Z2lkOi8vc2hvcGlmeS9Qcm9kdWN0LzIyODA5MjA1MTQ4NQ==",
                "images": []
              }
            }
          ]
        },
        "inner_hits": {
          "variants": {
            "hits": {
              "total": 1,
              "max_score": 0.6931472,
              "hits": [
                {
                  "_nested": {
                    "field": "variants",
                    "offset": 0
                  },
                  "_score": 0.6931472,
                  "_source": {
                    "id": "Z2lkOi8vc2hvcGlmeS9Qcm9kdWN0VmFyaWFudC8zMzczOTAzODcyMDI5",
                    "title": "Concrete blue - 71y-9a6",
                    "price": "82.00",
                    "weight": 14,
                    "available": true,
                    "sku": "",
                    "compareAtPrice": null,
                    "image": null,
                    "selectedOptions": [
                      {
                        "name": "Title",
                        "value": "Concrete blue - 71y-9a6"
                      }
                    ],
                    "product": {
                      "id": "Z2lkOi8vc2hvcGlmeS9Qcm9kdWN0LzIyODA5MjA1MTQ4NQ==",
                      "images": []
                    }
                  }
                }
              ]
            }
          }
        }
      }
    ]
  }
}