Como é chamado quando você pesquisa no meio de uma string em vez do começo?

19

Estou tentando aprimorar meu vocabulário para me comunicar melhor com meus colegas desenvolvedores. Temos vários lugares no site em que estamos debatendo se devemos procurar uma string desde o início ou 'running%'em qualquer lugar da string '%running%.

Eu chamo a pesquisa do meio de "difusa", que percebo incorreta, pois difusa significa alterar a forma da palavra "executar", "executar" [sic], "runed" [sic].

Qual é a terminologia correta para pesquisar no início de uma string e pesquisar no meio de uma string?

danielson317
fonte
1
Eu trabalhei em locais que usavam "Começa com" vs "Contém" para diferenciar essas duas opções.
Solomon Rutzky 4/17/17

Respostas:

24

Ele é chamado de "padrão de pesquisa não ancorado" e se parece com isso no SQL.

foo LIKE '%bar%'

Se você não tiver um %dos dois lados, diz-se que o padrão de pesquisa é ancorado no início ou no final da sequência, respectivamente. Este jargão vem do mundo regex.

foo LIKE 'bar%'

Você diria "o padrão de pesquisa bar%ancorado no início da string ".

Para comparação, um PCRE é ancorado com ^ou $tokens e parece com ^barou bar$. Os PCREs requerem ancoragem explícita com tokens, enquanto as LIKEinstruções SQL são implicitamente ancoradas e exigem explícito %para criar um "padrão de pesquisa não ancorado" .

Como uma observação lateral, você pode indexar esses tipos de expressões com trigramas usando algo como pg_trgmno PostgreSQL

Evan Carroll
fonte
1

A primeira coisa que me vem à mente é " intransigível ". A pesquisa de uma sequência específica, ou a primeira parte de uma sequência, em um campo indexado permite procurar. Se a sua pesquisa começar com um curinga, o RDBMS terá que varrer o índice inteiro, pois os valores que atendem ao seu predicado de pesquisa podem aparecer em qualquer lugar do conjunto de valores.

Considere procurar em uma lista telefônica (se você tiver idade suficiente para se lembrar daquelas ...). Você pode encontrar facilmente as pessoas cujo sobrenome começa com "Dan": você aperta o dedo para os Ds, avança para os DAs e os DAN-algo estão todos juntos. Se você quiser encontrar pessoas com sobrenome, inclua a string "ANIEL", precisará ler todas as páginas (verifique a tabela).

Jon de todos os comércios
fonte
2
"O RDBMS terá que verificar o índice inteiro", isso não é verdade. postgresql.org/docs/9.6/static/pgtrgm.html
Evan Carroll
Eu acho que não pode ser discutido um termo mais geral do que o que está sendo procurado aqui, pois abrange vários outros casos (pesquisando o resultado de uma função executada em uma coluna, por exemplo).
David Spillett
0

Não é realmente sua pergunta, mas seu exemplo de impreciso é impreciso.

  • Difuso é o oposto de nítido, binário , o que significa que você pode ter uma porcentagem de correspondência, por exemplo, uma pesquisa difusa por 'run'precisão 0,5 inclui 'ran', 'rud' e muitas outras palavras. O SQL não suporta pesquisa difusa, você precisa de sistemas adicionais como o Lucene.
  • Uma pesquisa de caracteres curinga'run%' sempre incluirá 'runing' e 'runed', e você pode distinguir o que começa e o contém ( '%run%'para incluir o 'outrunning'), como sugere Solomon Rutzky
  • No entanto, se você quiser encontrar palavras inteiras , por exemplo, em blocos de texto, será necessário indicar o espaço em branco anterior ou posterior ' run '(ou ' run% 'incluir correspondências parciais como 'bla bla runing bla' e 'bla runed bla bla').
Damian Vogel
fonte