在select语句中优先选择字符串

3

我有一个select语句,如果一个字符串包含下面的任何一个单词,它会选择它,但它不按单词包含的顺序选择。例如,如果数据库中的字符串是“三 二 一”,而不是“一 二 三”,它仍然会选择它。我想让它首先按照字符串的顺序优先选择,然后再尝试获取那些不按顺序的内容。这种可能吗?

$text1 = "one";
$text2 = "two";
$text3 = "three";

SELECT text,
((text LIKE '%$text1%') + (text LIKE '%$text2%') + (text LIKE '%$text3%')) as `matches` 
FROM tableName 
HAVING `matches` > 0
ORDER BY `matches` DESC, rand() LIMIT 1

更多例子: 因此,如果数据库中有2个字符串。
其中一个是:
"one two three" 

另一个是

"three two one"

如果没有任何"one two three",我希望首先选择它,然后再选择"three two one"。


你可以尝试使用INSTR()值来进行某种评分。你还需要澄清一些事情,比如:应该让“one two”比“three one two”有更高的评分吗? - Uueerdo
@Uueerdo 请试着回答一下。 - jessica
@Uueerdo 对于你的回答,它们应该有相同的评分。当然,如果“one two”比“three one two”评分更高,那就更好了,但我认为如果可能的话,让它们具有相同的评分会更容易。如果您能帮忙,请帮忙。 - jessica
这是可能的,但如果所采用的策略偏离了您的问题,那么您会说,哦,他们可以搜索14个单词。因此,我甚至不敢回答这个问题。 - Drew
全文搜索的关键点是它需要大量数据,小单词是停用词,并且需要通过配置进行训练。因此,这是一个可悲的例子,因为我不想在堆栈上放置一个40k行的表。这是Oracle的免费赠品,它满足了简单、相对容易的设置需求,但结果令人怀疑。然后人们转向solr、lucene、elasticsearch、fastsearch等技术,这些技术将全文搜索作为核心能力,而mysql则没有这种核心能力。 - Drew
显示剩余26条评论
1个回答

2
您可以在order by中指定优先级:
SELECT text,
       ((text LIKE '%$text1%') + (text LIKE '%$text2%') + (text LIKE '%$text3%')) as `matches` 
FROM tableName 
HAVING `matches` > 0
ORDER BY `matches` DESC, 
         (case when text like '%$text1%$text2%text3%' then 1
               when text like '%$text3%$text2%text1%' then 2
               . . .
          else 999 end),
         rand()
LIMIT 1;

实际上,“只有3个单词”的例子只是一个示例。我的实际数据库搜索需要更多的单词,为所有不同的单词组合输入不同的情况只是不切实际的,因为单词可以组合成几乎无限种方式。在这种情况下,我认为全文搜索会更容易实现。 - jessica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接