ArchiveBox/archivebox/search/__init__.py

55 lines
1.6 KiB
Python
Raw Normal View History

from typing import List, Union, Generator
2020-11-17 23:42:57 +00:00
from pathlib import Path
from importlib import import_module
2020-11-17 23:42:57 +00:00
from archivebox.index.schema import Link
from archivebox.util import enforce_types
2020-11-19 13:06:13 +00:00
from archivebox.config import setup_django, OUTPUT_DIR, USE_INDEXING_BACKEND, USE_SEARCHING_BACKEND, SEARCH_BACKEND_ENGINE
2020-11-17 23:42:57 +00:00
def indexing_enabled():
2020-11-19 13:06:13 +00:00
return USE_INDEXING_BACKEND
2020-11-17 23:42:57 +00:00
def search_backend_enabled():
2020-11-19 13:06:13 +00:00
return USE_SEARCHING_BACKEND
2020-11-17 23:42:57 +00:00
def get_backend():
2020-11-19 13:06:13 +00:00
return f'search.backends.{SEARCH_BACKEND_ENGINE}'
2020-11-17 23:42:57 +00:00
def import_backend():
backend_string = get_backend()
try:
backend = import_module(backend_string)
except Exception as err:
raise Exception("Could not load '%s' as a backend: %s" % (backend_string, err))
return backend
2020-11-17 23:42:57 +00:00
@enforce_types
def write_search_index(link: Link, texts: Union[List[str], None]=None, out_dir: Path=OUTPUT_DIR, skip_text_index: bool=False) -> None:
if not indexing_enabled():
return
2020-11-17 23:42:57 +00:00
if not skip_text_index and texts:
setup_django(out_dir, check_db=True)
from core.models import Snapshot
2020-11-17 23:42:57 +00:00
snap = Snapshot.objects.filter(url=link.url).first()
backend = import_backend()
2020-11-17 23:42:57 +00:00
if snap:
backend.index(snapshot_id=str(snap.id), texts=texts)
@enforce_types
def query_search_index(text: str) -> List[str]:
if search_backend_enabled():
backend = import_backend()
return backend.search(text)
else:
return []
@enforce_types
def flush_search_index(snapshot_ids: Generator[str, None, None]):
if not indexing_enabled() or not snapshot_ids:
return
backend = import_backend()
backend.flush(snapshot_ids)