2015-03-25 22 views
0

我有一个有公司(id,name)的表。 在我必须搜索输入查询之前,用“like”处理记录。某些时候,客户希望它以输入查询结束,有时它可能会在两者之间发生,它应该从它开始。所以我用的不同变化“喜欢”MySQL - 通过SubString匹配的顺序索引

输入查询:微

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

很简单权。现在变体开始出现,用“喜欢”来处理并不容易。就像在单词开始时搜索查询时发生的一种情况一样。像同上面输入查询结果集应包含

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实现。如果是,比如何?还有什么选择?

+1

'ORDER BY LOCATE('Micro',CompanyName)'?虽然我建议你也研究[全文搜索](http://dev.mysql.com/doc/en/fulltext-search.html),或者像[Apache Solr](http:// lucene.apache.org/solr/)或[Sphinx](http://sphinxsearch.com/),因为您当前的模式匹配搜索不是可靠的。 – eggyal 2015-03-25 10:01:30

+0

是的,我已经建立了Apache Solr,因为除了这种情况之外,还有很多搜索日益变得越来越复杂。但目前我认为ORDER BY LOCATE('Micro',CompanyName)将起作用。谢谢 – planet260 2015-03-25 10:19:38

回答

0
select * from company where instr(CompanyName, 'Micro') > 0 order by instr(CompanyName, 'Micro'); 

排除不包含搜索短语(索引== 0)的条目。 按第一场比赛的人物指数排序。

+0

搜索大小写是单词开头的查询。 – planet260 2015-03-25 10:21:04

1

虽然也有例外,其中以下不能正常工作,它可能是好的足以满足大多数情况:

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

也就是说,只有匹配的名字,其中“微”的名字开头的单词。然后按照接近“Micro”的顺序将它们返回到单词的前面。我怀疑有很多名字中有两个名字是“Micro”的 - 如果他们这样做的话,每个事件都有一个很好的机会发生。

+0

ORDER BY LOCATE('Micro',CompanyName)如何?不一样吗? – planet260 2015-03-25 10:43:36

+0

@ planet260。 。 。应该是,并且还有'position()'函数。 – 2015-03-26 02:28:29