+ def search_perfect_book(self, searched, max_results=20, fuzzy=False):
+ qrys = [self.make_phrase(self.get_tokens(searched, field=fld), field=fld, fuzzy=fuzzy) for fld in ['author', 'title']]
+
+ books = []
+ for q in qrys:
+ top = self.searcher.search(q, max_results)
+ for found in top.scoreDocs:
+ books.append(SearchResult(self.searcher, found))
+ return books
+
+ def search_perfect_parts(self, searched, max_results=20, fuzzy=False):
+ qrys = [self.make_phrase(self.get_tokens(searched), field=fld, fuzzy=fuzzy) for fld in ['content']]
+
+ books = []
+ for q in qrys:
+ top = self.searcher.search(q, max_results)
+ for found in top.scoreDocs:
+ books.append(SearchResult(self.searcher, found).add_snippets(self.get_snippets(found, q)))
+
+ return books
+
+ def search_everywhere(self, searched, max_results=20, fuzzy=False):
+ books = []
+
+ # content only query : themes x content
+ q = BooleanQuery()
+
+ tokens = self.get_tokens(searched)
+ q.add(BooleanClause(self.make_term_query(tokens, field='themes', fuzzy=fuzzy), BooleanClause.Occur.MUST))
+ q.add(BooleanClause(self.make_term_query(tokens, field='content', fuzzy=fuzzy), BooleanClause.Occur.SHOULD))
+
+ topDocs = self.searcher.search(q, max_results)
+ for found in topDocs.scoreDocs:
+ books.append(SearchResult(self.searcher, found))
+
+ # joined query themes/content x author/title/epochs/genres/kinds
+ q = BooleanQuery()
+ in_meta = BooleanQuery()
+ in_content = BooleanQuery()
+
+ for fld in ['themes', 'content']:
+ in_content.add(BooleanClause(self.make_term_query(tokens, field=fld, fuzzy=False), BooleanClause.Occur.SHOULD))
+
+ in_meta.add(BooleanClause(self.make_term_query(
+ self.get_tokens(searched, field='author'), field='author', fuzzy=fuzzy), BooleanClause.Occur.SHOULD))
+
+ for fld in ['title', 'epochs', 'genres', 'kinds']:
+ in_meta.add(BooleanClause(self.make_term_query(tokens, field=fld, fuzzy=fuzzy), BooleanClause.Occur.SHOULD))
+
+ q.add(BooleanClause(in_meta, BooleanClause.Occur.MUST))
+ in_content_join = self.content_query(in_content)
+ q.add(BooleanClause(in_content_join, BooleanClause.Occur.MUST))
+ # import pdb; pdb.set_trace()
+ collector = BlockJoinCollector(Sort.RELEVANCE, 100, True, True)
+
+ self.searcher.search(q, collector)
+
+ top_groups = collector.getTopGroups(in_content_join, Sort.RELEVANCE, 0, max_results, 0, True)
+ if top_groups:
+ for grp in top_groups.groups:
+ for part in grp.scoreDocs:
+ books.append(SearchResult(self.searcher, part, score=grp.maxScore))
+ return books
+
+ def multisearch(self, query, max_results=50):