Sphinx-如何获得精确匹配,即与mysql相同,其中column=";“价值”;

Sphinx-如何获得精确匹配,即与mysql相同,其中column=";“价值”;,sphinx,sphinxql,Sphinx,Sphinxql,我有一个包含人们信息的实时索引(定义如下)。问题是,我正在尝试对电话号码和电子邮件地址进行精确匹配,无论我尝试什么,我都会得到匹配,即使数据库列值包含我搜索的内容,而不是列值精确匹配的位置 我使用的查询是: SELECT id, first_name,last_name,email_personal, phone_number, WEIGHT() as relevance FROM people WHERE MATCH('@(phone_number,email_personal) "^+447

我有一个包含人们信息的实时索引(定义如下)。问题是,我正在尝试对电话号码和电子邮件地址进行精确匹配,无论我尝试什么,我都会得到匹配,即使数据库列值包含我搜索的内容,而不是列值精确匹配的位置

我使用的查询是:

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查询(是的,这也不起作用!)

配置:

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
}

呸!这永远是一种方式。你花了好几个小时想弄明白,把它贴到StackOverflow上,然后在几分钟内答案就跳出来了

原来是配置中的“expand_keywords”设置造成的。对于那些不知道的人,这就是它所做的

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

跑步->(跑步|*跑步*|=跑步)

因此,尽管尝试搜索精确匹配,但这导致它总是展开并搜索列中的文本,而不是列完全匹配

将这一行从配置中去掉&重新启动Sphinx就直接解决了问题,您甚至不需要重新编制索引,这很好

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

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
}