- return [SearchResult(self, found, searched=searched, tokens_cache=tokens_cache,
- snippets=(snippets and self.get_snippets(found, query) or None)) for found in top.scoreDocs]
-
- def search_perfect_book(self, searched, max_results=20, fuzzy=False, hint=None):
- """
- Search for perfect book matches. Just see if the query matches with some author or title,
- taking hints into account.
- """
- fields_to_search = ['authors', 'title']
- only_in = None
- if hint:
- if not hint.should_search_for_book():
- return []
- fields_to_search = hint.just_search_in(fields_to_search)
- only_in = hint.book_filter()
-
- qrys = [self.make_phrase(self.get_tokens(searched, field=fld), field=fld, fuzzy=fuzzy) for fld in fields_to_search]
-
- books = []
- for q in qrys:
- top = self.searcher.search(q,
- self.chain_filters([only_in, self.term_filter(Term('is_book', 'true'))]),
- max_results)
- for found in top.scoreDocs:
- books.append(SearchResult(self, found, how_found="search_perfect_book"))
- return books
-
- def search_book(self, searched, max_results=20, fuzzy=False, hint=None):
- fields_to_search = ['tags', 'authors', 'title']
-
- only_in = None
- if hint:
- if not hint.should_search_for_book():
- return []
- fields_to_search = hint.just_search_in(fields_to_search)
- only_in = hint.book_filter()
-
- tokens = self.get_tokens(searched, field='SIMPLE')
-
- q = BooleanQuery()
-
- for fld in fields_to_search:
- q.add(BooleanClause(self.make_term_query(tokens, field=fld,
- fuzzy=fuzzy), BooleanClause.Occur.SHOULD))
-
- books = []
- top = self.searcher.search(q,
- self.chain_filters([only_in, self.term_filter(Term('is_book', 'true'))]),
- max_results)
- for found in top.scoreDocs:
- books.append(SearchResult(self, found, how_found="search_book"))
-
- return books
-
- def search_perfect_parts(self, searched, max_results=20, fuzzy=False, hint=None):
- """
- Search for book parts which contains a phrase perfectly matching (with a slop of 2, default for make_phrase())
- some part/fragment of the book.
- """
- qrys = [self.make_phrase(self.get_tokens(searched), field=fld, fuzzy=fuzzy) for fld in ['content']]
-
- flt = None
- if hint:
- flt = hint.part_filter()
-
- books = []
- for q in qrys:
- top = self.searcher.search(q,
- self.chain_filters([self.term_filter(Term('is_book', 'true'), inverse=True),
- flt]),
- max_results)
- for found in top.scoreDocs:
- books.append(SearchResult(self, found, snippets=self.get_snippets(found, q), how_found='search_perfect_parts'))
-
- return books
-
- def search_everywhere(self, searched, max_results=20, fuzzy=False, hint=None, tokens_cache=None):