Skip to content

Commit

Permalink
OpenConceptLab/ocl_issues#1583 | optimizing/refactoring search queries
Browse files Browse the repository at this point in the history
  • Loading branch information
snyaggarwal committed Aug 24, 2023
1 parent 1a7c8b7 commit d8d20fd
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 33 deletions.
46 changes: 15 additions & 31 deletions core/common/search.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ def __init__(self, dsl_search):

@staticmethod
def get_wildcard_search_string(_str):
return f"{_str}*".replace('**', '*')
return f"{_str}*".replace(' ', '*').replace('**', '*')

@staticmethod
def get_search_string(search_str, lower=True, decode=True):
Expand All @@ -71,36 +71,23 @@ def get_fuzzy_match_criterion(search_str, fields, boost_divide_by=10, expansions
criterion = None
for attr, meta in fields.items():
criteria = CustomESSearch.fuzzy_criteria(search_str, attr, meta['boost'] / boost_divide_by, expansions)
if criterion is None:
criterion = criteria
else:
criterion |= criteria
criterion = criteria if criterion is None else criterion | criteria
return criterion

@staticmethod
def get_wildcard_match_criterion(search_str, fields):
def get_query(_str):
query = None
for attr, meta in fields.items():
decode = meta['decode'] if 'decode' in meta else True
lower = meta['lower'] if 'lower' in meta else True
_search_str = CustomESSearch.get_wildcard_search_string(
CustomESSearch.get_search_string(search_str, decode=decode, lower=lower)
)
criteria = CustomESSearch.get_wildcard_criteria(attr, _search_str, meta['boost'])
if query is None:
query = criteria
else:
query |= criteria
return query

if not search_str:
return get_query(search_str)
words = search_str.split()
criterion = get_query(words[0])
for word in words[1:]:
criterion |= get_query(word)

cls = CustomESSearch
criterion = None
code_fields = ['id', 'same_as_map_codes', 'other_map_codes']
_fields = {k: v for k, v in fields.items() if k not in code_fields} if ' ' in search_str else fields
for attr, meta in fields.items():
lower = meta['lower'] if 'lower' in meta else True
decode = meta['decode'] if 'decode' in meta else True
_search_str = cls.get_wildcard_search_string(
cls.get_search_string(search_str, decode=decode, lower=lower)
)
criteria = cls.get_wildcard_criteria(attr, _search_str, meta['boost'])
criterion = criteria if criterion is None else criterion | criteria
return criterion

@staticmethod
Expand All @@ -114,10 +101,7 @@ def get_exact_match_criterion(

for field, meta in match_word_fields_map.items():
criteria = CustomESSearch.get_match_criteria(field, search_str, meta['boost'])
if criterion is None:
criterion = criteria
criterion |= criteria

criterion = criteria if criterion is None else criterion | criteria
return criterion

@staticmethod
Expand Down
4 changes: 2 additions & 2 deletions core/concepts/documents.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ def get_exact_match_attrs():
'boost': 40
},
'name': {
'boost': 35
'boost': 15
},
'same_as_map_codes': {
'boost': 5.5,
Expand Down Expand Up @@ -98,7 +98,7 @@ def get_wildcard_search_attrs():
def get_fuzzy_search_attrs():
return {
'name': {
'boost': 23
'boost': 10
},
'synonyms': {
'boost': 0.3,
Expand Down

0 comments on commit d8d20fd

Please sign in to comment.