Search search search

Post on 21-Jan-2018

388 views 0 download

Transcript of Search search search

Search, Search, Search

Andy Dai andydai@gliacloud.com

ElasticSearch

Distributed Search Engine

• Open Source

• Distributed

• Document-based

• JSON over HTTP

Who Use ElasticSearch

Example. GitHub

Document Based

• JSON

• Dynamic Schema

RDBMS v.s ElasticSearch

DATABASE

INDEX

TABLE

TYPE

ROW

DOCUMENT

COLUMN

FIELD

Create a document

PUT /taipeipy/user/1 { "first_name" : "John", "last_name" : "Smith", "age" : 25, "about": "I love programming", "interests": [ "django", "python" ] }

index type id

Query a documentGET /taipeipy/user/1

Do some simple search

GET /taipeipy/user/_search

GET /taipeipy/user/_search?q=last_name:Smith

Search with DSL

GET /taipeipy/user/_search { “query”: { “match”: { “last_name”: “smith” } } }

Search with DSLGET /taipeipy/user/_search { "query" : { "filtered" : { "filter" : { "range" : { "age" : { "gt" : 30 } } }, "query" : { "match" : { "last_name" : "smith" } } } } }

Full Text Search

GET /taipeipy/user/_search { “query”: { “match”: { “about”: “love programming” } } }

Use Python to interact with ElasticSearch

• REST API

• elasticsearch-py

• elasticsearch-dsl-py

elasticsearch-py

• Low-level

• dict to json

from elasticsearch import Elasticsearch es = Elasticsearch() result = es.search(body={ 'query': { 'match': { 'last_name': 'smith' } } })

from elasticsearch_dsl import Search s = Search(using=es) result = s.query( 'match', last_name='smith').execute()

ElasticSearch-DSL

ElasticSearch-DSL

• Say no to {}

• High Level API

• Combined query

Design

from elasticsearch_dsl import Search, Q s = Search(using=es) result = s.query( Q(‘match', last_name=‘smith’) & \ Q(‘match', first_name=‘John’) ).execute()

Query

• Q(‘match’, title=‘python’) == Match(title=‘python’)

• Q(‘match’, title=‘python’) == Q({‘match’, {‘title’: ‘python’})

• Boolean operator &, |

Store Datafrom elasticsearch_dsl import DocType, String

class PostDoc(DocType): title = String() content = String()

class Meta: index = 'blog'

PostDoc.init() doc = PostDoc(title=‘test’, content=‘content’) doc.save()

DEMO

Reference

• https://www.elastic.co

• http://elasticsearch-dsl.readthedocs.org

• Another option - http://haystacksearch.org