【发布时间】:2023-12-31 03:14:01
【问题描述】:
我有一个包含人员信息的实时索引(定义如下)。问题是我正在尝试对电话号码和电子邮件地址进行完全匹配,无论我尝试什么,即使数据库列值包含我搜索的内容,我也会得到匹配,而不是列的位置值完全匹配。
我使用的查询是:
SELECT id, first_name,last_name,email_personal, phone_number, WEIGHT() as relevance FROM people WHERE MATCH('@(phone_number,email_personal) "^+447111$" "^myemail@gmail\.com$ "');
返回的行包含完整的电话号码(即+44711122334),据我了解,不应该,它应该尝试匹配“^+447111$”作为字段的开头和结尾?
我也尝试过这个测试查询并且有很多相同的问题,除了它返回更多匹配的事实,因为它会匹配包含条件的任何字段值,而不是整个字段价值。这些值不是我正在寻找的完整值,但这是一个测试,因为它应该匹配只有电话号码“+447711”和电子邮件“@gmail.com”的行,这些行不存在于数据库中,但它确实返回行,其中电话号码以 +447711 开头,电子邮件中包含@gmail.com。
SELECT id, first_name,last_name,email_personal,phone_number, WEIGHT() as relevance FROM people WHERE MATCH('@phone_number "^+447711$" @email_personal "^@gmail\.co$"') ORDER BY relevance DESC;
为了确认,我正在尝试查找字段值与确切文本匹配的匹配项,即这将是 SQL 查询(是的,这也不起作用!)
SELECT id,first_name,last_name,email_personal,phone_number FROM people WHERE phone_number = '+44711122334' AND email_personal = 'myemail@gmail.com';
配置:
index people
{
type = rt
path = /var/local/sphinx/indexes/ppl/
rt_field = first_name
rt_field = last_name
rt_field = phone_number
rt_field = email_personal
stored_fields = first_name,last_name,phone_number,email_personal
rt_mem_limit = 512M
expand_keywords = 1
min_prefix_len = 2
min_word_len = 2
index_exact_words = 1
}
【问题讨论】: