gpt4 book ai didi

php - 当全文不是可行的解决方案时动态 mysql 搜索

转载 作者:行者123 更新时间:2023-11-29 03:40:01 25 4
gpt4 key购买 nike

许多文章将向您指出全文索引是 mysql 搜索的简单解决方案。在适当的情况下很可能就是这种情况,但我还没有看到在无法使用全文时(例如,跨表)接近全文的解决方案。我正在寻找的解决方案最好是可以匹配句子中任何内容的解决方案。

因此,搜索 James Woods 或搜索 Woods James 可能都会返回文本 James Woods 所在的同一行。基本的搜索方法会使搜索词的“混合匹配”变得毫无用处。

可能的答案是用 REGEXPLIKE 替换 Fulltext。然后用 |% 替换搜索词中的“空白”,这样 James Woods 可能会变成 James|Woods ,因此 JamesWoods 的任意组合都将返回结果。或者成为“%James%Woods%”,这会降低生产率,但仍会返回不一定准确的匹配项。

示例 SQL

SELECT * FROM people
LEFT JOIN
(SELECT GROUP_CONCAT(other_data) AS people_data GROUP BY people_id)
AS t2 ON(t2.people_id = people.id)
WHERE CONCAT_WS(' ', people.firstname, people.lastname, people_data) LIKE {$query}

这真的是最好的方法吗?是否有任何技巧可以使此方法(或其他方法)更有效地工作?我真的在寻找一个 mysql 解决方案,所以如果你的答案是使用另一个数据库服务,那么,就这样吧,我会接受它作为答案,但真正的问题是 mysql 的最佳解决方案。谢谢。

最佳答案

在MySQL中你尝试过使用

MATCH() 和 AGAINST() 函数的组合

我猜它们会产生您正在寻找的结果。

例如

对于以下数据集::

mysql> select * from temp;
+----+---------------------------------------------+
| id | string |
+----+---------------------------------------------+
| 1 | James Wood is the matyr. |
| 2 | Wood James is the saviour. |
| 3 | James thames are rhyming words. |
| 4 | Wood is a natural product. |
| 5 | Don't you worry child - Swedish House Mafia |
+----+---------------------------------------------+
5 rows in set (0.00 sec)

如果您需要 james 或 wood 在场,此查询将返回以下结果

mysql>  select string from temp where match (string) against ('james wood' in bo
olean mode);
+---------------------------------+
| string |
+---------------------------------+
| James Wood is the matyr. |
| Wood James is the saviour. |
| James thames are rhyming words. |
| Wood is a natural product. |
+---------------------------------+
4 rows in set (0.00 sec)

如果您要求 James 和 Wood 这两个词都应该存在,则此查询将起作用。注意单词前的“+”号。检查这个Boolean mode

mysql> select string from temp where match (string) against ('+james +wood' in b
oolean mode);
+----------------------------+
| string |
+----------------------------+
| James Wood is the matyr. |
| Wood James is the saviour. |
+----------------------------+
2 rows in set (0.00 sec)

以类似的方式查找带有任何后缀的单词

mysql> select string from temp where match (string) against ('Jame*' in boolean
mode);
+---------------------------------+
| string |
+---------------------------------+
| James Wood is the matyr. |
| Wood James is the saviour. |
| James thames are rhyming words. |
+---------------------------------+
3 rows in set (0.02 sec)

但请注意,Mysql 的全文搜索尚不支持前缀搜索

mysql> select string from temp where match (string) against ('*ame*' in boolean
mode);
Empty set (0.00 sec)

希望对您有所帮助。

请注意,这个回复很晚,但我很感兴趣,所以我回复了。

要了解更多信息,请查看此链接 http://dev.mysql.com/doc/refman/5.5/en//fulltext-search.html

关于php - 当全文不是可行的解决方案时动态 mysql 搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15098089/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com