【问题标题】:Search within array object在数组对象内搜索
【发布时间】:2015-10-06 19:25:21
【问题描述】:

我有以下 json 对象 --

{
  "Title": "Terminator,
  "Purchases": [
     {"Country": "US", "Site": "iTunes"},
     {"Country": "FR", "Site": "Google"}
  ]
}

鉴于上述对象,以下是搜索结果显示产量的方式:

"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 中完成?

【问题讨论】:

  • 您是否也在询问如何在 Solr 中执行此操作? (看到您将其标记为 Solr)
  • 你可以使用嵌套过滤器..而不是AND,你会得到相应的结果
  • @RohitKumar 能否请您在答案中说明如何做到这一点?

标签: json elasticsearch lucene


【解决方案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 中描述。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-26
    • 2021-01-20
    • 1970-01-01
    • 2018-07-05
    相关资源
    最近更新 更多