Estou tentando aprimorar meu vocabulário para me comunicar melhor com meus colegas desenvolvedores. Temos vários lugares no site onde estamos debatendo se devemos procurar uma string desde o início ou 'running%'
em qualquer lugar da string '%running%
.
Eu tenho chamado a pesquisa do meio de "fuzzy" , o que percebo que está incorreto, pois fuzzy significa mudar a forma da palavra "run", "runing" [sic], "runed" [sic].
Qual é a terminologia correta para pesquisar no início de uma string e pesquisar no meio de uma string?
É chamado de "padrão de pesquisa não ancorado" e se parece com isso no SQL.
Se você não tiver um
%
em ambos os lados, diz-se que o padrão de pesquisa é ancorado no início ou no final da string, respectivamente. Esta linguagem vem do mundo regex.Você diria "o padrão de pesquisa
bar%
ancorado no início da string ".Para comparação, um PCRE é ancorado com
^
ou$
tokens e se parece com^bar
oubar$
. Os PCREs requerem ancoragem explícita com tokens, enquanto as instruções SQLLIKE
são ancoradas implicitamente e requerem explícito%
para criar um "padrão de pesquisa não ancorado" .Como uma nota lateral, você pode indexar esses tipos de expressões com trigramas usando algo como
pg_trgm
no PostgreSQLA primeira coisa que me vem à mente é "un -Sargable ". Procurar uma string específica, ou a primeira parte de uma string, em um campo indexado permite que você procure. Se sua pesquisa começar com um curinga, o RDBMS terá que varrer todo o índice, porque os valores que atendem ao seu predicado de pesquisa podem aparecer em qualquer lugar no conjunto de valores.
Considere procurar em uma lista telefônica (se você tiver idade suficiente para se lembrar disso...). Você pode facilmente encontrar pessoas cujos sobrenomes começam com "Dan:" você manuseia os Ds, avança para os DAs, e os DAN-alguma coisa estarão todos juntos. Se você quisesse encontrar pessoas cujos sobrenomes incluem a string "ANIEL", você teria que ler todas as páginas (digitalizar a tabela).
Não é realmente sua pergunta, mas seu exemplo de fuzzy é impreciso.
'run'
com precisão .5 incluirá 'ran', 'rud' e muitas outras palavras. SQL não suporta pesquisa difusa, você precisa de sistemas adicionais como o Lucene.'run%'
sempre incluirá 'runing' e 'runed', e você pode distinguir o começo com e contém ('%run%'
para incluir 'outrunning') como @ Solomon Rutzky sugere' run '
(ou' run% '
incluir correspondências parciais como 'bla bla runing bla' e 'bla runed bla bla').