1
10
这可能不是您想要听到的,因为我假定您正试图用SQL代码解决这个问题,但是 Lucene 这将是我的第一选择。您还可以使用其他工具建立相当聪明的排名和提升技术。Lucene是用Java编写的,因此它应该为您提供所需的接口。 如果您是一家Microsoft商店,那么您需要的大部分内容都内置于SQL Server中,并且可以启用通配符,这将使您能够进行部分单词匹配。 在Lucene和Lucene.Net中,您可以使用 wildcard matches
我相当肯定,单词两端的通配符搜索本质上是低效的。跳过列表有时被用来提高纯文本搜索的性能,但我认为在grep之类的工具中更可能找到这样的实现,而不是通用的文本索引工具。 对于您描述的问题,还有其他解决方案,其中一个单词可以拼写为两个,反之亦然。例如,Lucene支持模糊查询。正交和形态变体可以通过提供基于某种贝叶斯机制提供建议的过滤器来处理,也可以通过索引技巧来处理,即,获取频繁变体的语料库并用这些术语填充索引。我甚至看到了从填充到全文引擎中的结构化数据中获得的知识(例如,将城市名称和“酒店”一词添加到酒店表的记录中,以使“巴黎酒店”更有可能包含养老院Caisse des Dpts的记录)。虽然这不是一个小问题,在不破坏基于单词的搜索优势的情况下,它是可管理的。 |
2
4
我自己还没有这个具体的要求,但我的经验告诉我Lucene可以做到,尽管可能不是独立的。我肯定会通过Solr使用它,正如Michael Della Bitta在第一个答案中所描述的那样。他给出的链接是现场阅读,了解更多背景信息。 简单地说,Solr允许您定义自定义字段类型。它们由索引时间分析器和查询时间分析器组成。分析程序会找出如何处理文本,每个分析程序都由一个标记器和零到多个标记过滤器组成。标记器将文本分割成块,然后每个标记过滤器可以添加、减去或修改标记。 因此,该字段可以索引与原始文本完全不同的内容,必要时包括多个标记。因此,您需要的是原始文本的多标记副本,您可以通过发送Lucene类似于“my_ngram_field:sledge”的内容来查询它。不涉及通配符:-) 然后遵循与solrconfig.xml文件中提供的前缀搜索类似的模型:
EdgeNGramFilterFactory是如何为搜索框自动完成实现前缀匹配的。它接受来自前面阶段的标记(单个空格分隔的单词转换成小写),并将它们扇出到前缘的每个子字符串中。大锤=s、sl、sle、大锤、大锤、大锤、大锤等。 您需要遵循此模式,但将EdgeNGramFilterFactory替换为您自己的工厂,该工厂负责现场的所有NGrams。默认的org.apache.solr.analysis.NGramFilterFactory是一个很好的开始,但是它为拼写检查提供了字母转换。你可以复制它并去掉它——这是一个很容易实现的类。 一旦您使用自己的MyNGramFilterFactory拥有自己的字段类型(称为ngram_text),只需创建原始字段和ngram字段,如下所示:
然后告诉它将原始字段复制到奇特的字段中:
好的,现在当您搜索“title\n ngrams:sledge”时,您应该会得到包含此内容的文档列表。然后在查询的字段列表中,您只需告诉它检索名为title的字段,而不是字段title。 这应该是一个足够的轻推,让您可以把事情放在一起,并调整到惊人的性能水平相当容易。在以前的一份工作中,我们有一个数据库,其中包含超过1000万个具有大型HTML描述的产品,并设法让Lucene在一个中型服务器上以不到200毫秒的速度执行标准查询和拼写检查,该服务器同时处理几十个查询。当你有很多用户的时候,缓存就会起作用,让它尖叫起来!
祝你好运 |
3
3
http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html 如果不是,则“行业标准”为 http://www.sphinxsearch.com/ 关于使用InnoDB时应该做什么的一些想法: http://www.mysqlperformanceblog.com/2009/09/10/what-to-do-with-mysql-full-text-search-while-migrating-to-innodb/ 另外,这是一个介绍Sphinx和解释架构+用法的好演示 http://www.scribd.com/doc/2670976/Sphinx-High-Performance-Full-Text-Search-for-MySQL-Presentation
使现代化
|
4
3
我会使用ApacheSolr。索引策略是完全可调的(请参阅 http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters ),可以直接从数据库增量读取以填充索引(请参见同一wiki中的DataImportHandler),基本上可以从任何讲HTTP和XML或类似JSON的语言进行查询。 |
5
2
如何使用上面建议的工具(lucene等)进行全文索引,并进行类似的案例搜索,在这些案例中什么也找不到?(即,仅在全文索引搜索返回零结果后运行LIKE) |
6
2
编辑:
我曾经有过一个完全像这样的项目;各种材料的零件号。我们终于决定了
|
7
2
木瓦搜索可以做到这一点。 http://en.wikipedia.org/wiki/W-shingling
请注意,3个字符的shingle要求查询中的片段长度至少为5个字符,4个字符的shingle要求7个字符的查询,依此类推。 |
8
1
right here 另一个问题是,对于您的数据大小来说,它是否能够充分发挥作用。 |
9
0
我敢肯定Mysql提供了一个全文选项,而且可能还可以使用Lucene。 有关评论,请参见此处 |
10
0
使用部分单词的“真实”全文索引将比源文本大很多倍,虽然搜索速度可能更快,但任何更新或插入处理都将非常缓慢。
|
callum · 如何识别数组中与给定序列不匹配的元素? 1 年前 |
Sab · 输入为空时,搜索结果元素未隐藏 2 年前 |
Chaz Cosby · 如何添加更改api地址的搜索栏? 2 年前 |
user3669555 · 多维数组搜索部分单词或短语并移除键 6 年前 |
Yohan · 根据用户输入显示或隐藏div 6 年前 |
Shasocais · Prolog,基本情况失败的问题 6 年前 |
Den · C#在列表框中搜索项目1 6 年前 |
Eugene Barsky · Perl 6中多针的索引 6 年前 |