我正在做一个项目,它使用PHP/MYSQL作为IOS应用程序的后端,该应用程序大量使用包含文本或字符串的字典和数组。
我需要将此文本存储在MYSQL中(来自手机上的srtrings数组),然后查询以查看文本包含(不区分大小写)有问题的单词或短语。
例如,如果数组由{福特,雪佛兰,丰田,宝马,别克}组成,我可能想要查询它以查看它是否包含萨博。
我知道在字段中存储数组不是MYSQL友好的,因为它会阻止优化。然而,为用户创建的这些单词集合创建单独的表太复杂了。
因此,我正在寻找一种合理的方式来存储它们,也许可以用空格或逗号来分隔,这样就可以进行合理有效的搜索。
如果它们以空格分隔存储,我想您可以使用正则表达式执行一些操作,例如:
SELECT
*
FROM
`wordgroups`
WHERE
wordgroup regexp '(^|[[:space:]])BLA([[:space:]]|$)';但这看起来有点时髦。
有没有更好的方法来做这件事?感谢您的见解
发布于 2019-06-03 13:09:29
考虑使用FULLTEXT索引。并使用MATCH(...) AGAINST(... IN NATURAL LANGUAGE MODE)。
FULLTEXT对于“单词”的处理速度非常快,IN NATURAL MODE可能会解决你的Saab例子。
发布于 2019-06-03 07:22:48
使用regexp可以实现您想要的结果,但是,您的查询效率将很低,因为它不能依赖于任何索引。
如果您想存储一个单词列表,并且它们在数组中的位置并不重要,那么您可以考虑将它们存储在单个字段中,以空格分隔。但是,不要使用正则表达式,而是使用fulltext indexing and searching。与使用regexp进行搜索相比,这种方法有一个明显的优势:它使用索引。它也有一些缺点:有一个停用词列表(这些被排除在搜索之外),并且有一个最小的词长度。好消息是这些参数是可配置的。此外,您还获得了在分隔字段中存储数据的所有缺点,如此处的Is storing a delimited list in a database column really that bad?问题中所述。
但是,如果您想使用字典(键-值对),或者列表中的位置可能很重要,那么上面的数据结构将不起作用。
在这种情况下,我会首先考虑mysql是否是存储数据的正确选择。如果您有多维列表,或者包含列表的列表,那么我肯定会选择不同的nosql解决方案。
如果您只需要简单的二维列表/字典,那么您可以将它们全部存储在一个具有类似结构的表中,如下所示:
list_id - unique identifier of the list, primary key
user_id - id of the user the list belongs to
key - for dictionaries this is the lookup field (indexed), for other lists it may store the position of the element. String data type.
value - the field holding the value (indexed). Data type should be string, so that it could hold different data types as well.使用键或值字段上的索引进行搜索以确定列表是否包含特定值将是快速有效的查找。
https://stackoverflow.com/questions/56419476
复制相似问题