Example #1
0
def search(term: str,
           count: int,
           artist_name="",
           min_rating=0) -> List[SearchResult]:
    client = Elasticsearch()
    client.transport.connection_pool.connection.headers.update(HEADERS)
    context = False
    s = Search(using=client, index=INDEX_NAME, doc_type=DOC_TYPE)
    print(("t", term, artist_name, min_rating))

    if "*" in term:
        print("Wild card used")
        query = {"wildcard": {"track_name_si": term}}
        docs = s.query(query)[:count].execute()
        return [SearchResult.from_doc(d) for d in docs]

    if "ජනප්‍රියම" in term or "හොඳම" in term:
        print("Top result search executed")
        top_k = [int(s) for s in term.split() if s.isdigit()][0]
        query = search_top_songs()
        docs = s.query(query).sort("ranking")[:top_k].execute()

        return [SearchResult.from_doc(d) for d in docs]

    if "අහන සින්දු" in term or "කියන සින්දු" in term:
        if "දුක" in term:
            query = situational_query("sad")
        elif "යාලුවො" in term:
            query = situational_query("friends")
        else:
            query = situational_query("")

        docs = s.query(query)[:count].execute()
        return [SearchResult.from_doc(d) for d in docs]

    if "ගැන" in term or "පිළිබඳ" in term:
        context = True

    term = clean_search(term)
    query = create_query(term, min_rating, artist_name, context=context)
    docs = s.query(query)[:count].execute()

    if len(docs) < 3 and artist_name == '':
        query = create_query(term, min_rating, artist_name, fuzzy=True)
        docs = s.query(query)[:count].execute()
    #
    if len(docs) < 3 and artist_name != "" and term == "":
        print("Artist search executed")
        query = search_artist(artist_name)
        docs = s.query(query)[:count].execute()

    print("Final query: ", query)
    return [SearchResult.from_doc(d) for d in docs]