json - 在数组对象中搜索

标签 json elasticsearch lucene

我有以下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"的Titles和Purchase.Site="iTunes"的Titles,则由于同时满足两个条件,因此会错误地显示上述结果。但是,我想将该方面限制为购买项目中的。 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中如何完成?

最佳答案

首先,您需要通过定义对象类型的映射,将“购买”字段索引为嵌套字段:

{
    "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

关于json - 在数组对象中搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31469630/

相关文章:

json - 如果第一次解码失败使用 Combine 和 Swift 解码另一个响应

search - 使用 elasticsearch 索引 Mysql 数据库

php - Elasticsearch中[GeoDistanceSort]的非法纬度值

lucene - 带有停用词的模糊搜索在Lucene/ElasticSearch中产生意外结果

ruby-on-rails - Solr 部分文档索引更新

json - Node.js:如何交换 JSON 对象

javascript - 未获得对 PHP 的 AJAX 调用的响应(使用 JSON 数据)

c# - HttpClient PostAsJsonAsync 与 Newtonsoft.Json 不兼容

java - 具有 bool 查询的 Elasticsearch Java Jest 客户端查询构建器范围

java - SOLR 5 中是否有任何解决方法支持数字字段的模式替换过滤器?