Предполагая, что поля имеют тип 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;
}
"""
}
}
]
}
}
}
Я выполнил необходимое условие, используя Запрос сценария внутри Запрос Bool . При выполнении вышеуказанного запроса следует выбирать только документ, имеющий 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));
}
"""
}
}
]
}
}
}
Надеюсь, это поможет.