示例#1
0
 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,
     )
示例#2
0
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
示例#3
0
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
示例#4
0
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
示例#5
0
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()
示例#6
0
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
示例#7
0
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