我正在使用elasticsearch,希望匹配数据库中的人员以避免可能的重复。我的配对规则是:
idNumber或usNumber必须完全匹配
或者
姓名、电子邮件和手机应该模糊匹配(它们应该尽可能接近),甚至这三者中只有两个必须匹配
为什么?
我有一个数据库,里面有20000多人的内部业务记录。当添加一个新的人时,我想向创建者提供可能的匹配项。当匹配(和确认)或创建新的人员时,他们将被添加到我的ElasticSearch服务器(因此,我的ES服务器中的所有内容都被确认)
我不想简单地匹配一个名字(许多人有相同的名字)
额外:我用的是拉维
这是我尝试过的查询:
变量可能为空
'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和levenshtein手动搜索,但是随着记录数量的增长,我切换到了elasticsearch。现在我每天派两次工去匹配所有未确认的人