【问题标题】:Sphinx - How to get an Exact Match, i.e. same as mysql WHERE column = "value"Sphinx - 如何获得精确匹配,即与 mysql WHERE column = "value" 相同
【发布时间】: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
}

【问题讨论】:

    标签: sphinx sphinxql


    【解决方案1】:

    呸!总是这样。您花费数小时试图弄清楚它,将其发布到 *,然后在片刻之内,答案就会跳出来。

    原来是配置中的“expand_keywords”设置负责。对于那些不知道的人,这就是它的作用......

    对启用了 expand_keywords 功能的索引的查询在内部扩展如下。如果索引是在启用前缀或中缀索引的情况下构建的,则每个关键字都会在内部被关键字本身和相应的前缀或中缀(带星号的关键字)的析取替换。如果索引是在启用词干提取和 index_exact_words 的情况下构建的,则还会添加精确形式。下面是一个示例,展示了当上述所有内容(中缀、词干和精确词)组合时内部扩展的工作原理:

    运行 -> (运行 | *运行* | =运行)

    因此,尽管尝试搜索完全匹配,但这会导致它始终扩展并搜索列中的文本,而不是该列完全匹配。

    从配置中删除该行并重新启动 Sphinx 立即解决了问题,您甚至不需要重新索引,这很好。

    我想我会在这里留下问题和答案,以防其他人有类似的“问题”;)

    【讨论】: