在数组 object 中搜索
Search within array object
我有如下jsonobject--
{
"Title": "Terminator,
"Purchases": [
{"Country": "US", "Site": "iTunes"},
{"Country": "FR", "Site": "Google"}
]
}
鉴于上述 object,搜索结果显示收益的方式如下:
"Titles on iTunes in US" ==> YES, show "Terminator"
"Titles on Google in FR" ==> YES, show "Terminator"
"Titles on iTunes in FR" ==> NO
但是,如果我只是 AND
查询,以获取带有 Purchase.Country="FR"
的标题和带有 Purchase.Site="iTunes"
的标题,它会错误地显示上述结果,因为这两个条件都满足。但是,我想将该方面限制为 在购买项目 内。 python 代码中的等价物是:
for purchase in item['Purchases']:
if purchase['Country'] == "FR" and purchase['Site'] == "iTunes":
return True
目前是这样工作的:
for purchase in item['Purchases']:
if purchase['Country'] == "FR":
has_fr = True
if purchase['Site'] == "iTunes":
has_itunes = True
if has_itunes and has_fr: return True
这在 ElasticSearch 中如何完成?
首先,您需要将 "Purchases" 字段作为嵌套字段进行索引,方法是像这样定义对象类型的映射:
{
"properties" : {
"Purchases" : {
"type" : "nested",
"properties": {
"Country" : {"type": "string" },
"Site" : {"type": "string" }
}
}
}
}
只有这样,ElasticSearch 才会保持各个国家和各个站点之间的关联,如 here 所述。
接下来,您应该使用嵌套查询,例如:
{ "query":
{ "nested" : {
"path" : "Purchases",
"score_mode" : "avg",
"query" : {
"bool" : {
"must" : [
{
"match" : {"Purchases.Country" : "US"}
},
{
"match" : {"Purchases.Site" : "iTunes"}
}
]
}
}
}
}
}
如果查询结合了 "US" 和 "iTunes",这将 return 您的对象,但如果它结合了 "US" 和 "Google",则不会。详情描述 here。
我有如下jsonobject--
{
"Title": "Terminator,
"Purchases": [
{"Country": "US", "Site": "iTunes"},
{"Country": "FR", "Site": "Google"}
]
}
鉴于上述 object,搜索结果显示收益的方式如下:
"Titles on iTunes in US" ==> YES, show "Terminator"
"Titles on Google in FR" ==> YES, show "Terminator"
"Titles on iTunes in FR" ==> NO
但是,如果我只是 AND
查询,以获取带有 Purchase.Country="FR"
的标题和带有 Purchase.Site="iTunes"
的标题,它会错误地显示上述结果,因为这两个条件都满足。但是,我想将该方面限制为 在购买项目 内。 python 代码中的等价物是:
for purchase in item['Purchases']:
if purchase['Country'] == "FR" and purchase['Site'] == "iTunes":
return True
目前是这样工作的:
for purchase in item['Purchases']:
if purchase['Country'] == "FR":
has_fr = True
if purchase['Site'] == "iTunes":
has_itunes = True
if has_itunes and has_fr: return True
这在 ElasticSearch 中如何完成?
首先,您需要将 "Purchases" 字段作为嵌套字段进行索引,方法是像这样定义对象类型的映射:
{
"properties" : {
"Purchases" : {
"type" : "nested",
"properties": {
"Country" : {"type": "string" },
"Site" : {"type": "string" }
}
}
}
}
只有这样,ElasticSearch 才会保持各个国家和各个站点之间的关联,如 here 所述。
接下来,您应该使用嵌套查询,例如:
{ "query":
{ "nested" : {
"path" : "Purchases",
"score_mode" : "avg",
"query" : {
"bool" : {
"must" : [
{
"match" : {"Purchases.Country" : "US"}
},
{
"match" : {"Purchases.Site" : "iTunes"}
}
]
}
}
}
}
}
如果查询结合了 "US" 和 "iTunes",这将 return 您的对象,但如果它结合了 "US" 和 "Google",则不会。详情描述 here。