Jak się nazywa, gdy przeszukujesz środek ciągu zamiast początku?

19

Próbuję dopracować swoje słownictwo, aby lepiej komunikować się z innymi programistami. Mamy kilka miejsc na stronie, w których debatujemy, czy powinniśmy wyszukać ciąg od początku, 'running%'a nie gdziekolwiek w ciągu '%running%.

Nazwałam środkowe wyszukiwanie „rozmytym”, które zdaję sobie sprawę, że jest niepoprawne, ponieważ rozmyte oznacza zmianę formy słowa „biegać”, „biegać” [sic], „biegać” [sic].

Jaka jest prawidłowa terminologia wyszukiwania początku łańcucha i przeszukiwania jego środka?

danielson317
źródło
1
Pracowałem w miejscach, w których użyłem opcji „Zaczyna się od” a „Zawiera”, aby rozróżnić te dwie opcje.
Solomon Rutzky

Odpowiedzi:

24

Nazywa się to „nie zakotwiczonym wzorcem wyszukiwania” i wygląda tak w SQL.

foo LIKE '%bar%'

Jeśli brakuje jednej %lub drugiej strony, mówi się, że wzór wyszukiwania zakotwicza odpowiednio na początku lub na końcu łańcucha. Ten żargon pochodzi ze świata wyrażeń regularnych.

foo LIKE 'bar%'

Powiedziałbyś: „wzorzec wyszukiwania bar%zakotwiczony na początku ciągu ”.

Dla porównania, PCRE jest zakotwiczony z ^lub $tokenami i wygląda jak ^barlub bar$. PCRE wymagają jawnego zakotwiczenia za pomocą tokenów, natomiast LIKEinstrukcje SQL są niejawnie zakotwiczone i wymagają jawnego zakotwiczenia w %celu utworzenia „wzorca wyszukiwania bez zakotwiczenia” .

Na marginesie możesz indeksować tego rodzaju wyrażenia za pomocą trygramów, używając czegoś takiego jak pg_trgmw PostgreSQL

Evan Carroll
źródło
1

Pierwszą rzeczą, jaka przychodzi mi na myśl, jest „ niewymienny ”. Wyszukiwanie określonego ciągu lub pierwszej części ciągu w polu indeksowanym umożliwia wyszukiwanie. Jeśli wyszukiwanie zaczyna się od znaku wieloznacznego, RDBMS będzie musiał przeskanować cały indeks, ponieważ wartości spełniające predykat wyszukiwania mogą pojawić się w dowolnym miejscu w zestawie wartości.

Zastanów się, czy nie zajrzeć do książki telefonicznej (jeśli jesteś wystarczająco dorosły, aby je zapamiętać ...). Możesz łatwo znaleźć ludzi, których nazwiska zaczynają się od „Dan:”, kciuka do D, odwracania do DA, a DAN-coś będzie razem. Jeśli chcesz znaleźć osoby, których nazwiska zawierają ciąg „ANIEL”, musisz przeczytać każdą stronę (zeskanować tabelę).

Jon of All Trades
źródło
2
„RDBMS będzie musiał zeskanować cały indeks”, co nie jest prawdą. postgresql.org/docs/9.6/static/pgtrgm.html
Evan Carroll
Myślę, że nieargumentowany może być bardziej ogólny termin, niż jest tutaj szukany, ponieważ obejmuje wiele innych przypadków (na przykład wyszukiwanie wyniku funkcji wykonanej w kolumnie).
David Spillett
0

To nie jest tak naprawdę twoje pytanie, ale twój przykład rozmytych jest nieprecyzyjny.

  • Rozmyte jest przeciwieństwem ostrego, binarnego , co oznacza, że ​​możesz mieć procent dopasowania, na przykład rozmyte wyszukiwanie z 'run'dokładnością .5 będzie zawierać „bieg”, „rud” i wiele innych słów. SQL nie obsługuje wyszukiwania rozmytego, potrzebujesz dodatkowych systemów, takich jak Lucene.
  • Wieloznacznych wyszukiwania będą na 'run%'zawsze będzie zawierać „runiczny” i „runed” i można odróżnić zaczyna i zawiera ( '%run%'w celu włączenia „outrunning”) jako @ Salomon Rutzky sugeruje
  • Jeśli jednak chcesz znaleźć całe słowa , na przykład w blokach tekstowych, musisz wskazać poprzedzające lub końcowe białe znaki ' run '(lub ' run% 'dołączyć dopasowania częściowe, takie jak „bla bla runing bla” i „bla runed bla bla”).
Damian Vogel
źródło