我有一个有这种模式的人员列表:
{
"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.type
或comptes.*.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"}
]
}
答案 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会自动提升匹配项,但这可以派上用场。