如何提高mysql的全文准确性?

时间:2010-10-26 17:47:42

标签: mysql search full-text-search

我正在运行一个简单的mysql全文查询,该查询根据“显示名称”在我的网站上搜索用户。查询示例如下 - 在此示例中,我们正在搜索'lancaster toy store':

SELECT MATCH(`display_name`) AGAINST ('lancaster toy store') as `rel`
WHERE MATCH(`display_name`) AGAINST ('lancaster toy store')
ORDER BY `rel` DESC

它的效果很好,因为它可以获得大量的结果,但结果的一个例子是:

  1. 夏洛特玩具店
  2. 百老汇的玩具店
  3. 亚利桑那州玩具店
  4. 兰开斯特的玩具店
  5. 东海岸玩具
  6. 正如你所看到的,我的问题是人们正在寻找'兰卡斯特玩具店',而明显的最佳结果是在中间或底部附近出现。

    我也在使用porter-stemmer技术。

    如何获得更准确的结果?

    更新

    这是真正的查询(实际搜索词是'lancaster restore'):

    SELECT `id`,
           MATCH (`display_name`) AGAINST ('lancast* restor*' IN BOOLEAN MODE)
               AS `RELEVANCY`
    FROM `users`
    WHERE `status` = 'active'
    && MATCH (`display_name`) AGAINST ('lancast* restor*' IN BOOLEAN MODE)
    ORDER BY `RELEVANCY` DESC
    LIMIT 25
    

    以下是结果:

    1. 橙县人类栖息地 - ReStores
    2. ReStore 15 Fourth Street Dover NH
    3. Morris Habitat for Humanity ReStore
    4. Habitat ReStore Lima Ohio
    5. Habitat for Humanity Charlotte ReStore
    6. ReStore Montgomery County
    7. Dayton Ohio Habitat for Humanity ReStore
    8. ReStore
    9. 兰开斯特地区仁人家园重新存储

6 个答案:

答案 0 :(得分:2)

嗯,词干可能对获得结果很有用,但由于不是所有参数都需要(前面没有+),你最好搜索:

MATCH (display_name) 
AGAINST ('lancast* restor* >lancaster >restore' IN BOOLEAN MODE)

或至少

ORDER BY MATCH (display_name) 
AGAINST ('lancast* restor* >lancaster >restore' IN BOOLEAN MODE) DESC

答案 1 :(得分:2)

MySQL有一个强大的文本引擎,但如果你正在寻找高命令搜索,那么你的赌注应该在其他地方。如果你使用Lucene,使用任何可用语言的API(.NET,PHP使用Zend_Search_Lucene等),那么你将获得用于索引的框架的强大功能。

这将花费你一些开发时间,但你可以使用它进行一个荒谬的搜索。例如,如果您决定保存数据的描述,那么使用mysql进行搜索查询将最终导致灾难,因为不是为此而做,而不是Lucene的效率。

我只是在这里给出一个小建议!请记住,将成熟应用程序与索引功能集成应该花费一些开发时间,但是您可以放置​​的选项数组将是巨大且值得的。

祝你好运, 大卫

答案 2 :(得分:0)

我不知道porter-stemmer技术是什么,但是使用你的样本数据和查询与标准的MySQL全文索引,唯一应该返回的结果是#4:

4. toy store of lancaster

我注意到您的示例查询缺少FROM子句,因此我假设这不是您正在运行的确切查询。它缺少什么吗?也许您在查询中使用BOOLEAN MODE?如果你使用BOOLEAN MODE,这将解释额外的结果,但结果#4应该在列表的顶部,因为它有所有3个单词。

您能提供确切的查询吗?

答案 3 :(得分:0)

既然你以一种非常笼统的方式提出这个问题 - “任何想法如何获得更准确的结果?” - 答案可能也更为一般:使用其他全文搜索引擎而不是内置的MySQL。一个很好的是Sphinx搜索(http://sphinxsearch.com/),它易于设置,易于学习,与MySQL一起运行良好,并提供更好的速度和精度。

答案 4 :(得分:0)

我会提出另一个建议。如果您处于早期阶段,可以使用专用搜索引擎Solr,这样您就不必依赖数据库的全文搜索功能。

答案 5 :(得分:0)

如果它获得了正确的结果并且您真正想要的是更好的排序,您可以重新排序结果。作为第一个选项,为您的语料库获取单词频率分布,并使稀有单词匹配更高的排名结果。

alt text

投掷单词顺序也应该有所帮助。 OTOH一般搜索与科学一样多。