async def search(self, q, index=None, doc_type=None, routing=None, preference=None, timeout=None, search_type=None, query_cache=None, terminate_after=None, scroll=None, **kwargs): params = clean_params( dict( { 'index': index, 'doc_type': doc_type, 'routing': routing, 'preference': preference, 'timeout': timeout, 'search_type': search_type, 'query_cache': query_cache, 'terminate_after': terminate_after, 'scroll': scroll, }, **kwargs)) raw_result = await self._client.search(body=q.to_dict(), **params) return SearchResult( raw_result, q._aggregations, doc_cls=q._get_doc_cls(), instance_mapper=q._instance_mapper, )
def test_attr_range_facet_filter__single_selected_filter(range_qf, compiler): sq = range_qf.apply(SearchQuery(), {'a8__gte': 2.71}) assert_search_query( sq, SearchQuery().aggs({ 'qf.attr_range.filter': agg.Filter(Range('attr.float', gte=0x8_402d70a4, lte=0x8_7f800000), aggs={ 'qf.attr_range': agg.Terms(script=Script( 'doc[params.field].value >>> 32', lang='painless', params={ 'field': 'attr.float', }), size=100) }), 'qf.attr_range:8': agg.Filter(Range('attr.float', gte=0x8_00000000, lte=0x8_ffffffff), ) }).post_filter(Range('attr.float', gte=0x8_402d70a4, lte=0x8_7f800000)), compiler) qf_res = range_qf.process_results( SearchResult( { 'aggregations': { 'qf.attr_range.filter': { 'doc_count': 32, 'qf.attr_range': { 'buckets': [{ 'key': 8, 'doc_count': 32 }, { 'key': 439, 'doc_count': 18 }] } }, 'qf.attr_range:8': { 'doc_count': 84 } } }, aggregations=sq.get_context().aggregations)) assert qf_res.attr_range.name == 'attr_range' assert qf_res.attr_range.alias == 'a' f = qf_res.attr_range.get_facet(8) assert f.attr_id == 8 assert f.count == 84 assert f.selected is True f = qf_res.attr_range.get_facet(439) assert f.attr_id == 439 assert f.count == 18 assert f.selected is False
def test_attr_bool_facet_filter__empty_params(bool_qf, compiler): sq = bool_qf.apply(SearchQuery(), {}) assert sq.to_dict(compiler=compiler) == (SearchQuery().aggs({ 'qf.attr_bool': agg.Terms(Field('attr.bool'), size=100) }).to_dict(compiler=compiler)) qf_res = bool_qf.process_result( SearchResult( { 'aggregations': { 'qf.attr_bool': { 'buckets': [{ 'key': 0b11, 'doc_count': 123, }, { 'key': 0b10, 'doc_count': 99 }, { 'key': 0b101, 'doc_count': 1 }] } } }, aggregations=sq.get_context().aggregations)) assert len(qf_res.attr_bool.facets) == 2 facet = qf_res.attr_bool.get_facet(1) assert len(facet.all_values) == 2 assert facet.all_values[0].value is True assert facet.all_values[0].count == 123 assert facet.all_values[0].count_text == '123' assert facet.all_values[0].selected is False assert facet.all_values[1].value is False assert facet.all_values[1].count == 99 assert facet.all_values[1].count_text == '99' assert facet.all_values[1].selected is False facet = qf_res.attr_bool.get_facet(2) assert len(facet.all_values) == 1 assert facet.all_values[0].value is True assert facet.all_values[0].count == 1 assert facet.all_values[0].count_text == '1' assert facet.all_values[0].selected is False
def test_attr_range_facet_filter__empty(range_qf, compiler): sq = range_qf.apply(SearchQuery(), {}) assert_search_query( sq, SearchQuery().aggs({ 'qf.attr_range': agg.Terms(script=Script('doc[params.field].value >>> 32', lang='painless', params={ 'field': 'attr.float', }), size=100), }), compiler) qf_res = range_qf.process_results( SearchResult( { 'aggregations': { 'qf.attr_range': { 'buckets': [{ 'key': '8', 'doc_count': 84 }, { 'key': '439', 'doc_count': 28 }] } } }, aggregations=sq.get_context().aggregations)) assert qf_res.attr_range.name == 'attr_range' assert qf_res.attr_range.alias == 'a' f = qf_res.attr_range.get_facet(8) assert f.attr_id == 8 assert f.count == 84 assert f.selected is False f = qf_res.attr_range.get_facet(439) assert f.attr_id == 439 assert f.count == 28 assert f.selected is False
def run(options): """Run benchmark.""" prof = cProfile.Profile() cov = coverage.Coverage() times = OrderedDict.fromkeys(['data_load', 'json_loads', 'searchResult']) start = time.monotonic() * 1000 raw_data = options.input.read() times['data_load'] = time.monotonic() * 1000 - start start = time.monotonic() * 1000 raw_results = json.loads(raw_data) times['json_loads'] = time.monotonic() * 1000 - start query = SearchQuery(MatchAll(), doc_cls=SimpleDocument) if 'aggregations' in raw_results: query = query.aggs(terms=Terms(SimpleDocument.integer_0)) gc.disable() if options.profile: cov.start() prof.enable() SearchResult(raw_results, query._aggregations, doc_cls=query._get_doc_cls(), instance_mapper=query._instance_mapper) times['searchResult'] = time.monotonic() * 1000 - start if options.profile: prof.disable() cov.stop() gc.enable() for key, duration in times.items(): print("Took {} {:10.3f}ms".format(key, duration)) if options.profile: prof.print_stats('cumulative') cov.report() cov.html_report()
def test_attr_range_facet_filter__multiple_selected_filters( range_qf, compiler): sq = range_qf.apply(SearchQuery(), {'a8__gte': 2.71, 'a99__lte': 3.14}) assert_search_query( sq, SearchQuery().aggs({ 'qf.attr_range.filter': agg.Filter( Bool.must( Range('attr.float', gte=0x8_402d70a4, lte=0x8_7f800000), Bool.should( Range('attr.float', gte=0x63_00000000, lte=0x63_4048f5c3), Range('attr.float', gte=0x63_80000000, lte=0x63_ff800000))), aggs={ 'qf.attr_range': agg.Terms(script=Script('doc[params.field].value >>> 32', lang='painless', params={ 'field': 'attr.float', }), size=100) }), 'qf.attr_range:8': agg.Filter( Bool.must( Bool.should( Range('attr.float', gte=0x63_00000000, lte=0x63_4048f5c3), Range('attr.float', gte=0x63_80000000, lte=0x63_ff800000)), Range('attr.float', gte=0x8_00000000, lte=0x8_ffffffff))), 'qf.attr_range:99': agg.Filter( Bool.must( Range('attr.float', gte=0x8_402d70a4, lte=0x8_7f800000), Range('attr.float', gte=0x63_00000000, lte=0x63_ffffffff))), }).post_filter(Range('attr.float', gte=0x8_402d70a4, lte=0x8_7f800000)).post_filter( Bool.should( Range('attr.float', gte=0x63_00000000, lte=0x63_4048f5c3), Range('attr.float', gte=0x63_80000000, lte=0x63_ff800000))), compiler) qf_res = range_qf.process_results( SearchResult( { 'aggregations': { 'qf.attr_range.filter': { 'doc_count': 32, 'qf.attr_range': { 'buckets': [{ 'key': 8, 'doc_count': 32 }, { 'key': 99, 'doc_count': 18 }] } }, 'qf.attr_range:8': { 'doc_count': 84 }, 'qf.attr_range:99': { 'doc_count': 33 } } }, aggregations=sq.get_context().aggregations)) assert qf_res.attr_range.name == 'attr_range' assert qf_res.attr_range.alias == 'a' f = qf_res.attr_range.get_facet(8) assert f.attr_id == 8 assert f.count == 84 assert f.selected is True f = qf_res.attr_range.get_facet(99) assert f.attr_id == 99 assert f.count == 33 assert f.selected is True
def test_attr_bool_facet_filter__multiple_selected_values(bool_qf, compiler): sq = bool_qf.apply(SearchQuery(), {'a1': ['true', 'false'], 'a2': 'true'}) assert sq.to_dict(compiler=compiler) == (SearchQuery().aggs({ 'qf.attr_bool.filter': agg.Filter( Bool.must( Terms('attr.bool', [0b11, 0b10]), Term('attr.bool', 0b101), ), aggs={'qf.attr_bool': agg.Terms(Field('attr.bool'), size=100)}), 'qf.attr_bool.filter:1': agg.Filter(Term('attr.bool', 0b101), aggs={ 'qf.attr_bool:1': agg.Terms(Field('attr.bool'), size=2, include=[0b10, 0b11]) }), 'qf.attr_bool.filter:2': agg.Filter(Terms('attr.bool', [0b11, 0b10]), aggs={ 'qf.attr_bool:2': agg.Terms(Field('attr.bool'), size=2, include=[0b100, 0b101]) }), }).post_filter( Bool.must( Terms('attr.bool', [0b11, 0b10]), Term('attr.bool', 0b101), )).to_dict(compiler=compiler)) qf_res = bool_qf.process_result( SearchResult( { 'aggregations': { 'qf.attr_bool.filter': { 'doc_count': 200, 'qf.attr_bool': { 'buckets': [ { 'key': 0b11, 'doc_count': 123, }, { 'key': 0b101, 'doc_count': 1 }, ] } }, 'qf.attr_bool.filter:1': { 'doc_count': 163, 'qf.attr_bool:1': { 'buckets': [ { 'key': 0b11, 'doc_count': 123, }, { 'key': 0b10, 'doc_count': 99 }, ] } }, 'qf.attr_bool.filter:2': { 'doc_count': 144, 'qf.attr_bool:2': { 'buckets': [ { 'key': 0b101, 'doc_count': 1 }, ] } }, } }, aggregations=sq.get_context().aggregations)) assert len(qf_res.attr_bool.facets) == 2 facet = qf_res.attr_bool.get_facet(1) assert len(facet.all_values) == 2 assert len(facet.selected_values) == 2 assert len(facet.values) == 0 assert facet.all_values[0] is facet.selected_values[0] assert facet.all_values[1] is facet.selected_values[1] assert facet.all_values[0].value is True assert facet.all_values[0].count == 123 assert facet.all_values[0].count_text == '123' assert facet.all_values[0].selected is True assert facet.all_values[1].value is False assert facet.all_values[1].count == 99 assert facet.all_values[1].count_text == '99' assert facet.all_values[1].selected is True facet = qf_res.attr_bool.get_facet(2) assert len(facet.all_values) == 1 assert len(facet.selected_values) == 1 assert len(facet.values) == 0 assert facet.all_values[0] is facet.selected_values[0] assert facet.all_values[0].value is True assert facet.all_values[0].count == 1 assert facet.all_values[0].count_text == '1' assert facet.all_values[0].selected is True