当您搜索字符串的中间而不是开头时,这叫什么?


19

我正在努力提高词汇量,以更好地与开发人员交流。我们在站点中有几个地方要辩论,是否应该从头开始搜索字符串,而不是字符串中的'running%'任何位置'%running%

我一直称中间搜索为“模糊”,我意识到这是不正确的,因为模糊意味着更改单词“运行”,“运行” [sic],“运行” [sic]的形式。

搜索字符串开头和字符串中间的正确术语是什么?


1
我曾在使用“开头为”与“包含”来区分这两个选项的地方工作。
所罗门·鲁兹基

Answers:


24

它称为“非锚定搜索模式”,在SQL中看起来像这样。

foo LIKE '%bar%'

如果您%在任一侧都缺少a ,则可以说搜索模式分别锚定到字符串的开头或结尾。这行话来自regex世界。

foo LIKE 'bar%'

您会说,“搜索模式bar%固定在字符串的开头 ”。

为了进行比较,PCRE用^$标记锚定,看起来像^barbar$。PCRE需要使用令牌进行显式锚定,而SQL LIKE语句是隐式进行锚定,并且需要显式%创建“非锚定搜索模式”

附带说明一下,您可以使用类似PostgreSQL中的内容,用三字母索引这些类型的表达式pg_trgm


1

我想到的第一件事是“无法精打细算”。在索引字段中搜索特定的字符串或字符串的第一部分,使您可以查找。如果搜索以通配符开头,则RDBMS将必须扫描整个索引,因为满足搜索谓词的值可能会出现在值集中。

考虑查看电话簿(如果您的年龄足以记住那些...)。您可以轻松地找到姓氏以“ Dan:”开头的人,然后您将手指指向Ds,然后再转到DAs,这样DAN便会组合在一起。如果要查找姓氏包括字符串“ ANIEL”的人,则必须阅读每页(扫描表格)。


2
事实并非如此,“ RDBMS将必须扫描整个索引”。postgresql.org/docs/9.6/static/pgtrgm.html
Evan Carroll

我认为unargable可能是一个比此处查找的术语更笼统的术语,因为它涵盖了许多其他情况(例如,搜索在列上执行的函数的结果)。
David Spillett

0

这不是您真正的问题,但是您的模糊示例并不精确。

  • 模糊与尖锐的,二进制的相反,意味着您可以有一定百分比的匹配项,例如,'run'以0.5精度进行的模糊搜索将包括“ ran”,“ rud”和许多其他单词。SQL不支持模糊搜索,你需要像Lucene的其他系统。
  • 一个通配符搜索将用于'run%'将始终包括“乳宁”和“符文”,并可以区分开始包含'%run%'包括“脱空”)作为@ 所罗门Rutzky建议
  • 但是,如果要查找整个单词(例如在文本块中),则需要指示其前导或尾随空格' run '(或' run% '包括部分匹配项,例如“ bla bla runing bla”和“ bla runed bla bla”)。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.