我只是花了几天的时间来寻找解决方案,但没有成功,所以请帮助我! :)
我正在尝试为书籍编写一个简单的(小型)搜索引擎。记录数量不会很大(每年600条新记录)-因此,一流的性能并不是“必须具备的”条件。
books_searchindex;
+----------------+---------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------------+---------------------+------+-----+---------+-------+
| book_id | bigint(20) unsigned | NO | PRI | NULL | |
| category | tinyint(3) unsigned | NO | PRI | NULL | |
| search | text | YES | MUL | NULL | |
+----------------+---------------------+------+-----+---------+-------+
搜索过程分为两个步骤。第一步是在特殊表上使用全文搜索,在这里我以简化形式(从html等中清除)聚合所有文本数据。该表还有一个名为“类别”的附加列-告知其表示的数据类型(例如1-标题,2-作者,3-关键字,4-摘要)以及相应书籍的ID。这意味着一本书在此表中有4行,每个类别一行。
第二步使用已过滤的book_ids作为where_in,并添加数字搜索年份,月份等,并连接其他表。该查询的结果将呈现给最终用户。
我设法进行了全文搜索,但这并不是我要找的东西。目前,如果我在“作者”字段中写“ Smith”,它还会搜索其他类别,例如标题,摘要,关键字。
SELECT book_id, SUM(MATCH(search) AGAINST("XYZ")) as score
FROM `books_searchindex`
WHERE MATCH(search) AGAINST("XYZ")
AND `category` = 1
GROUP BY `book_id`
UNION
(...)
为了消除错误数据,我将查询分为较小的查询和附加的类别位置,然后将所有结果与UNION结合使用。几乎可以,但是我想获取所有全文搜索同时发生的数据。如果我以作者的身份写“ Wachowski”,以标题写“ Revolutions”,以摘要写“ Neo”,那么我只想得到1个结果Matrix Revolitions,而不是Wachowski的全部三部曲或所有电影。
你能帮我吗?:)
ps。我知道,我知道...最后一个例子是电影,而不是书;)