Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何在数据库中搜索文本片段_Mysql_Database_Search_Indexing_Full Text Search - Fatal编程技术网

Mysql 如何在数据库中搜索文本片段

Mysql 如何在数据库中搜索文本片段,mysql,database,search,indexing,full-text-search,Mysql,Database,Search,Indexing,Full Text Search,是否有任何开源或商业工具可用于对数据库内容进行文本片段索引,并可从Java查询 问题的背景是一个大型MySQL数据库表,它有几十万条记录,包含几个VARCHAR列。在这些专栏中,人们希望搜索内容的片段,所以全文索引(基于单词边界)不会有帮助 编辑:[添加以明确这些最初的建议无法解决问题的原因:] 这就是为什么MySQL内置的全文索引不起作用,Lucene和Sphinx也不起作用,所有这些都是在答案中提出的。我已经看过了这两个词,但据我所知,它们都是基于索引词,不包括停止词,并且为真正的全文搜索做

是否有任何开源或商业工具可用于对数据库内容进行文本片段索引,并可从Java查询

问题的背景是一个大型MySQL数据库表,它有几十万条记录,包含几个VARCHAR列。在这些专栏中,人们希望搜索内容的片段,所以全文索引(基于单词边界)不会有帮助

编辑:[添加以明确这些最初的建议无法解决问题的原因:]

这就是为什么MySQL内置的全文索引不起作用,Lucene和Sphinx也不起作用,所有这些都是在答案中提出的。我已经看过了这两个词,但据我所知,它们都是基于索引词,不包括停止词,并且为真正的全文搜索做了各种合理的事情。然而,这并不合适,因为我可能正在寻找一个像“oison”这样的搜索词,它必须匹配“Roisonic Street”和“Toxin Ivy”。这里的关键区别在于,搜索词只是列内容的片段,不需要用任何特殊字符或空格分隔

EDIT2:[添加了更多背景信息:] 在此基础上实现的请求功能是在商品管理系统中对商品描述进行非常松散的搜索。用户通常不知道正确的项目编号,但只知道项目名称的一部分。不幸的是,这些描述的质量相当低,它们来自遗留系统,不容易更改。例如,如果人们正在寻找一把大锤,他们会输入“sledge”。如果使用基于单词/标记的索引,则不会查找存储为“sledgehammer”的匹配项,而只查找那些侦听“sledgehammer”的匹配项。有各种各样奇怪的差异需要覆盖,这使得基于令牌的方法不切实际

目前我们唯一能做的就是像“%searchterm%”这样的
查询
有效地禁用任何索引使用,并且需要大量资源和时间

理想情况下,任何这样的工具都会创建一个索引,使我能够非常快速地获得类似于此类查询的结果,这样我就可以实现类似聚光灯的搜索,只有在用户选择结果记录时,才可以通过主键从MySQL表中检索“真实”数据

如果可能的话,索引应该是可更新的(不需要完全重建),因为数据可能会更改,并且应该可以由其他客户端立即进行搜索

我很乐意得到建议和/或经验报告

EDIT3:商业解决方案发现“只起作用” 尽管我在这个问题上得到了很多很好的答案,但我想在这里指出,最终我们推出了一款名为“QuickFind”的商业产品,由一家名为“HMB Datentechnik”的德国公司制造和销售。请注意,我与他们没有任何关联,因为当我继续描述他们的产品可以做什么时,可能会出现这种情况。不幸的是,他们的产品看起来很糟糕,而且只有德国货,但产品本身真的很棒。我目前有他们的试用版-你必须联系他们,没有下载-我印象非常深刻

由于网上没有全面的文档,我将尝试描述我迄今为止的经历

他们所做的是基于数据库内容构建自定义索引文件。它们可以通过ODBC进行集成,但据我所知,客户很少这样做。相反,我们可能会这样做,从主数据库生成文本导出(如CSV),并将其提供给索引器。这允许您完全独立于实际的表结构(或任何SQL数据库);事实上,我们从多个表中导出连接在一起的数据。以后可以动态地增量更新索引

基于此,他们的服务器(仅250kb左右,作为控制台应用程序或Windows服务运行)侦听TCP端口上的查询。该协议是基于文本的,看起来有点“旧”,但它很简单并且有效。基本上,您只需传递要查询的可用索引和以空格分隔的搜索词(片段)。 有三种输出格式可用,HTML/JavaScript数组、XML或CSV。目前,我正在为有点“过时”的wire协议开发Java包装器。但是结果非常棒:我目前有一个大约500.000条记录的样本数据集,其中有8列被索引,我的测试应用程序在编辑的过程中触发了对所有8列的JTextField内容的搜索,并且可以实时更新结果显示(JTable)!这种情况发生时,不需要访问数据最初来自的MySQL实例。根据返回的列,您可以通过使用该行的主键(当然需要包含在QuickFind索引中)查询MySQL来请求“原始”记录

该索引大约是数据文本导出版本大小的30-40%。索引主要受磁盘I/O速度的限制;我的500000条记录需要大约一两分钟的时间来处理

很难描述这一点,因为当我看到一个内部产品演示时,我发现很难相信这一点。他们展示了一个1000万行的地址数据库,搜索姓名、地址和电话号码的片段,当点击“搜索”按钮时,结果在不到一秒钟的时间内返回——所有这些都在笔记本上完成!据我所知,他们经常与SAP或CRM系统集成,以缩短呼叫中心代理仅了解来电者姓名或地址片段时的搜索时间

所以不管怎样,我在描述这一点时可能不会有太多的进步。如果你需要这样的东西,你一定要去看看。把他们的网站从德语翻译成英语做得相当好,所以这可能是一个不错的选择
<fieldType name="prefix_token" class="solr.TextField" positionIncrementGap="1">
    <analyzer type="index">
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory" />
        <filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="20"/>
    </analyzer>
    <analyzer type="query">
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory" />
    </analyzer>
</fieldType>
    <field name="title" type="text" indexed="true" stored="true"/>
    <field name="title_ngrams" type="ngram_text" indexed="true" stored="false"/>
<copyField source="title" dest="title_ngrams"/>