Skip to content

Commit 3bab5df

Browse files
hybrid bm25/ELSER search (#134)
1 parent b64c7ce commit 3bab5df

File tree

2 files changed

+63
-16
lines changed

2 files changed

+63
-16
lines changed

example-apps/search-tutorial/v3/search-tutorial/app.py

Lines changed: 50 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,22 +17,58 @@ def handle_search():
1717
filters, parsed_query = extract_filters(query)
1818
from_ = request.form.get('from_', type=int, default=0)
1919

20-
results = es.search(
21-
query={
22-
'bool': {
23-
'must': [
24-
{
25-
'text_expansion': {
26-
'elser_embedding': {
27-
'model_id': '.elser_model_2',
28-
'model_text': parsed_query,
29-
}
30-
},
20+
if parsed_query:
21+
search_query = {
22+
'sub_searches': [
23+
{
24+
'query': {
25+
'bool': {
26+
'must': {
27+
'multi_match': {
28+
'query': parsed_query,
29+
'fields': ['name', 'summary', 'content'],
30+
}
31+
},
32+
**filters
33+
}
3134
}
32-
],
33-
**filters,
35+
},
36+
{
37+
'query': {
38+
'bool': {
39+
'must': [
40+
{
41+
'text_expansion': {
42+
'elser_embedding': {
43+
'model_id': '.elser_model_2',
44+
'model_text': parsed_query,
45+
}
46+
},
47+
}
48+
],
49+
**filters,
50+
}
51+
},
52+
},
53+
],
54+
'rank': {
55+
'rrf': {}
56+
},
57+
}
58+
else:
59+
search_query = {
60+
'query': {
61+
'bool': {
62+
'must': {
63+
'match_all': {}
64+
},
65+
**filters
66+
}
3467
}
35-
},
68+
}
69+
70+
results = es.search(
71+
**search_query,
3672
size=5,
3773
from_=from_,
3874
)

example-apps/search-tutorial/v3/search-tutorial/search.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,18 @@ def reindex(self):
6666
return self.insert_documents(documents)
6767

6868
def search(self, **query_args):
69-
return self.es.search(index='my_documents', **query_args)
69+
# sub_searches is not currently supported in the client, so we send
70+
# search requests as raw requests
71+
if 'from_' in query_args:
72+
query_args['from'] = query_args['from_']
73+
del query_args['from_']
74+
return self.es.perform_request(
75+
'GET',
76+
f'/my_documents/_search',
77+
body=json.dumps(query_args),
78+
headers={'Content-Type': 'application/json',
79+
'Accept': 'application/json'},
80+
)
7081

7182
def retrieve_document(self, id):
7283
return self.es.get(index='my_documents', id=id)
@@ -75,7 +86,7 @@ def deploy_elser(self):
7586
# download ELSER v2
7687
self.es.ml.put_trained_model(model_id='.elser_model_2',
7788
input={'field_names': ['text_field']})
78-
89+
7990
# wait until ready
8091
while True:
8192
status = self.es.ml.get_trained_models(model_id='.elser_model_2',

0 commit comments

Comments
 (0)