我想检查一个包含一些值的数组long类型的字段。 我发现的唯一方法是使用脚本:ElasticSearch Scripting: check if array contains a value
但它仍然无法解决我的问题: 查询:
{
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"script": {
"script": "doc['Commodity'].values.contains(param1)",
"params": {
"param1": 50
}
}
}
}
}
}
但我得到0次点击。虽然我有记录:
{
"_index" : "aaa",
"_type" : "logs",
"_id" : "2zzlXEOgRtujWiCGtX6s9Q",
"_score" : 1,
"_source" : {
"Commodity" : [
50
],
"Type" : 1,
"SourceId" : "fsd",
"Id" : 123
}
}
答案 0 :(得分:4)
尝试使用此脚本代替该脚本:
{
"query": {
"filtered": {
"filter": {
"terms": {
"Commodity": [
55,
150
],
"execution": "and"
}
}
}
}
}
答案 1 :(得分:1)
对于使用最新版本的Elasticsearch(7.1.1)的用户,请注意 “过滤”和“执行”已被弃用,因此@Andrei Stefan的答案可能不再有用。
您可以通过以下讨论找到其他方法。
https://discuss.elastic.co/t/is-there-an-alternative-solution-to-terms-execution-and-on-es-2-x/41089
在上述讨论中,由nik9000编写的答案中,我只是将“ term”替换为“ terms”(在PHP中),并且它开始使用数组输入,并且针对每个“ terms”键应用了AND我用过。
编辑:根据要求,我将发布一个用PHP编写的示例查询。
'body' => [
'query' => [
'bool' => [
'filter' => [
['terms' => ['key1' => array1]],
['terms' => ['key2' => array2]],
['terms' => ['key3' => array3]],
['terms' => ['key4' => array4]],
]
]
]
]
key1,key2和key3是存在于我的Elasticsearch数据中的键,它们将在各自的数组中进行搜索。 AND函数应用于[“ terms” => [''key'=> array]行之间。
答案 2 :(得分:0)
对于使用es 6.x的您来说,这可能有所帮助。 在这里,我通过传递订单数组来检查用户(rennish.joseph@gmail.com)是否有任何订单
GET user-orders/_search
{
"query": {
"bool": {
"filter": [
{
"terms":{
"orders":["123456","45678910"]
}
},
{
"term":{
"user":"rennish.joseph@gmail.com"
}
}
]
}
}
}