我们说我有三个字段,A,B和C.C是一个存储电子邮件的分析字段,我需要一个完整的匹配。
在SQL术语中,我需要编写一个像
这样的查询select * from table where A = '123' OR (B = '456' AND A = '' ) OR ( C = 'abc@xyz.com' AND A = '' AND B = '');
我在第一次尝试时写了下面的查询,但是我得到了一个Parse异常错误。
No filter registered for [match]];
一旦我用匹配查询删除块,我就开始得到结果,这让我觉得我不能用这种方式编写查询。
如果您有任何建议,请告诉我。
{ "size": 25, "query": {
"filtered": {
"filter":{
"or":[
{"term": {"A": "123"}},
{
"and":[
{"term": {"B": "456"}},
{"term": {"A": ""}}
]
},
{
"and":[
{
"match":{
"C":{
"query": "abc@xyz.com",
"operator": "AND"
}
}
},
{"term": {"A": ""}},
{"term": {"B": ""}}
]
}
]
}
} } }
答案 0 :(得分:1)
你可以阅读这个https://www.elastic.co/guide/en/elasticsearch/guide/current/combining-filters.html 它应该对你有帮助。
SQL查询:
SELECT document
FROM products
WHERE productID = "KDKE-B-9947-#kL5"
OR (productID = "JODL-X-1937-#pV7" AND price = 30 )
ES查询:
{
"query" : {
"constant_score" : {
"filter" : {
"bool" : {
"should" : [
{ "term" : {"productID" : "KDKE-B-9947-#kL5"}},
{ "bool" : {
"must" : [
{ "term" : {"productID" : "JODL-X-1937-#pV7"}},
{ "term" : {"price" : 30}}
]
}
}
]
}
}
}
}
}