2011-01-06 8 views
5

Muszę wysłać zapytanie do tabeli w bazie danych SQLite, aby zwrócić wszystkie wiersze w tabeli pasujące do podanego zestawu słów.SQLite - jak zwracać wiersze zawierające pole tekstowe zawierające jeden lub więcej ciągów?

Aby być bardziej precyzyjnym: Posiadam bazę danych zawierającą ~ 80 000 rekordów. Jednym z pól jest pole tekstowe zawierające około 100-200 słów na rekord. Co mogę zrobić, to wziąć listę 200 pojedynczych słów kluczowych {"jabłko", "pomarańczowy", "gruszka", ...} i pobrać zestaw wszystkich rekordów w tabeli, które zawierają co najmniej jeden słów kluczowych w kolumnie opisu.

natychmiast oczywistym sposobem na to jest coś takiego:

SELECT stuff FROM table 
WHERE (description LIKE '% apple %') or (description LIKE '% orange %') or ... 

Jeśli mam 200 terminów, skończę z dużym i bolesnego patrząc SQL oświadczenie, że wydaje mi się być niezdarny, przypomina formę złej praktyki i nie jest zaskakujące, że zajmuje dużo czasu - więcej niż sekundę na 1000 rekordów.

Ta odpowiedź Better performance for SQLite Select Statement wydawało blisko tego, co trzeba, i wskutek utworzonego indeksu, ale według http://www.sqlite.org/optoverview.html SQLite nie używa żadnych optymalizacje jeżeli operator LIKE jest używany z rozpoczynającym% zamiennika.

Nie będąc ekspertem SQL, zakładam, że robię to w głupi sposób. Zastanawiałem się, czy ktoś z większym doświadczeniem może sugerować bardziej rozsądny i być może bardziej skuteczny sposób robienia tego?

Alternatywnie, czy istnieje lepsze podejście do problemu?

Odpowiedz

2

Korzystanie z byłoby szybsze niż zapytanie LIKE "% ...%". Nie sądzę, że istnieje baza danych, która może użyć indeksu dla zapytania rozpoczynającego się od%, tak jakby baza danych nie wiedziała, od czego zaczyna się zapytanie, a następnie nie może użyć indeksu do wyszukania go.

Alternatywnym podejściem jest umieszczanie słów kluczowych w oddzielnej tabeli, a następnie tworzenie tabeli pośredniej zawierającej informacje o tym, który wiersz w tabeli głównej zawiera wybrane słowa kluczowe. Jeśli w ten sposób zindeksowałeś wszystkie odpowiednie kolumny, można bardzo szybko zapytać.

+0

Dziękuję, dokładnie rozwiązuje problem. Spojrzałem na link i wygląda idealnie. – Sam

0

To jest ten sam problem, co wyszukiwanie pełnotekstowe, prawda? W takim przypadku potrzebujesz pomocy z DB, aby utworzyć indeksy w tych polach, jeśli chcesz to zrobić wydajnie. Szybkie wyszukiwanie pełnotekstowych zapytań SQLite this page.

Rozwiązanie, które poprawnie określasz jako niezdarne, prawdopodobnie spowoduje utworzenie do 200 dopasowań wyrażenia regularnego na dokument w najgorszym przypadku (np. Gdy dokument nie pasuje), gdzie każdy mecz musi przejść przez całe pole. Korzystanie z metody indeksowania oznacza, że ​​prędkość wyszukiwania będzie niezależna od wielkości każdego dokumentu.

+0

Dzięki za odpowiedź i dodatkowe informacje. – Sam

0

Wygląda na to, że warto rzucić okiem na Full Text Search. Został wniesiony do SQLite przez kogoś z google. Opis:

pozwala użytkownikowi skutecznie kwerendy bazy danych dla wszystkich wierszy zawierających jeden lub więcej słów (dalej „znaków”), nawet jeśli tabela zawiera wiele dużych dokumentów.

Powiązane problemy