【问题标题】:Store and query array or group of words in MYSQL and PHP在 MYSQL 和 PHP 中存储和查询数组或单词组
【发布时间】:2019-10-18 13:02:15
【问题描述】:

我正在开发一个项目,该项目使用 PHP/MYSQL 作为 IOS 应用程序的后端,该应用程序大量使用包含文本或字符串的字典和数组。

我需要将此文本存储在 MYSQL 中(来自 Arrays of srstrings on phone),然后查询以查看文本是否包含(不区分大小写)有问题的单词或短语。

例如,如果数组包含 {Ford, Chevy, Toyota, BMW, Buick},我可能想查询它以查看它是否包含 Saab。

我知道在字段中存储数组对 MYSQL 不友好,因为它会妨碍优化。但是,为这些由用户创建的单词集合创建单独的表太复杂了。

所以我正在寻找一种合理的方式来存储它们,也许用空格或逗号分隔,这样可以实现合理有效的搜索。

如果它们以空格分隔,我认为您可以使用正则表达式执行以下操作:

SELECT 
    *
FROM
    `wordgroups`
WHERE
    wordgroup regexp '(^|[[:space:]])BLA([[:space:]]|$)';

但这看起来很时髦。

有没有更好的方法来做到这一点?感谢您提供任何见解

【问题讨论】:

    标签: mysql arrays regex search


    【解决方案1】:

    考虑使用FULLTEXT 索引。并使用MATCH(...) AGAINST(... IN NATURAL LANGUAGE MODE)

    FULLTEXT 对于“单词”来说非常快,IN NATURAL MODE 可能会解决您的 Saab 示例。

    【讨论】:

      【解决方案2】:

      使用正则表达式可以达到你想要的效果,但是你的查询效率会很低,因为它不能依赖任何索引。

      如果您想存储单词列表并且它们在数组中的位置无关紧要,那么您可以考虑将它们存储在单个字段中,以空格分隔。但不要使用正则表达式,而是使用fulltext indexing and searching。与使用正则表达式搜索相比,此方法具有明显的优势:它使用索引。它也有一些缺点:有一个停用词列表(这些被排除在搜索之外)并且还有一个最小词长。好消息是这些参数是可配置的。此外,您会发现将数据存储在分隔字段中的所有缺点,详见Is storing a delimited list in a database column really that bad? SO 问题。

      但是,如果你想使用字典(键-值对)或者列表中的位置可能很重要,那么上面的数据结构就不行了。

      在这种情况下,我会首先考虑 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.
      

      使用键或值字段上的索引来确定列表是否包含某个值的搜索将是快速有效的查找。

      【讨论】:

      • 我意识到其中一些词将是短语,所以我认为我必须使用逗号分隔而不是空格......例如,GMC Truck 或 Range Rover。我认为使用逗号分隔的缺点与空格分隔的大致相同?
      • 是的,分隔符并不重要。
      • 谢谢,影子。理想情况下,订单很重要,我认为您使用 NOSQL 解决方案是正确的,但主机目前不支持。我赞成你的回答。
      • 如果顺序很重要,那么全文索引将无济于事。在这种情况下,您为什么接受一个答案作为仅建议使用全文索引的解决方案?此外,如果托管公司不支持您需要的技术,那么您最好更换托管服务提供商。
      • 大型遗留项目,因此无法切换。我希望我能接受这两个答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-20
      • 1970-01-01
      • 2016-10-29
      • 1970-01-01
      相关资源
      最近更新 更多