我正在实现一个自动完成功能,允许用户输入部分文本,然后将其与表中的 4 个不同列进行匹配。这是一个基本示例:
+------------+-----------+--------+-----------------+
| first_name | last_name | login | email |
+------------+-----------+--------+-----------------+
| John | Smith | jsmith | jsmith@foo.bar |
| Johnny | Ringo | ringo | ringer@hmm.okay |
| Bob | Jones | bjones | j1234@xyz.abc |
| Jane | Doe | doej | doedoe@blah.umm |
+------------+-----------+--------+-----------------+
当用户输入“jo”时,我想匹配该表中的记录,其中这四列中至少有一个与模式“jo%”匹配。对于此示例,由于其first_name
列值,只有前两个会匹配。如果搜索是“js”,那么由于它的值login
和email
列值,只有第一条记录会匹配。等等。我还想返回按相似度排序的结果,其中第一个结果是“最接近的匹配”,依此类推(标准自动完成行为)。
我目前一直在尝试使用UTL_MATCH
, 和产生以下查询的代码来解决这个问题:
SELECT first_name,
last_name,
login,
email,
( utl_match.jaro_winkler_similarity(first_name, 'js')
+ utl_match.jaro_winkler_similarity(last_name, 'js')
+ utl_match.jaro_winkler_similarity(login, 'js')
+ utl_match.jaro_winkler_similarity(email, 'js')) similarity
FROM users
WHERE LOWER(first_name) LIKE LOWER('js%')
OR LOWER(last_name) LIKE LOWER('js%')
OR LOWER(login) LIKE LOWER('js%')
OR LOWER(email) LIKE LOWER('js%')
ORDER BY similarity DESC
结果并不像我希望的那样准确,而且我已经看到野外的自动完成功能以我希望的方式工作,但不知道它们是如何在后面实现的-结尾。
谁能指出我正确的方向?