我有一个以下的json对象 -
{
"Title": "Terminator,
"Purchases": [
{"Country": "US", "Site": "iTunes"},
{"Country": "FR", "Site": "Google"}
]
}
鉴于上述目标,以下是搜索结果显示yield的方法:
"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中完成?
答案 0 :(得分:1)
首先,您需要将“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”,这将返回您的对象,但如果它组合“US”和“Google”则不会。详细信息描述为here。