-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathsearcher.py
82 lines (71 loc) · 2.63 KB
/
searcher.py
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import logging
class Searcher(object):
""" Class for retrieving Elasticsearch documents
:param es: Elasticsearch instance
:param index: Elasticsearch index name
:param fields: query fields
if fields=None retrieve all results from index
:param top_k: Elasticsearch top-k results.
if top_k=None retrieve all results; else retrieve top-k results
"""
def __init__(self, es, index, fields=None, top_k=None):
self.es = es
self.index = index
self.fields = fields
self.top_k = top_k
self.total_hits = 0
self.max_score = 0
self.results = []
def query(self, query_string):
""" Query ES index and retrive documents
:param query_string: query string
:return: ES results
"""
try:
response = None
if self.fields is None or self.top_k is None:
response = self.es.search(
index=self.index,
body={
"query": {
"multi_match": {
"query": query_string
}
}
}
)
else:
response = self.es.search(
index=self.index,
body={
"size": self.top_k,
"query": {
"multi_match": {
"query": query_string,
"fields": self.fields
}
}
}
)
hits = response['hits']['hits']
max_score = response['hits']['max_score']
total_hits = response['hits']['total']['value']
results = []
for hit in hits:
score = hit['_score']
norm_score = score / max_score
question = hit['_source']['question']
answer = hit['_source']['answer']
question_answer = hit['_source']['question_answer']
results.append(
{
"score": norm_score, "question": question,
"answer": answer, "question_answer": question_answer
}
)
self.results = results
self.max_score = max_score
self.total_hits = total_hits
except Exception:
logging.error('exception occured', exc_info=True)
return self.results