Beispiel #1
0
def search_files():
    keyword = request.GET.get("w")
    if len(keyword) > 0:
        keyword = keyword.strip()

    s = Search(os.getcwd(), keyword.decode("utf-8"), ("*.markdown", "*.md"))
    result = s.walk()

    result = [x for x in result if x.items is not None]
    newresult = []
    for x in result:
        x = SearchResult(x.fullpath[len(os.getcwd()) : len(x.fullpath)], x.items)
        x.name = extract_file_title_by_fullurl(x.fullpath)

        newresult.append(x)

    return dict(results=newresult, keyword=keyword, request=request, is_logined=is_logined())
Beispiel #2
0
def search_files():
    keyword = request.GET.get('w')
    if len(keyword) > 0:
        keyword = keyword.strip()

    s = Search(os.getcwd(), keyword.decode("utf-8"), ("*.markdown", "*.md"))
    result = s.walk()

    result = [x for x in result if x.items is not None]
    newresult = []
    for x in result:
        x = SearchResult(x.fullpath[len(os.getcwd()):len(x.fullpath)], x.items)
        x.name = extract_file_title_by_fullurl(x.fullpath)

        newresult.append(x)

    return dict(results=newresult, keyword=keyword, request=request)
Beispiel #3
0
 def test_search_perfect_parts(self):
     books = self.search.search_perfect_parts("Jakoż hamować")
     assert len(books) == 2
     for b in books:
         b.book_id == self.book.id
     a = SearchResult.aggregate(books)
     # just one fragment hit.
     assert len(filter(lambda x: x[1], a[0].hits)) == 1
     print a[0].process_hits()
Beispiel #4
0
def main(request):
    results = {}

    results = None
    query = None

    query = request.GET.get('q', '')

    if len(query) < 2:
        return render_to_response('catalogue/search_too_short.html',
                                  {'prefix': query},
                                  context_instance=RequestContext(request))

    query = remove_query_syntax_chars(query)

    search = Search()

    theme_terms = search.index.analyze(text=query, field="themes_pl") \
        + search.index.analyze(text=query, field="themes")

    # change hints
    tags = search.hint_tags(query, pdcounter=True, prefix=False)
    tags = split_tags(tags)

    author_results = search.search_phrase(query, 'authors', book=True)
    translator_results = search.search_phrase(query, 'translators', book=True)

    title_results = search.search_phrase(query, 'title', book=True)

    # Boost main author/title results with mixed search, and save some of its results for end of list.
    # boost author, title results
    author_title_mixed = search.search_some(
        query, ['authors', 'translators', 'title', 'tags'],
        query_terms=theme_terms)
    author_title_rest = []

    for b in author_title_mixed:
        also_in_mixed = filter(
            lambda ba: ba.book_id == b.book_id,
            author_results + translator_results + title_results)
        for b2 in also_in_mixed:
            b2.boost *= 1.1
        if also_in_mixed is []:
            author_title_rest.append(b)

    # Do a phrase search but a term search as well - this can give us better snippets then search_everywhere,
    # Because the query is using only one field.
    text_phrase = SearchResult.aggregate(
        search.search_phrase(query, 'text', snippets=True, book=False),
        search.search_some(query, ['text'],
                           snippets=True,
                           book=False,
                           query_terms=theme_terms))

    everywhere = search.search_everywhere(query, query_terms=theme_terms)

    def already_found(results):
        def f(e):
            for r in results:
                if e.book_id == r.book_id:
                    e.boost = 0.9
                    results.append(e)
                    return True
            return False

        return f

    f = already_found(author_results + translator_results + title_results +
                      text_phrase)
    everywhere = filter(lambda x: not f(x), everywhere)

    author_results = SearchResult.aggregate(author_results)
    translator_results = SearchResult.aggregate(translator_results)
    title_results = SearchResult.aggregate(title_results)

    everywhere = SearchResult.aggregate(everywhere, author_title_rest)

    for field, res in [('authors', author_results),
                       ('translators', translator_results),
                       ('title', title_results), ('text', text_phrase),
                       ('text', everywhere)]:
        res.sort(reverse=True)
        for r in res:
            search.get_snippets(r, query, field, 3)

    suggestion = u''

    def ensure_exists(r):
        try:
            return r.book
        except Book.DoesNotExist:
            return False

    author_results = filter(ensure_exists, author_results)
    translator_results = filter(ensure_exists, translator_results)
    title_results = filter(ensure_exists, title_results)
    text_phrase = filter(ensure_exists, text_phrase)
    everywhere = filter(ensure_exists, everywhere)

    results = author_results + translator_results + title_results + text_phrase + everywhere
    # ensure books do exists & sort them
    for res in (author_results, translator_results, title_results, text_phrase,
                everywhere):
        res.sort(reverse=True)

    # We don't want to redirect to book text, but rather display result page even with one result.
    # if len(results) == 1:
    #     fragment_hits = filter(lambda h: 'fragment' in h, results[0].hits)
    #     if len(fragment_hits) == 1:
    #         #anchor = fragment_hits[0]['fragment']
    #         #frag = Fragment.objects.get(anchor=anchor)
    #         return HttpResponseRedirect(fragment_hits[0]['fragment'].get_absolute_url())
    #     return HttpResponseRedirect(results[0].book.get_absolute_url())
    if len(results) == 0:
        form = PublishingSuggestForm(initial={"books": query + ", "})
        return render_to_response('catalogue/search_no_hits.html', {
            'tags': tags,
            'prefix': query,
            "form": form,
            'did_you_mean': suggestion
        },
                                  context_instance=RequestContext(request))

    return render_to_response('catalogue/search_multiple_hits.html', {
        'tags': tags,
        'prefix': query,
        'results': {
            'author': author_results,
            'translator': translator_results,
            'title': title_results,
            'content': text_phrase,
            'other': everywhere
        },
        'did_you_mean': suggestion
    },
                              context_instance=RequestContext(request))
Beispiel #5
0
def search(sql_query):
    query_words = sql_query.split()
    and_set = None
    or_set = set()

    for word in query_words:
        champions = Champion.query.filter(
            Champion.name.like("%"+word+"%") | 
            Champion.title.like("%"+word+"%") | 
            Champion.id.like("%"+word+"%") | 
            Champion.hp.like("%"+word+"%") |  
            Champion.mp.like("%"+word+"%") |  
            Champion.movespeed.like("%"+word+"%") |  
            Champion.spellblock.like("%"+word+"%")).all()

        champion_searchresults = [SearchResult("champion", c.id, c) for c in champions]
        
        summoners = Summoner.query.filter(
            Summoner.name.like("%"+word+"%") | 
            Summoner.id.like("%"+word+"%") | 
            Summoner.lp.like("%"+word+"%") | 
            Summoner.win_percentage.like("%"+word+"%") | 
            Summoner.total_games.like("%"+word+"%")).all()

        summoner_searchresults = [SearchResult("summoner", s.id, s) for s in summoners]

        teams = Team.query.filter(
            Team.name.like("%"+word+"%") | 
            Team.id.like("%"+word+"%") | 
            Team.tag.like("%"+word+"%") | 
            Team.win_percentage.like("%"+word+"%") | 
            Team.total_games.like("%"+word+"%") | 
            Team.status.like("%"+word+"%")).all()
        
        team_searchresults = [SearchResult("team", t.id, t) for t in teams]

        iteration_set = set(champion_searchresults) | set(summoner_searchresults) | set(team_searchresults)
     
        if and_set == None:
            and_set = iteration_set

        or_set = or_set | iteration_set
        and_set = and_set & iteration_set
        
    and_list = list(and_set)
    or_list = [s.copy() for s in list(or_set)]

    # Get context
    
    for word in query_words:
        for i, r in enumerate(and_list):
            for variable, value in r.obj.__dict__.items():
                if (not variable.startswith("_") and
                    word.lower() in str(value).lower()):
                    and_list[i].context.add(str(variable) + ": " + str(value))
                    
 
        for i, r in enumerate(or_list):
            for variable, value in r.obj.__dict__.items():
                if (not variable.startswith("_") and
                    word.lower() in str(value).lower()):
                    or_list[i].context.add(str(variable) + ": " + str(value))


    return jsonify({"and_set": [s.to_json() for s in and_list],
                    "or_set":  [s.to_json() for s in or_list]})
def main(request):
    results = {}

    results = None
    query = None

    query = request.GET.get('q', '')

    if len(query) < 2:
        return render_to_response('catalogue/search_too_short.html',
                                  {'prefix': query},
            context_instance=RequestContext(request))

    query = remove_query_syntax_chars(query)
    
    search = Search()

    theme_terms = search.index.analyze(text=query, field="themes_pl") \
        + search.index.analyze(text=query, field="themes")

            # change hints
    tags = search.hint_tags(query, pdcounter=True, prefix=False)
    tags = split_tags(tags)

    author_results = search.search_phrase(query, 'authors', book=True)
    translator_results = search.search_phrase(query, 'translators', book=True)

    title_results = search.search_phrase(query, 'title', book=True)

    # Boost main author/title results with mixed search, and save some of its results for end of list.
    # boost author, title results
    author_title_mixed = search.search_some(query, ['authors', 'translators', 'title', 'tags'], query_terms=theme_terms)
    author_title_rest = []

    for b in author_title_mixed:
        also_in_mixed = filter(lambda ba: ba.book_id == b.book_id, author_results + translator_results + title_results)
        for b2 in also_in_mixed:
            b2.boost *= 1.1
        if also_in_mixed is []:
            author_title_rest.append(b)

    # Do a phrase search but a term search as well - this can give us better snippets then search_everywhere,
    # Because the query is using only one field.
    text_phrase = SearchResult.aggregate(
        search.search_phrase(query, 'text', snippets=True, book=False),
        search.search_some(query, ['text'], snippets=True, book=False, query_terms=theme_terms))

    everywhere = search.search_everywhere(query, query_terms=theme_terms)

    def already_found(results):
        def f(e):
            for r in results:
                if e.book_id == r.book_id:
                    e.boost = 0.9
                    results.append(e)
                    return True
            return False
        return f
    f = already_found(author_results + translator_results + title_results + text_phrase)
    everywhere = filter(lambda x: not f(x), everywhere)

    author_results = SearchResult.aggregate(author_results)
    translator_results = SearchResult.aggregate(translator_results)
    title_results = SearchResult.aggregate(title_results)

    everywhere = SearchResult.aggregate(everywhere, author_title_rest)

    for field, res in [('authors', author_results),
                       ('translators', translator_results),
                       ('title', title_results),
                       ('text', text_phrase),
                       ('text', everywhere)]:
        res.sort(reverse=True)
        for r in res:
            search.get_snippets(r, query, field, 3)

    suggestion = u''

    def ensure_exists(r):
        try:
            return r.book
        except Book.DoesNotExist:
            return False

    author_results = filter(ensure_exists, author_results)
    translator_results = filter(ensure_exists, translator_results)
    title_results = filter(ensure_exists, title_results)
    text_phrase = filter(ensure_exists, text_phrase)
    everywhere = filter(ensure_exists, everywhere)

    results = author_results + translator_results + title_results + text_phrase + everywhere
    # ensure books do exists & sort them
    for res in (author_results, translator_results, title_results, text_phrase, everywhere):
        res.sort(reverse=True)

    # We don't want to redirect to book text, but rather display result page even with one result.
    # if len(results) == 1:
    #     fragment_hits = filter(lambda h: 'fragment' in h, results[0].hits)
    #     if len(fragment_hits) == 1:
    #         #anchor = fragment_hits[0]['fragment']
    #         #frag = Fragment.objects.get(anchor=anchor)
    #         return HttpResponseRedirect(fragment_hits[0]['fragment'].get_absolute_url())
    #     return HttpResponseRedirect(results[0].book.get_absolute_url())
    if len(results) == 0:
        form = PublishingSuggestForm(initial={"books": query + ", "})
        return render_to_response('catalogue/search_no_hits.html',
                                  {'tags': tags,
                                   'prefix': query,
                                   "form": form,
                                   'did_you_mean': suggestion},
            context_instance=RequestContext(request))

    return render_to_response('catalogue/search_multiple_hits.html',
                              {'tags': tags,
                               'prefix': query,
                               'results': {'author': author_results,
                                           'translator': translator_results,
                                           'title': title_results,
                                           'content': text_phrase,
                                           'other': everywhere},
                               'did_you_mean': suggestion},
        context_instance=RequestContext(request))
Beispiel #7
0
def main(request):
    results = {}
    JVM.attachCurrentThread()  # where to put this?

    results = None
    query = None
    fuzzy = False #0.8

    query = request.GET.get('q','')
    # book_id = request.GET.get('book', None)
    # book = None
    # if book_id is not None:
    #     book = get_object_or_404(Book, id=book_id)

    # hint = search.hint()
    # try:
    #     tag_list = Tag.get_tag_list(tags)
    # except:
    #     tag_list = []

    if len(query) < 2:
        return render_to_response('catalogue/search_too_short.html', {'prefix': query},
                                  context_instance=RequestContext(request))

    search = get_search()
    # hint.tags(tag_list)
    # if book:
    #     hint.books(book)
    tags = search.hint_tags(query, pdcounter=True, prefix=False, fuzzy=fuzzy)
    tags = split_tags(tags)

    toks = StringReader(query)
    tokens_cache = {}

    author_results = search.search_phrase(toks, 'authors', fuzzy=fuzzy, tokens_cache=tokens_cache)
    title_results = search.search_phrase(toks, 'title', fuzzy=fuzzy, tokens_cache=tokens_cache)

    # Boost main author/title results with mixed search, and save some of its results for end of list.
    # boost author, title results
    author_title_mixed = search.search_some(toks, ['authors', 'title', 'tags'], fuzzy=fuzzy, tokens_cache=tokens_cache)
    author_title_rest = []
    for b in author_title_mixed:
        bks = filter(lambda ba: ba.book_id == b.book_id, author_results + title_results)
        for b2 in bks:
            b2.boost *= 1.1
        if bks is []:
            author_title_rest.append(b)

    # Do a phrase search but a term search as well - this can give us better snippets then search_everywhere,
    # Because the query is using only one field.
    text_phrase = SearchResult.aggregate(
        search.search_phrase(toks, 'content', fuzzy=fuzzy, tokens_cache=tokens_cache, snippets=True, book=False, slop=4),
        search.search_some(toks, ['content'], tokens_cache=tokens_cache, snippets=True, book=False))

    everywhere = search.search_everywhere(toks, fuzzy=fuzzy, tokens_cache=tokens_cache)

    def already_found(results):
        def f(e):
            for r in results:
                if e.book_id == r.book_id:
                    e.boost = 0.9
                    results.append(e)
                    return True
            return False
        return f
    f = already_found(author_results + title_results + text_phrase)
    everywhere = filter(lambda x: not f(x), everywhere)

    author_results = SearchResult.aggregate(author_results)
    title_results = SearchResult.aggregate(title_results)

    everywhere = SearchResult.aggregate(everywhere, author_title_rest)

    for res in [author_results, title_results, text_phrase, everywhere]:
        res.sort(reverse=True)
        for r in res:
            for h in r.hits:
                h['snippets'] = map(lambda s:
                                    re.subn(r"(^[ \t\n]+|[ \t\n]+$)", u"",
                                            re.subn(r"[ \t\n]*\n[ \t\n]*", u"\n", s)[0])[0], h['snippets'])

    suggestion = did_you_mean(query, search.get_tokens(toks, field="SIMPLE"))

    def ensure_exists(r):
        try:
            return r.book
        except Book.DoesNotExist:
            return False

    author_results = filter(ensure_exists, author_results)
    title_results = filter(ensure_exists, title_results)
    text_phrase = filter(ensure_exists, text_phrase)
    everywhere = filter(ensure_exists, everywhere)

    results = author_results + title_results + text_phrase + everywhere
    # ensure books do exists & sort them
    results.sort(reverse=True)

    if len(results) == 1:
        fragment_hits = filter(lambda h: 'fragment' in h, results[0].hits)
        if len(fragment_hits) == 1:
            #anchor = fragment_hits[0]['fragment']
            #frag = Fragment.objects.get(anchor=anchor)
            return HttpResponseRedirect(fragment_hits[0]['fragment'].get_absolute_url())
        return HttpResponseRedirect(results[0].book.get_absolute_url())
    elif len(results) == 0:
        form = PublishingSuggestForm(initial={"books": query + ", "})
        return render_to_response('catalogue/search_no_hits.html',
                                  {'tags': tags,
                                   'prefix': query,
                                   "form": form,
                                   'did_you_mean': suggestion},
            context_instance=RequestContext(request))

    return render_to_response('catalogue/search_multiple_hits.html',
                              {'tags': tags,
                               'prefix': query,
                               'results': { 'author': author_results,
                                            'title': title_results,
                                            'content': text_phrase,
                                            'other': everywhere},
                               'did_you_mean': suggestion},
        context_instance=RequestContext(request))
Beispiel #8
0
        }})

    cherrypy.tree.mount(
        DeleteShoppingCart(), '/api/deleteshoppingCart',
        {'/': {
            'request.dispatch': cherrypy.dispatch.MethodDispatcher()
        }})

    cherrypy.tree.mount(
        AddShoppingCart(), '/api/addshoppingCart',
        {'/': {
            'request.dispatch': cherrypy.dispatch.MethodDispatcher()
        }})

    cherrypy.tree.mount(
        SearchResult(), '/api/search',
        {'/': {
            'request.dispatch': cherrypy.dispatch.MethodDispatcher()
        }})

    cherrypy.tree.mount(
        AllBooks(), '/api/allBooks',
        {'/': {
            'request.dispatch': cherrypy.dispatch.MethodDispatcher()
        }})

    cherrypy.tree.mount(
        Tickets(), '/api/tickets',
        {'/': {
            'request.dispatch': cherrypy.dispatch.MethodDispatcher()
        }})
Beispiel #9
0
 def reply_markup_from_result(result: SearchResult):
     reply_markup = KeyboardFactory.inline_keyboard_markup(
         buttons=[ButtonFactory.inline_request_button(result)])
     if not result.requestable():
         return None
     return reply_markup
Beispiel #10
0
 def inline_request_button(result: SearchResult):
     return telegram.InlineKeyboardButton(
         text=Strings.Requests.REQUEST_ACTION,
         callback_data=json.dumps(result.callback_data()),
     )