2010-09-09 43 views
0

假设我有一个名为DB的MySQL数据库和一个名为ContactInfo的表。下面是它的结构和一些示例数据(仅一个项目):从数据库中进行全文搜索

表----的ContactInfo:


 
----------------------------------------------------------- 
name fullname          phone 
----------------------------------------------------------- 
NASA National Aeronautics and Space Administration 00000 
----------------------------------------------------------- 

现在我想搜索的表下的数据“ ContactInfo“使用以下方式:

1)无论我输入”NASA“或”国家航空航天局“或电话号码,都应该将右边的行我。 2)当我进入“国家航空局”或“国家航天局”或“美国航空航天局”或“美国航空航天局”时,它们在数据库中并不完全匹配,但第一行应该是由于第一行中的内容与请求的字符串相关,因此返回给我。

方式二可以被看作是隐蔽的搜索。

我已经考虑过使用诸如“Hpyer estraier”和“Lucene”之类的“全部上下文搜索”。不过,我发现我的要求不同或多或少。

使用“Hyper estraier”或“Lucene”时,首先根据解析的纯文本创建索引。然后开始搜索。

那么这是否意味着我应该将数据库中的数据更改为多个纯文本文件(表中的每个记录为单个文件),然后根据这些文件构建索引?

顺便说一句,我刚刚发现MySQL支持全文搜索,但是我们必须处理一些中文字符,但似乎mysql确实支持中文字符全文搜索。

那么,任何人都可以给我一个建议?

回答

0

您可以将sphinx与mysql结合使用。 sphinx是一个独立的工具,但它有一个mysql代理模式,它基本上像一个mysql服务器,可以用任何mysql连接器查询。 或者,作为替代方案,还有一个用于mysql的sphinx存储引擎插件,它允许您使用当前的mysql连接查询sphinx,并对其他表执行连接。

Definetly不是基切和肮脏的解决方案,但它是值得进一步研究:http://sphinxsearch.com/

+0

似乎sphinx只支持php,但我们的应用程序是在java.and下构建的,而我发现另一个sphinx-4,有什么不同? – hguser 2010-09-09 11:06:09

+0

Java不需要在sphinx支持中构建。您可以使用SphinxSE'SE =存储引擎http://sphinxsearch.com/docs/current.html#sphinxse-using或SphinxQL http://sphinxsearch.com/docs/current.html#sphinxql这是一个守护程序一个真正的MySQL服务器,让我们来执行查询。两种方法都要求sphinx守护进程启动并运行。 SphinxQL更容易设置,因为SphinxSE要求您使用sphinx支持重新编译MySQL,但SphinxSE更方便查询,因为您可以从sphinx搜索中查询product_id,并且可以一步直接加入产品表。 – 2010-09-09 14:33:25

0

你可以使用这样的事情,为此目的:

SELECT * 
    FROM `ContactInfo` 
WHERE `name` LIKE '%your-query%' 
    OR `fullname` LIKE '%your-query%' 
    OR `phone` LIKE '%your-query%' 

为了支持你的情况#2,您需要% -characters替换your-query所有空间,使字符之间的任意组合输入的话。记住要避免用户输入以防止SQL注入。

将所有数据放入(单独的)文本文件中似乎对于存储数据确实是无效的。

+0

情形#2,对于英文字符您的建议的工作,但似乎不适合中国字。由于英文单词以空格开始和结束,但中文单词不会。 – hguser 2010-09-09 10:58:59

+0

您可以使用带有字边界快捷键('\ b')的正则表达式来构建此文件,如[这里](http://unicode.org/reports/tr18/#Tailored_Word_Boundaries)中记录的那样。 – jwueller 2010-09-09 11:14:06

+0

谢谢,我会试一试。我想知道与全文serach相比,哪种效率更好? – hguser 2010-09-09 11:41:05