如何在elasticsearch中为以下内容编写正确的查询:
phoneNumber != phoneCode + phone
最佳答案
假设字段的类型为text
,并且具有同级的等效keyword
类型,我共享了一个示例映射,示例文档确认了该映射以及下面的必需查询:
制图
PUT phone
{
"mappings":{
"mydocs":{
"properties":{
"phone":{
"type":"text",
"fields":{
"keyword":{
"type":"keyword",
"ignore_above":256
}
}
},
"phoneCode":{
"type":"text",
"fields":{
"keyword":{
"type":"keyword",
"ignore_above":256
}
}
},
"phoneNumber":{
"type":"text",
"fields":{
"keyword":{
"type":"keyword",
"ignore_above":256
}
}
}
}
}
}
}
样本文件
POST phone/mydocs/1
{
"phoneNumber": "9654231010",
"phoneCode": "0044",
"phone": "9654231010"
}
POST phone/mydocs/2
{
"phoneNumber": "00449654231010",
"phoneCode": "0044",
"phone": "9654231010"
}
查询:
POST phone/_search
{
"query":{
"bool":{
"must":[
{
"script":{
"script":"""
String phoneNumber = doc['phoneNumber.keyword'].value;
String phoneCode = doc['phoneCode.keyword'].value;
String phone = doc['phone.keyword'].value;
if(phoneNumber!=null && phoneCode!=null && phone!=null){
return phoneNumber != phoneCode + phone;
}
"""
}
}
]
}
}
}
我已经在Script Query内使用Bool Query实现了您想要的条件。运行上面的查询,应该只获取具有
id:1
的文档现在,我还假定
phoneNumber
和phoneCode
的值中没有hypen -
或将其用作它们之间的分隔符,如以下示例所示phoneNumber: 0044-965-423-1010
phoneCode: 0044
phone: 965-423-1010
如果这就是您的值,则可能要在脚本中使用
contains()
方法,如下所示:POST phone/_search
{
"query":{
"bool":{
"must":[
{
"script":{
"script":"""
String phoneNumber = doc['phoneNumber.keyword'].value;
String phoneCode = doc['phoneCode.keyword'].value;
String phone = doc['phone.keyword'].value;
if(phoneNumber!=null && phoneCode!=null && phone!=null){
return !(phoneNumber.contains(phoneCode) && phoneNumber.contains(phone));
}
"""
}
}
]
}
}
}
希望这可以帮助。
关于elasticsearch - 如何搜索结果一定不能两个值之和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55777448/