过滤搜索复杂的结构

时间:2015-06-17 17:07:18

标签: elasticsearch

我有一个有这种模式的人员列表:

{
    "id": 125018,
    "nom": "GALLA",
    "prenom": "patrick",
    "departement": 91,
    "comptes": [
        {"id": 83557, "type": "facebook", "login": "patrick"},
        {"id": 83558, "type": "google", "login": "patrick"},
        {"id": 83558, "type": "twitter", "login": "patrick"}
    ]
}

我会搜索departement等于 91 的人,并提高拥有 google 帐户的人的得分。

我试过这样的请求:

{
"query": {
    "bool": {
        "must": [
            { "term": { "departement": "91" } }
        ],
        "should" : [
            { "match" : { "comptes.1.type" : "google" } }
        ],
        "minimum_should_match" : 1,
        "boost" : 1.0
    }
}
}

但是comptes.1.typecomptes.*.type没有做得很好。

您是否有更好的查询语法可以找到拥有 google 帐户的人?

编辑:

是的,谢谢你niko:你的搜索查询效果很好!

错误在我的输入查询中。我们需要注意PHP json_encode 函数,它没有给我正确的输入语法。所以搜索不起作用......

PHP json_encode输入语法:

{
    "id": 125018,
    "nom": "GALLA",
    "prenom": "patrick",
    "departement": 91,
    "comptes": {
        83557 : {"id": 83557, "type": "facebook", "login": "patrick"},
        83558 : {"id": 83558, "type": "google", "login": "patrick"},
        83559 : {"id": 83559, "type": "twitter", "login": "patrick"}
    }
}

良好的inpout语法:

{
    "id": 125018,
    "nom": "GALLA",
    "prenom": "patrick",
    "departement": 91,
    "comptes": [
        {"id": 83557, "type": "facebook", "login": "patrick"},
        {"id": 83558, "type": "google", "login": "patrick"},
        {"id": 83559, "type": "twitter", "login": "patrick"}
    ]
}

1 个答案:

答案 0 :(得分:1)

即使在声音较高的字段中,您也可以使用parent.child符号指定关系,例如comptes.type

要对此进行测试,您可以尝试使用Google帐户查找用户:

"query": {
    "bool": {
        "must": [
            { "term": { "departement": 91 } },
            { "term": { "comptes.type": "google" } }
        ]
    }
}

使用https://www.found.no/play/gist/90a9290e806226e2d41f

进行演示

所以你的提升查询看起来像

"query": {
    "bool": {
        "must": [
            { "term": { "departement": 91 } }
        ],
        "should" : [
            { "term" : { // you're looking for an exact term 
                "comptes.type" : {
                    "value": "google",
                    "boost": 2.0 
                }
            }}
        ]
    }
}

https://www.found.no/play/gist/ac979072963875ba79f9

boost属性不是必需的,因为Elastic会自动提升匹配项,但这可以派上用场。