aboutsummaryrefslogtreecommitdiffstats
path: root/python/fatcat/search.py
blob: 7ed7a99c3092f6d0660a322958bd0a108256527b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49

import requests
from flask import abort
from fatcat import app


def do_search(q, limit=20):

    print("Search hit: " + q)
    if limit > 100:
        # Sanity check
        limit = 100

    search_request = {
        "query": {
            "query_string": {
                "query": q,
                "analyzer": "textIcuSearch",
                "default_operator": "AND",
                "analyze_wildcard": True,
                "lenient": True,
                "auto_generate_phrase_queries": True,
                "default_field": "_all",
            },
        },
        "size": int(limit),
    }

    resp = requests.get("%s/%s/_search" %
            (app.config['ELASTIC_BACKEND'], app.config['ELASTIC_INDEX']),
        json=search_request)

    if resp.status_code != 200:
        print("elasticsearch non-200 status code: " + str(resp.status_code))
        print(resp.content)
        abort(resp.status_code)

    content = resp.json()
    results = [h['_source'] for h in content['hits']['hits']]
    for h in results:
        # Ensure 'authors' is a list, not a single string
        if type(h['authors']) is not list:
            h['authors'] = [h['authors'], ]

    found = content['hits']['total']
    return {"query": { "q": q },
            "count_returned": len(results),
            "count_found": found,
            "results": results }