我正在使用elasticsearch,希望匹配数据库中的人员,以避免重复。我匹配一个人的规则是:
idnumber或usnumber必须完全匹配
OR
姓名,电子邮件和手机应该模糊匹配(它们应该尽可能地接近),或者甚至这三个中只有两个必须匹配
为什么? 我的数据库拥有超过20k个人的内部业务记录。添加新人员后,我想向创建者显示可能的匹配项。当一个人被匹配(并确认)或创建新人时,他们被添加到我的Elasticsearch服务器中(因此我的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'
]
因为它具有相同的ID号,但没有。
其他匹配项工作正常,但我一直在努力为自己的逻辑获取正确的查询。
最后一句话:我曾经在操作数据库中使用SQL和Levenshtein进行手动搜索,但是随着记录数量的增加,我切换到了Elasticsearch。现在,我每天两次派遣一份工作,以尝试与所有未经证实的人相匹配