我正在运行一个简单的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
它的效果很好,因为它可以获得大量的结果,但结果的一个例子是:
正如你所看到的,我的问题是人们正在寻找'兰卡斯特玩具店',而明显的最佳结果是在中间或底部附近出现。
我也在使用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
以下是结果:
答案 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)
如果它获得了正确的结果并且您真正想要的是更好的排序,您可以重新排序结果。作为第一个选项,为您的语料库获取单词频率分布,并使稀有单词匹配更高的排名结果。
投掷单词顺序也应该有所帮助。 OTOH一般搜索与科学一样多。