【问题标题】:MySQL -- Order by SubString matching IndexMySQL -- 按子串匹配索引排序
【发布时间】:2015-03-25 09:50:54
【问题描述】:

我有一张包含公司(id、name)的表。 在我不得不针对使用“like”处理的记录搜索输入查询之前。有时客户希望它以输入查询结束,有时它可能发生在它应该以它开始的某个时间之间。所以我使用了不同的“like”变体

输入查询:微

select * from Company where CompanyName like "Micro%";
select * from Company where CompanyName like "%Micro%";
select * from Company where CompanyName like "%Micro";

很简单吧。现在变化开始出现,用“like”处理起来并不容易。就像发生在单词开头搜索查询的一种情况一样。与上述输入查询一样,结果集应包含

Microcompany Something
Something Somethin Microcompany
Something Microcompany

所以我改用Regular Expressions

现在我的查询变成了

select * from company where CompanyName regexp '[[:<:]]Micro';

问题:现在我希望根据最接近的匹配索引对结果进行排序。我的意思是,在接近 0 的索引上发生匹配的那个将首先出现,然后是其他的。对于上面的搜索结果,它应该是下面的顺序。

Microcompany Something
Something Microcompany
Something Somethin Microcompany

是否可以通过 MySQL 实现。如果是,比怎么样?有哪些替代方案?

【问题讨论】:

  • ORDER BY LOCATE('Micro', CompanyName)?虽然我建议您也研究一下fulltext search,或者像Apache SolrSphinx 这样的引擎,因为您当前的模式匹配搜索不是可搜索的。
  • 是的,我已经设置了 Apache Solr,因为除了这种情况,还有很多搜索变得越来越复杂。但目前我认为 ORDER BY LOCATE('Micro', CompanyName) 会起作用。谢谢

标签: mysql sql regex database search


【解决方案1】:

虽然可能有以下情况不起作用的例外情况,但对于大多数情况来说可能已经足够了:

select *
from company
where CompanyName regexp '[[:<:]]Micro'
order by instr( CompanyName, 'Micro');

也就是说,仅匹配名称中以“Micro”开头的单词的名称。然后按照“Micro”与单词前面的接近程度的顺序返回它们。我怀疑有很多名字的名字中有两次“Micro”——如果有的话,很有可能每次出现都以一个单词开头。

【讨论】:

  • ORDER BY LOCATE('Micro', CompanyName) 怎么样。不一样吗?
  • @planet260 。 . .应该有,还有position()这个功能。
【解决方案2】:
select * from company where instr( CompanyName, 'Micro' ) > 0 order by instr( CompanyName, 'Micro' );

排除不包含搜索短语(索引 == 0)的条目。 按第一个匹配的字符索引排序。

【讨论】:

  • 搜索案例是词首查询。
猜你喜欢
  • 1970-01-01
  • 2011-08-04
  • 1970-01-01
  • 2013-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-21
  • 1970-01-01
相关资源
最近更新 更多