【问题标题】:How to search inside a SQL table for a phrase如何在 SQL 表中搜索短语
【发布时间】:2017-09-25 23:16:05
【问题描述】:

我目前正在使用 MySQL,但如有必要,我愿意迁移到任何建议的解决方案。

我正在寻找一种简单的方法来实现对表的搜索。

该表有多个条目,其数据类似于用户帐户中的数据,例如姓名、地址、电话号码和一个包含任意长度的 cmets 的文本列。

我想进行搜索,以便遍历所有行和列并找到最匹配的行。纠正了一些拼写错误(不是很重要)。但最重要的是能够交叉搜索所有内容。

表格可以有多达 20,000 行。

搜索参数将是例如:“公司名字”

预期结果:

公司|联系人名字|地址|...|...

示例 2,搜索参数略有拼写错误:“Pinaple Street Compani”

预期结果行:

公司|菠萝街|..|... 公司|菠萝街|..|... 公司|菠萝街|..|...

编辑:

忘记说明将同时进行多个搜索,因此它必须快速(同时进行大约 100 次搜索)。此外,数据语言不是英文,数据库是 utf8,支持非英文字符

【问题讨论】:

  • 没有简单的解决方案。你必须写WHERE col1 LIKE '%pattern%' OR col2 LIKE '%pattern%' OR ...。它不会有效率,也不会做任何拼写更正。
  • 请显示 a) 示例表数据,b) 您的预期输出,以及 c) 您已经尝试过的查询。
  • 看看fulltext search
  • 您可以使用全文搜索,但在每一列上都有一个全文索引可能会产生很多开销。
  • 对于拼写错误的问题,你可以尝试使用soundex这样的函数来减少索引词。

标签: mysql


【解决方案1】:

拼写错误问题在纯 MySQL 中很难解决,如果不是不可能的话。

多列 FULLTEXT 搜索还不错。

您的查询将如下所示...

 SELECT column, column
   FROM table
  WHERE MATCH(Company, FirstName, LastName, whatever, whatever) 
      AGAINST('search terms' IN NATURAL LANGUAGE MODE)

它将产生一堆结果,按照 MySQL 猜测最有可能首先命中的排序。 MySQL 的猜测不是很好,但它们通常是足够的。

您需要一个与MATCH() 子句中的列列表匹配的FULLTEXT 索引。创建该索引如下所示。

ALTER TABLE book 
ADD FULLTEXT INDEX Fulltext_search_index_1 
    (Company, FirstName, LastName, whatever, whatever);

尽管您的问题中有评论,但您只需要为要搜索的列组创建一个索引。

20K 行不会对任何最新的服务器硬件造成很大的负担。

拼写错误:您可以尝试SOUNDEX(),但它是 20 世纪早期由贝尔系统设计的算法,用于查找美式英语中的人名。它旨在获得许多误报,而且它确实比一桶石头还笨。

如果您确实需要拼写更正,您可能需要调查 Sphinx。

【讨论】:

  • 请查看有关 Soundex 无法工作的原因的编辑。我在某处读到了有关列维斯坦距离和其他一些距离度量的信息。这些是否适用于多列、文本和大短语搜索。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多