我正在使用MYSQL为查询返回的每个结果生成一个分数.然后按分数排序结果.
似乎没有正常工作的部分是我正在尝试为已搜索的每个标记添加分数并将结果分配给.所以我要说我搜索标签"example","test and"tag"并将我的一个结果分配给标签"example","test","someothertag"它应该得到10分因为有2场比赛.
实际情况是,如果匹配,我得分为5,无论匹配多少标签.如果没有匹配的标签,则为0.
以下是从搜索生成的查询之一的示例.
SELECT DISTINCT results.*,
(
5*(MATCH(tags.name) AGAINST('"self employed"' IN BOOLEAN MODE)) +
5*(MATCH(tags.name) AGAINST('"rental income"' IN BOOLEAN MODE)) +
5*(MATCH(tags.name) AGAINST('"commission income"' IN BOOLEAN MODE)) +
5*(MATCH(tags.name) AGAINST('"bankruptcy"' IN BOOLEAN MODE)) +
5*(MATCH(tags.name) AGAINST('"condo approval"' IN BOOLEAN MODE)) +
1*usefulness +
10*shares
) AS score
FROM results
INNER JOIN categories c on results.ID = c.RESULT_ID
INNER JOIN tags ON results.id = tags.result_id
WHERE c.name in ('purchase', 'condo', 'va')
AND ( tags.name = 'self employed' OR tags.name …Run Code Online (Sandbox Code Playgroud) 我对MATCH AGAINST功能有问题.
以下查询给出了相同的结果:
SELECT * FROM models MATCH(name) AGAINST('Fiat 500')
SELECT * FROM models MATCH(name) AGAINST('Fiat')
Run Code Online (Sandbox Code Playgroud)
如何在FULL TEXT表的列中搜索字符串和数字?
谢谢
我有两张桌子:
CREATE TABLE IF NOT EXISTS `test1` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`bucket_id` int(10) unsigned NOT NULL COMMENT 'folder this component belongs to',
`test1_name` varchar(81) NOT NULL COMMENT 'Name of this component',
`test1_desc` varchar(1024) NOT NULL COMMENT 'Component Description',
PRIMARY KEY (`id`),
FULLTEXT KEY `test1_search` (`test1_name`,`test1_desc`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;
CREATE TABLE IF NOT EXISTS `bucket` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`bkt_name` varchar(81) NOT NULL COMMENT 'The name of this bucket',
`bkt_desc` varchar(1024) NOT …Run Code Online (Sandbox Code Playgroud) MySQL提供FULLTEXT可以使用MATCH (col1,col2,...) AGAINST (expr [search_modifier])构造检索的索引.有几种全文搜索变体,其中一种(和默认的)是自然语言全文搜索.
那么MATCH的最大可能值是什么('...'IN NATURAL LANGUAGE MODE)?
例:
这个查询
SELECT
courses.id,
courses.title,
MATCH (coursedata.title) AGAINST ('Basketball') AS relevance
FROM
courses
JOIN
coursedata ON coursedata.id = courses.coursedata_id
WHERE
MATCH (coursedata.title) AGAINST ('Basketball') > 0
Run Code Online (Sandbox Code Playgroud)
返回带有列的结果表relevance,我们在其中存储coursedata.title行的相关性值'Basketball'.或相关值'Basketball'的coursedata.title行?无论如何,我们在那里存储MATCH(...)函数的输出.就我而言,我从歌厅值0来3.695953130722046.
当我尝试使用带有单引号和星号通配符的字符串(即"levi's*")尝试在布尔模式下进行全文搜索时,我遇到了问题:它似乎也搜索以"s"开头的所有单词,就像"长矛"一样,据我所知,引用应该被认为是单词的一部分,而两个单引号('')将是一个单词分隔符......但也许我错了.
请看这里的例子:http://www.sqlfiddle.com/#!2/3dd3/2/0 - 第二行不应该在那里
我该怎么做我想要的?
我知道星号是一个通配符,可以附加到全文搜索词的末尾,但是如果我搜索的关键字是后缀怎么办?例如,我希望能够搜索“ames”并返回包含名称“james”的结果。这是我当前的查询不起作用,因为您不能在全文搜索中添加星号。
SELECT * FROM table WHERE MATCH(name, about, address) AGAINST ("*$key*" IN BOOLEAN MODE)
Run Code Online (Sandbox Code Playgroud)
我会简单地切换到使用 LIKE,但对于我的数据库大小来说太慢了。
当我使用 MySql使用MATCH AGAINST执行此 查询时 (请参阅查询 1st),此查询中的问题产生了这样的错误(请参阅错误),或者当我使用=执行相同的查询时, 它们正常执行(请参阅查询 2nd)。
我的问题是我对反对声明做错了什么?
查询第一
SELECT (SELECT COUNT(up.`user_id`)
FROM `users_post` up WHERE MATCH (up.`user_id`) AGAINST (uf.`user_id`))
AS user_count
FROM `users` uf
Run Code Online (Sandbox Code Playgroud)
错误
enter code hereError Code : 1210
Incorrect arguments to AGAINST
(0 ms taken)
Run Code Online (Sandbox Code Playgroud)
更新
查询 2
SELECT
(SELECT COUNT(up.`user_id`)
FROM `users_post` up WHERE up.`user_id` = uf.`user_id`)
AS user_count
FROM `users` uf
Run Code Online (Sandbox Code Playgroud) 我有一个表,其中的列内容具有FULLTEXT 索引。
\n我想利用MATCH()在大文本上的速度。
\n我希望搜索尽可能准确。
\n当我这样搜索短语字符串“ large Truck ”时:
\nSELECT * FROM MyTable WHERE MATCH(content) AGAINST('"large truck"' IN BOOLEAN MODE);\nRun Code Online (Sandbox Code Playgroud)\n有些实例被遗漏了。
\n我的表:
\n| content |\n----------------\n|Large \\n truck| FOUND \xe2\x9c\x93\n----------------\n|large truck | FOUND \xe2\x9c\x93\n----------------\n|large trucks | *PLURAL MISSED!\n----------------\n|large truckl | *TYPE-O MISSED!\nRun Code Online (Sandbox Code Playgroud)\n如果我使用标准的LIKE /通配符方法:
\nSELECT * FROM `MyTable` WHERE `content` LIKE '%large truck%'\nRun Code Online (Sandbox Code Playgroud)\n我的表:
\n| content |\n----------------\n|Large \\n truck| *MISSED!\n----------------\n|large truck | …Run Code Online (Sandbox Code Playgroud) 我为一些公司提供了一张桌子,这些公司可能在不同国家拥有许多分支 这些国家被插入countries现场.
现在,我必须建立一个搜索系统,允许用户查找在特定国家/地区拥有任何分支的公司.
我的问题是:我必须使用哪一个?MATCH AGAINST还是LIKE?查询必须搜索所有记录才能找到完整匹配的项目.
我在 MySQL 数据库中使用 Match Against 时遇到问题,希望有人能提供帮助。
这是我数据库中数据的示例:
id name
1 really bitter chocolate
2 soft cheese
Run Code Online (Sandbox Code Playgroud)
当我运行此查询时:
SELECT * FROM food WHERE (name) LIKE "%bitter%"
Run Code Online (Sandbox Code Playgroud)
这带来了第一个结果:
1 really bitter chocolate
Run Code Online (Sandbox Code Playgroud)
然而,它是一个更大的查询的一部分,当我运行 Match Against 代码时,我没有从这些查询中得到任何返回:
SELECT * FROM food WHERE MATCH (name) AGAINST ("bitter")
SELECT * FROM food WHERE MATCH (name) AGAINST ("bitter", IN BOOLEAN MODE)
Run Code Online (Sandbox Code Playgroud)
我打开了全文搜索,当我搜索名称的开头时它可以工作:
SELECT * FROM food WHERE MATCH (name) AGAINST ("really")
SELECT * FROM food WHERE MATCH (name) AGAINST ("really", IN BOOLEAN MODE)
Run Code Online (Sandbox Code Playgroud)
两者都返回:
1 really …Run Code Online (Sandbox Code Playgroud) 我认为这是一个非常简单的查询,但我无法在任何编程书籍或网络上找到它.
我有这个查询:SELECT*FROM test WHERE MATCH(column1,column2)AGAINST('value1');
但我需要AGAINST有多个值,例如(value1,value2,value3)
有人可以帮忙吗?