def append_null_search_filters(self, value, node, query, request): """ Appends the search query dsl to search for fields that have not been populated """ base_query = Bool() base_query.filter(Terms(field="graph_id", terms=[str(node.graph_id)])) null_query = Bool() data_exists_query = Exists(field="tiles.data.%s" % (str(node.pk))) nested_query = Nested(path="tiles", query=data_exists_query) null_query.must(nested_query) if value["op"] == "null": # search for tiles that don't exist exists_query = Bool() exists_query.must_not(null_query) base_query.should(exists_query) # search for tiles that do exist, but that have null or [] as values func_query = Dsl() func_query.dsl = { "function_score": { "min_score": 1, "query": {"match_all": {}}, "functions": [ { "script_score": { "script": { "source": """ int null_docs = 0; for(tile in params._source.tiles){ if(tile.data.containsKey(params.node_id)){ def val = tile.data.get(params.node_id); if (val == null || (val instanceof List && val.length==0)) { null_docs++; break; } } } return null_docs; """, "lang": "painless", "params": {"node_id": "%s" % (str(node.pk))}, } } } ], "score_mode": "max", "boost": 1, "boost_mode": "replace", } } base_query.should(func_query) elif value["op"] == "not_null": base_query.must(null_query) query.must(base_query)
def append_search_filters(self, value, node, query, request): try: if value["val"] != "": match_query = Match(field="tiles.data.%s" % (str(node.pk)), type="phrase", query=value["val"]) if "!" in value["op"]: query.must_not(match_query) query.filter(Exists(field="tiles.data.%s" % (str(node.pk)))) else: query.must(match_query) except KeyError as e: pass
def append_search_filters(self, value, node, query, request): try: if value['val'] != '': match_query = Match(field='tiles.data.%s' % (str(node.pk)), type="phrase", query=value['val'], fuzziness=0) if '!' in value['op']: query.must_not(match_query) query.filter(Exists(field="tiles.data.%s" % (str(node.pk)))) else: query.must(match_query) except KeyError, e: pass
def append_null_search_filters(self, value, node, query, request): """ Appends the search query dsl to search for fields that haven't been populated """ base_query = Bool() null_query = Bool() data_exists_query = Exists(field="tiles.data.%s" % (str(node.pk))) nested_query = Nested(path="tiles", query=data_exists_query) null_query.must(nested_query) base_query.filter(Terms(field="graph_id", terms=[str(node.graph_id)])) if value["op"] == "null": base_query.must_not(null_query) elif value["op"] == "not_null": base_query.must(null_query) query.must(base_query)
def append_search_filters(self, value, node, query, request): # Match the label in the same manner as a String datatype try: if value["val"] != "": match_type = "phrase_prefix" if "~" in value["op"] else "phrase" if "~" in value["op"]: match_query = Match( field="tiles.data.%s.url" % (str(node.pk)), query=value["val"], type=match_type, ) if "=" in value["op"]: match_query = Term(field="tiles.data.%s.url.keyword" % (str(node.pk)), term=value["val"]) if "!" in value["op"]: query.must_not(match_query) query.filter(Exists(field="tiles.data.%s" % (str(node.pk)))) else: query.must(match_query) except KeyError as e: pass