弹性搜索中的匹配数组
Matching arrays in elastic search
我有如下文件:
{
"_index": "abc_local",
"_type": "users",
"_id": "1",
"_version": 5,
"found": true,
"_source": {
"firstname": "simer",
"lastname": "kaur",
"gender": "1",
"Address": "Punjab House Fed. Housing Society, Amritsar, Punjab, India",
"email": "rav@yopmail.com",
"occupation": "Php Developer",
"work": "Development",
"fav_hunting_land": 2,
"zipcode": "",
"marital_status": "1",
"phone": "1234567899",
"school": "sdfergdfh",
"species": [{
"id": 1
}, {
"id": 2
}, {
"id": 3
}, {
"id": 4
}, {
"id": 5
}, {
"id": 6
}],
"activities": [{
"id": 1
}],
"fav_weapon": 6,
"weapons": [{
"id": 1
}, {
"id": 2
}, {
"id": 3
}, {
"id": 6
}],
"properties": [{
"id": 4
}]
}
}
我需要根据武器匹配用户,我正在尝试类似的方法:
$params = [
'index' => Constants::INDEX,
'type' => Constants::DOC_TYPE_USERS,
'body' => [
"query"=> [
"bool"=> [
"must"=> [ "match"=> [ "weapons.id"=>$params['weapons'] ]],
"should"=> [
[ "match"=> [ "firstname"=> $params['search_text'] ]],
[ "match"=> [ "lastname"=> $params['search_text'] ]]
]
]
]
]
];
因为我在 PHP 中使用弹性。这里 $params['weapons'] 是:
array (size=2)
0 => string '1' (length=1)
1 => string '2' (length=1)
我收到一个错误:
illegal_state_exception: Can't get text on a START_ARRAY at 1:36
任何 suggestions/help 将不胜感激我如何匹配数组。我参考了 nested datatypes
更新#1:
我发送给我的函数的参数:{"from":0,"size":null,"city":null,"state":"0","weapons":["1","2"],"activities":[],"species":[],"properties":[],"search_text":"lastname"}
更新#2:
json 格式的查询正文:
{
"index": "abc_local",
"type": "users",
"body": {
"query": {
"bool": {
"must": {
"match": {
"weapons.id": ["1", "2"]
}
},
"should": [{
"match": {
"firstname": "simer"
}
}, {
"match": {
"lastname": "simer"
}
}]
}
}
}
}
您可以简单地用 terms
替换第一个 match
查询,因为 match
不适用于值数组。
$params = [
'index' => Constants::INDEX,
'type' => Constants::DOC_TYPE_USERS,
'body' => [
"query"=> [
"bool"=> [
"must"=> [ "terms"=> [ "weapons.id"=>$params['weapons'] ]],
^
|
change this
"should"=> [
[ "match"=> [ "firstname"=> $params['search_text'] ]],
[ "match"=> [ "lastname"=> $params['search_text'] ]]
]
]
]
]
];
如果您想检查数组中的任何值是否与索引中的字段匹配,那么您必须 "terms" 而不是匹配。
{
"index": "abc_local",
"type": "users",
"body": {
"query": {
"bool": {
"must": {
"terms": {
"weapons.id": ["1", "2"]
}
},
"should": [{
"match": {
"firstname": "simer"
}
}, {
"match": {
"lastname": "simer"
}
}]
}
}
}
}
参考 ElasticSearch 文档中的 "Terms Level Query"。
我有如下文件:
{
"_index": "abc_local",
"_type": "users",
"_id": "1",
"_version": 5,
"found": true,
"_source": {
"firstname": "simer",
"lastname": "kaur",
"gender": "1",
"Address": "Punjab House Fed. Housing Society, Amritsar, Punjab, India",
"email": "rav@yopmail.com",
"occupation": "Php Developer",
"work": "Development",
"fav_hunting_land": 2,
"zipcode": "",
"marital_status": "1",
"phone": "1234567899",
"school": "sdfergdfh",
"species": [{
"id": 1
}, {
"id": 2
}, {
"id": 3
}, {
"id": 4
}, {
"id": 5
}, {
"id": 6
}],
"activities": [{
"id": 1
}],
"fav_weapon": 6,
"weapons": [{
"id": 1
}, {
"id": 2
}, {
"id": 3
}, {
"id": 6
}],
"properties": [{
"id": 4
}]
}
}
我需要根据武器匹配用户,我正在尝试类似的方法:
$params = [
'index' => Constants::INDEX,
'type' => Constants::DOC_TYPE_USERS,
'body' => [
"query"=> [
"bool"=> [
"must"=> [ "match"=> [ "weapons.id"=>$params['weapons'] ]],
"should"=> [
[ "match"=> [ "firstname"=> $params['search_text'] ]],
[ "match"=> [ "lastname"=> $params['search_text'] ]]
]
]
]
]
];
因为我在 PHP 中使用弹性。这里 $params['weapons'] 是:
array (size=2)
0 => string '1' (length=1)
1 => string '2' (length=1)
我收到一个错误:
illegal_state_exception: Can't get text on a START_ARRAY at 1:36
任何 suggestions/help 将不胜感激我如何匹配数组。我参考了 nested datatypes
更新#1:
我发送给我的函数的参数:{"from":0,"size":null,"city":null,"state":"0","weapons":["1","2"],"activities":[],"species":[],"properties":[],"search_text":"lastname"}
更新#2: json 格式的查询正文:
{
"index": "abc_local",
"type": "users",
"body": {
"query": {
"bool": {
"must": {
"match": {
"weapons.id": ["1", "2"]
}
},
"should": [{
"match": {
"firstname": "simer"
}
}, {
"match": {
"lastname": "simer"
}
}]
}
}
}
}
您可以简单地用 terms
替换第一个 match
查询,因为 match
不适用于值数组。
$params = [
'index' => Constants::INDEX,
'type' => Constants::DOC_TYPE_USERS,
'body' => [
"query"=> [
"bool"=> [
"must"=> [ "terms"=> [ "weapons.id"=>$params['weapons'] ]],
^
|
change this
"should"=> [
[ "match"=> [ "firstname"=> $params['search_text'] ]],
[ "match"=> [ "lastname"=> $params['search_text'] ]]
]
]
]
]
];
如果您想检查数组中的任何值是否与索引中的字段匹配,那么您必须 "terms" 而不是匹配。
{
"index": "abc_local",
"type": "users",
"body": {
"query": {
"bool": {
"must": {
"terms": {
"weapons.id": ["1", "2"]
}
},
"should": [{
"match": {
"firstname": "simer"
}
}, {
"match": {
"lastname": "simer"
}
}]
}
}
}
}
参考 ElasticSearch 文档中的 "Terms Level Query"。