【问题标题】:mysql search for 's' ending should return the same without 's' endingmysql搜索's'结尾应该返回相同的没有's'结尾
【发布时间】:2012-03-01 18:35:00
【问题描述】:

我想在 mysql 中使用 MATCH 进行搜索。

我有 1 个表包含“名称”和“类别”字段。 “类别”字段包含书籍,书籍,书籍。

我想要的是,当我在类别字段中搜索“书”或“书”时,它应该给我 3 行。

谁能帮我解决这个问题?

谢谢

我需要澄清这个问题,实际上我有一个有搜索字段的网站。当用户在上面输入内容时,我的网站应该在类别字段中搜索。真正的问题是,有时用户输入“book”,有时输入“books”,有时输入“car”,有时输入“cars”。单词后面的这些“s”字让我头疼,我知道用户真正想要的是找到所有与书或汽车相关的东西,那么,我该怎么办,我应该去掉每个“s”字母吗?还是有更好的解决方案?

阿里

【问题讨论】:

  • mysql 不支持这样的功能,我认为最好将类别存储在单独的表中并建立 1:N 或 N:M 关系

标签: mysql full-text-search search-engine


【解决方案1】:
select *
from table
where category LIKE '%book%'

【讨论】:

  • thx 奇怪 :) 我想我提出了错误的问题。我需要澄清这个问题,实际上我有一个有搜索字段的网站。当用户在上面输入内容时,我的网站应该在类别字段中搜索。真正的问题是,有时用户输入“book”,有时输入“books”,有时输入“car”,有时输入“cars”等。这些单词后面的“s”让我头疼,我知道用户真正想要的是找到所有与书或汽车有关,所以,我该怎么办,我应该去掉每个“s”字母吗?还是有更好的解决方案?
  • @ari 实际上请求读取的是select all columns from the table table where the word 'book' is found in the category field regardless what is before and after the word,因此如果省略s,则请求返回的结果与写入的s 相同
  • 嗯真的需要检查一下。
【解决方案2】:

将用户输入修剪到可接受的长度并尝试此查询

  $userInput = substr($input, 0, 4);

  select * from table where category like "%$userInput%"

【讨论】:

  • thx Naveen :) 我想我提出了错误的问题。我需要澄清这个问题,实际上我有一个有搜索字段的网站。当用户在上面输入内容时,我的网站应该在类别字段中搜索。真正的问题是,有时用户输入“book”,有时输入“books”,有时输入“car”,有时输入“cars”等。这些单词后面的“s”让我头疼,我知道用户真正想要的是找到所有与书或汽车有关,所以,我该怎么办,我应该去掉每个“s”字母吗?还是有更好的解决方案?
  • 将用户字符串修剪到可接受的长度,然后根据该字符串进行查询
  • 感谢纳文。我认为有更通用的方法可以做到这一点。我希望有一个功能可以自动知道当用户搜索书籍时,它也会返回书籍,所以与电影、电影、汽车、汽车等其他词一样
【解决方案3】:

例如,如果您从 PHP 运行查询,您可以在那里准备查询,然后使用简单的正则表达式:

<?php

$term = 'book';

if(substr($term,-1) == 's') { //if term ends in an s
  $term = substr($term,0,-1); //the word without the s
}

//TODO: escape $term to prevent SQL injection

$query = "
  SELECT * FROM table
  WHERE category REGEXP '{$term}s?' // s? matches zero or one 's' character
";

【讨论】:

  • thx 奇怪 :) 我想我提出了错误的问题。我需要澄清这个问题,实际上我有一个有搜索字段的网站。当用户在上面输入内容时,我的网站应该在类别字段中搜索。真正的问题是,有时用户输入“book”,有时输入“books”,有时输入“car”,有时输入“cars”等,甚至人们输入 2 个词,如汽车保险或汽车保险。单词后面的这些“s”字让我头疼,我知道用户真正想要的是找到所有与书或汽车相关的东西,那么,我该怎么办,我应该去掉每个“s”字母吗?还是有更好的解决方案?
【解决方案4】:

使用 MATCH() 搜索需要对列类别进行全文索引,这可能有点过头了。

如果你真的只想要这两种情况,你可以写

select * from table where
category = 'book' or category = 'books'

通过 Oddant 的回答,您可能还会得到类似“probookcover”之类的结果。

如果您希望它不区分大小写,您有多种选择。

select * from table where
lower(category) = 'book' or lower(category) = 'books'

select * from table where
category like 'book' or category like 'books'

或者你也可以这样做

select * from table where
category like 'book%'

它会得到所有以 book 开头的列,但你也可能会得到“bookcover”。

编辑:考虑您的评论:

就像我说的那样,match() 太过分了,所以我会这样做:

select * from table where
category = whatYourUserEnters OR category = substring(whatYourUserEnters, 1, length(whatYourUserEnters) - 1)

【讨论】:

  • thx tombom :) 我想我提出了错误的问题。我需要澄清这个问题,实际上我有一个有搜索字段的网站。当用户在上面输入内容时,我的网站应该在类别字段中搜索。真正的问题是,有时用户输入“book”,有时输入“books”,有时输入“car”,有时输入“cars”等。这些单词后面的“s”让我头疼,我知道用户真正想要的是找到所有与书或汽车有关,所以,我该怎么办,我应该去掉每个“s”字母吗?还是有更好的解决方案?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-11
  • 1970-01-01
  • 2021-11-23
  • 1970-01-01
  • 1970-01-01
  • 2013-05-11
相关资源
最近更新 更多