Как результат поиска не должен суммировать два значения? - PullRequest
1 голос
/ 20 апреля 2019

Как написать правильный запрос вasticsearch для:

номер телефона! = Код телефона + телефон

1 Ответ

1 голос
/ 21 апреля 2019

Предполагая, что поля имеют тип 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));
                  }
                  """
               }
            }
         ]
      }
   }
}

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...