Я использую эластичный поиск и хочу сопоставлять людей в базе данных, чтобы избежать возможных дубликатов.Мои правила для соответствия человеку:
Идентификационный номер или номер usn должны точно соответствовать
ИЛИ
Имя, адрес электронной почты и номер мобильного телефонадолжно совпадать нечетко (они должны быть как можно ближе) или даже два из этих трех должны совпадать
Почему? У меня есть БД с 20k + внутренних деловых записей людей,Когда добавляется новый человек, я хочу представить создателю возможные совпадения.Когда человек сопоставляется (и подтверждается) или создает нового, он добавляется на мой сервер Flexiblesearch (поэтому все на моем ES-сервере подтверждается)
Я не хочу просто сопоставлять имя (многие людиимеют одно и то же имя)
Дополнительно: я использую Laravel
Это запрос, который я пробовал:
Переменные могут быть пустыми
'body' => [
'query' => [
['bool' => [
'must' => [
['match' => ['usnumber' => $usnumber]],
['match' => ['idnumber' => $idnumber]],
],
'should' => [
['match' => ['name' => $name]],
['match' => ['email' => $email]],
['match' => ['mobile' => $mobile]],
]
]
]
]
],
Это:
[
'name' => 'Person A',
'idnumber' => '123456789',
'usnumber' => '654321',
'email' => 'person_a@example.com',
'mobile' => '987654321'
]
Должно совпадать:
[
'name' => 'Different name',
'idnumber' => '123456789',
'usnumber' => '123456',
'email' => 'different@email.com',
'mobile' => '123456789'
]
Поскольку он имеет тот же идентификатор, но его нет.
Другие совпадения работают нормально, но я изо всех сил пытаюсь получить правильный запрос для моей логики.
Последнее слово: Раньше я использовал ручной поиск с использованием SQL и Левенштейна в своей операционной базе данных, но с ростом количества записей я переключился наasticsearch.Теперь я отправляю работу два раза в день, чтобы попытаться сопоставить всех неподтвержденных лиц
- Извините за длинный пост, представьте себе картофель