Skip to content

Instantly share code, notes, and snippets.

@kaedroho
Last active January 8, 2019 01:04
Show Gist options
  • Save kaedroho/96c605acaa9ef992b7d297a69f0be46d to your computer and use it in GitHub Desktop.
Save kaedroho/96c605acaa9ef992b7d297a69f0be46d to your computer and use it in GitHub Desktop.
from wagtail.wagtailsearch.backends.elasticsearch import ElasticsearchSearchBackend, ElasticsearchSearchQuery
class ElasticSearchQueryWithFuzziness(ElasticsearchSearchQuery):
def get_inner_query(self):
if self.query_string is not None:
fields = self.fields or ['_all', '_partials']
if len(fields) == 1:
query = {
'match': {
fields[0]: {
'query': self.query_string,
'operator': self.operator,
'fuzziness': 'AUTO',
}
}
}
else:
query = {
'multi_match': {
'query': self.query_string,
'fields': fields,
'operator': self.operator,
'fuzziness': 'AUTO',
}
}
else:
query = {
'match_all': {}
}
return query
class CustomElasticSearch(ElasticsearchSearchBackend):
search_query_class = ElasticSearchQueryWithFuzziness
SearchBackend = CustomElasticSearch
@mihow
Copy link

mihow commented Jan 8, 2019

Here's a version that works with Wagtail 2.4 & Elasticsearch6. I have only tested this briefly.

from wagtail.search.backends.elasticsearch6 import Elasticsearch6SearchBackend, Elasticsearch6SearchQueryCompiler


class ElasticSearchQueryWithFuzziness(Elasticsearch6SearchQueryCompiler):
    def _compile_plaintext_query(self, query, fields, boost=1.0):
        match_query = {
            'query': query.query_string,
            'fuzziness': 'AUTO',
        }

        if query.operator != 'or':
            match_query['operator'] = query.operator

        if boost != 1.0:
            match_query['boost'] = boost

        if len(fields) == 1:
            return {
                'match': {
                    fields[0]: match_query
                }
            }
        else:
            match_query['fields'] = fields

            return {
                'multi_match': match_query
            }


class CustomSearchBackend(Elasticsearch6SearchBackend):
    query_compiler_class = ElasticSearchQueryWithFuzziness


SearchBackend = CustomSearchBackend

or perhaps alternatively:

class ElasticSearchQueryWithFuzziness(Elasticsearch6SearchQueryCompiler):
    def _compile_plaintext_query(self, *args, **kwargs):
        query = super()._compile_plaintext_query(*args, **kwargs)
        query_type = list(query.keys())[0]
        query[query_type]['fuzziness'] = 'AUTO'
        return query

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment