def search(request): # 'qa' is search term from "advanced search form" search_term = request.GET.get('q') or request.GET.get('qa') tags_list = request.GET.getlist('tag') tags_op = request.GET.get('tags_op') folder_id = request.GET.get('folder', None) folder = None descendant_ids = [] backend = get_search_backend() results_folders = backend.search(search_term, Folder) results_docs = backend.search(search_term, Page) if folder_id: try: folder = BaseTreeNode.objects.get(id=folder_id) except BaseTreeNode.DoesNotExist: pass if folder: descendant_ids = [node.id for node in folder.get_descendants()] if results_docs: qs_docs = BaseTreeNode.objects.filter( id__in=[p.document.basetreenode_ptr_id for p in results_docs]) elif search_term: qs_docs = BaseTreeNode.objects.none() else: qs_docs = BaseTreeNode.objects.all() if descendant_ids: qs_docs = qs_docs.filter(id__in=descendant_ids) if tags_list: # all tags if tags_op == 'any': qs_docs = qs_docs.filter(tags__name__in=tags_list).distinct() else: # tags_op == all for tag in tags_list: qs_docs = qs_docs.filter(tags__name__in=[tag]).distinct() nodes_perms = request.user.get_perms_dict(qs_docs, Access.ALL_PERMS) qs_docs = [ node for node in qs_docs.prefetch_related('tags') if nodes_perms[node.id].get(Access.PERM_READ, False) ] # filter out all documents for which current user # does not has read access return render( request, "admin/search.html", { 'results_docs': qs_docs, 'results_folders': results_folders.results(), 'search_term': search_term, 'tags_list': tags_list, 'folder': folder, 'tags_op': tags_op })
def search(request): search_term = request.GET.get('q') backend = get_search_backend() results_folders = backend.search(search_term, Folder) results_docs = backend.search(search_term, Page) qs_docs = BaseTreeNode.objects.filter( id__in=[ p.document.basetreenode_ptr_id for p in results_docs ] ) qs_docs = [ node for node in qs_docs.all() if request.user.has_perm(Access.PERM_READ, node) ] # filter out all documents for which current user # does not has read access return render( request, "admin/search.html", { 'results_docs': qs_docs, 'results_folders': results_folders.results(), 'search_term': search_term } )
def test_search_is_not_case_sensitive(self): """ UT to double check that search by default is NOT case sensitive """ backend = get_search_backend() doc = Document.create_document( title="document_c", file_name="document_c.pdf", size='1212', lang='DEU', user=self.user, page_count=5, ) p = doc.pages.first() p.text = "search for TESTX text" p.save() result = backend.search("TESTX", Page) # it matches exact case self.assertEqual(result.count(), 1) result_case_insensitive_match = backend.search("testX", Page) # it matches lower and upper case mix self.assertEqual(result_case_insensitive_match.count(), 1) # no match for tst no_match = backend.search("tst", Page) self.assertEqual(no_match.count(), 0)
def remove_object(instance): indexed_instance = get_indexed_instance(instance, check_exists=False) if indexed_instance: backend = get_search_backend() try: backend.delete(indexed_instance) except Exception: # Catch and log all errors logger.exception( "Exception while deleting %r from the '%s' search backend", indexed_instance, backend)
def insert_or_update_object(instance): indexed_instance = get_indexed_instance(instance) if indexed_instance: backend = get_search_backend() try: backend.add(indexed_instance) except Exception: # Catch and log all errors logger.exception( "Exception while adding %r into the '%s' search backend", indexed_instance, backend)
def search(request): search_term = request.GET.get('q') backend = get_search_backend() results_folders = backend.search(search_term, Folder) results_docs = backend.search(search_term, Page) qs_docs = BaseTreeNode.objects.filter( id__in=[p.document.basetreenode_ptr_id for p in results_docs]) return render( request, "admin/search.html", { 'results_docs': qs_docs.all(), 'results_folders': results_folders.results(), 'search_term': search_term })
def autocomplete( self, query, fields=None, operator=None, order_by_relevance=True, ): """ This runs an autocomplete query on all the items in the QuerySet """ search_backend = get_search_backend() return search_backend.autocomplete( query, self, fields=fields, operator=operator, order_by_relevance=order_by_relevance )
def search( self, query, fields=None, operator=None, order_by_relevance=True, partial_match=True, ): """ This runs a search query on all the items in the QuerySet """ search_backend = get_search_backend() return search_backend.search( query, self, fields=fields, operator=operator, order_by_relevance=order_by_relevance, partial_match=partial_match )
def get_qs_from_raw_sql(self, request, search_term): backend = get_search_backend() parent_id = request.GET.get('parent_id', False) ocr_lang = request.user.preferences['ocr__OCR_Language'] ocr_lang = ocr_lang.lower() if parent_id: descendent_ids = [ str(desc.id) for desc in models.BaseTreeNode.objects.get_queryset_descendants( models.BaseTreeNode.objects.filter(id=parent_id)) ] else: descendent_ids = [] results = backend.search(search_term, models.Page) qs = models.BaseTreeNode.objects.filter( id__in=[p.document.basetreenode_ptr_id for p in results]) return qs
def test_search_backend(self): backend = get_search_backend() backend.search("Great doc!", Document)