aboutsummaryrefslogtreecommitdiffstats
path: root/python/fatcat/search.py
blob: 959bb85ff8d56eeffc819e49518e50b1409bbd1d (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,
            "fields": ["title^5", "contrib_names^2", "container_title"]
            }
        },
        "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()
    print(content)
    results = [h['_source'] for h in content['hits']['hits']]
    for h in results:
        # Ensure 'contrib_names' is a list, not a single string
        if type(h['contrib_names']) is not list:
            h['contrib_names'] = [h['contrib_names'], ]

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