从mysql中的文本字段中提取所有单词

时间:2013-04-11 08:19:04

标签: mysql sql full-text-search

我有一个包含文本字段的表。在那些字段中我存储文本。根据行,每个字段中有大约20到50个句子。我正在使用HTML和PHP制作一个自动完成的HTML对象,我想开始输入一个单词的开头,并且数据库返回包含这些单词的句子(如Microsoft Office 2007/2010导航窗格)。

我需要mysql将这些单词或句子作为单独的结果返回,所以我可以进一步操作它们。

示例:

--------------------------------------------------------------------
| id    | title |content                                            |
--------------------------------------------------------------------
1 |  test 1    |  PHP is a very nice language and has nice features.
2 |  test 2    |  Spain is a nice country to visit and has nice language.
3 |  test 3    |  Perl isn\'t as nice a language as PHP.

我需要mysql查询以不同的结果返回以下内容:

1,"nice language"
1,"nice features"
2,"nice country"
2,"nice langugage"
3,"nicea a language"

这是我的SQL查询:

SELECT id, SUBSTR(content,POSITION('nice' IN content),50)
    FROM entries 
          MATCH (title,entry) AGAINST ('nice' WITH QUERY EXPANSION)

1 个答案:

答案 0 :(得分:3)

新答案

OP实际上与无关 - 他的问题涉及在MySQL中直接进行字符串操作。

字符串操作并不是DBMS的主要关注点。在流畅的文本意义上处理“单词”时,需要很多逻辑来确定下一个单词边界的位置,并且您不希望数据库真的这样做。此外,任何为此而写的查询都可能难以理解。

这完全取决于你在做什么,但很可能只有DB的方法会慢一些,因为会有更多的函数调用:SQL函数非常有限。

对于可重用性和最佳实践,如果您希望将来更改数据库以说MongoDB怎么办?你需要重写整个该死的笨拙的查询。

不,我的建议是将使用标准MySQL的全部价值提取到PHP中,将其放入PCRE,非常简单的正则表达式,完成工作。最好显示你在PHP代码中实际做了什么,因为它更“意图揭示”。

至少33%的开发人员的工作是为工作挑选合适的工具。在这个例子中,PHP是正确的工具。

原始答案

您已添加了代码,因此我猜测(虽然您的问题需要对此进行更多澄清),您显然希望此“自动完成”运行客户端。因此,您必须先从服务器端向客户端 获取数据。

Twitter Bootstrap有一个很酷的东西叫Typeahead。这使用JavaScript来执行(我认为)您需要的内容:该页面上的示例显示了如何键入国家/地区,它将自动为您完成。它看起来像这样:

enter image description here

你是如何得到这个工作的?首先包含所需的JavaScript文件,然后编写HTML。

这里有一些来自bootstrap页面的源代码,所以你可以看到它是如何工作的:

<input type="text" data-provide="typeahead" data-items="4" data-source='["Alabama","Alaska","Arizona","Arkansas","California"]'>

您能看到data-source属性是如何为typeahead提供您想要的信息吗?您想要连接到MySQL,抓取您的数据,然后将这些数据推送到data-source数组中,以供JavaScript使用,如上所述。

因此,在您的页面加载中,您连接到MySQL并从数据库中提取您希望“自动完成”的所有相关字符串。然后,您将这些作为typeahead的新Data属性,这就是它!

-

编辑:有一个twitter bootstrap的预先that allows AJAX calls的分支,所以你可以用它来异步执行数据检索(如果你能搞清楚,我会推荐这种方法)。