Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Python DSL

Python DSL

Slides for Honza's talk at Elastic{on}

Elasticsearch Inc

March 11, 2015
Tweet

More Decks by Elasticsearch Inc

Other Decks in Technology

Transcript

  1. { } Current State { "query": { "filtered": { "query":

    { "function_score": { "query": { "bool": { "must": [ {"multi_match": { "fields": ["title^10", "body"], "query": "php"}}, {"has_child": { "child_type": "answer", "query": {"match": {"body": "python"}}}} ], "must_not": [ {"multi_match": { "fields": ["title", "body"], "query": "python"}} ] } }, "field_value_factor": {"field": "rating"} } }, "filter": {"range": {"creation_date": {"from": "2010-01-01"}}} }}, 4 "highlight": { "fields": { "title": {"fragment_size" : 50}, "body": {"fragment_size" : 50} } }, "aggs": { "tags": { "terms": {"field": "tags"}, "aggs": { "comment_avg": { "avg": {"field": "comment_count"} } } }, "frequency": { "date_histogram": { "field": "creation_date", "interval": "month" } } } } JSON DSL
  2. { } Q shortcut {"has_child": { "child_type": "answer', "query": {"match":

    {"body": "python"}}}} Q({'has_child': { 'child_type': 'answer', 'query': {'match': {'body': 'python'}}}}) Q('has_child', child_type='answer', query=Q('match', body='python')) HasChild(child_type='answer', query=Match(body='python')) 9
  3. { } Query expressions Q(...) & Q(...) == Bool(must=[Q(...), Q(...)])

    Q(...) | Q(...) == Bool(should=[Q(...), Q(...)]) ~Q(...) == Bool(must_not=[Q(..)]) 10
  4. { } Migration path s = Search.from_dict(my_glorious_query) s = s.filter('term',

    tag='published') my_glorious_query = s.to_dict() 16 query at a time
  5. { } Response response = s.execute() for hit in response:

    print(hit.meta.score, hit.title) for tag in response.aggregations.tags.buckets: print(tag.key, tag.avg_comments.value) 17 No more brackets!
  6. { } Mapping DSL m = Mapping('article') m.field('published_from', Date()) m.field('title',

    String(fields={'raw': String(index='not_analyzed')})) m.field('comments', Nested()) m['comments'].property('author', String()) m.save('index-name') m.update_from_es('index-name') 19
  7. { } DocType class Article(DocType): title = String() created_date =

    Date() comments = Nested(properties={'author': String()}) class Meta: index = 'blog'
 def save(self, **kwargs): self.created_date = now() super().save(**kwargs) Article.init() Article.search()... Search(doc_type=Article) 20
  8. { } Connections connections.configure( default={'hosts': ['localhost'], 'sniff_on_start': True}, logging={ 'hosts':

    ['log1:9200', 'log2:9200'], 'timeout': 30, 'sniff_timeout': 120}) Search(using='logging') es = connections.get_connection() es.indices.delete(index='_all') 22
  9. { } FacetedSearch ? class MySiteSearch(FacetedSearch): doc_type = [Article, Comment]

    fields = ['title', 'body'] published = DateHistogram( interval='week', field='published_date') category = Term(field='category') 25 Definition ???
  10. { } FacetedSearch ? s = MySiteSearch('python', category='blog') for hit

    in s: print(h.meta.score, h.title) cat_facet = s.facets['category'] for name, count in cat_facet: mask = '%s: %d' if name == cat_facet.selected: mask = '<b>%s: %d</b>' print(mask % (name, count)) 26 Usage ????
  11. { } Django integration ? Model -> DocType signal handlers

    to update management command to sync FacetedSearch -> Form view + template pattern 27
  12. { } This work is licensed under the Creative Commons

    Attribution-NoDerivatives 4.0 International License. To view a copy of this license, visit: http://creativecommons.org/licenses/by-nd/4.0/ or send a letter to: Creative Commons PO Box 1866 Mountain View, CA 94042 USA CC-BY-ND 4.0 29