使用 https://github.com/taowen/es-monitor 能夠用 SQL 進行 elasticsearch 的查詢。本章介紹簡單的文檔過濾條件html
SQLgit
$ cat << EOF | ./es_query.py http://127.0.0.1:9200 select * from symbol where exchange='nyse' limit 1 EOF
{"sector": "n/a", "_type": "symbol", "market_cap": 4469064, "name": "3D Systems Corporation", "exchange": "nyse", "symbol": "DDD", "last_sale": 807, "_index": "symbol", "ipo_year": null, "_id": "AVLqbUjEQ3iIyyVFLQgV", "industry": "Technology"}
Elasticsearchgithub
{ "query": { "term": { "exchange": "nyse" } }, "size": 1 }
{ "hits": { "hits": [ { "_score": 1.728313, "_type": "symbol", "_id": "AVLqbUjEQ3iIyyVFLQgV", "_source": { "sector": "n/a", "market_cap": 4469064, "name": "3D Systems Corporation", "exchange": "nyse", "symbol": "DDD", "last_sale": 807, "ipo_year": null, "industry": "Technology" }, "_index": "symbol" } ], "total": 3240, "max_score": 1.728313 }, "_shards": { "successful": 1, "failed": 0, "total": 1 }, "took": 6, "timed_out": false }
Profilesql
[ { "query": [ { "query_type": "TermQuery", "lucene": "exchange:nyse", "time": "2.336230000ms", "breakdown": { "score": 470159, "create_weight": 417360, "next_doc": 786055, "match": 0, "build_scorer": 662656, "advance": 0 } } ], "rewrite_time": 3566, "collector": [ { "name": "SimpleTopScoreDocCollector", "reason": "search_top_hits", "time": "1.561495000ms" } ] } ]
SQLjson
$ cat << EOF | ./es_query.py http://127.0.0.1:9200 select * from symbol where exchange='nyse' and sector='Technology' limit 1 EOF
{"sector": "Technology", "_type": "symbol", "market_cap": 4469064, "name": "3D Systems Corporation", "exchange": "nyse", "symbol": "DDD", "last_sale": 807, "_index": "symbol", "ipo_year": null, "_id": "AVLqdtWhQ3iIyyVFLSJQ", "industry": "Computer Software: Prepackaged Software"}
Elasticsearchapi
{ "query": { "bool": { "filter": [ { "term": { "exchange": "nyse" } }, { "term": { "sector": "Technology" } } ] } }, "size": 1 }
{ "hits": { "hits": [ { "_score": 0.0, "_type": "symbol", "_id": "AVLqdtWhQ3iIyyVFLSJQ", "_source": { "sector": "Technology", "market_cap": 4469064, "name": "3D Systems Corporation", "exchange": "nyse", "symbol": "DDD", "last_sale": 807, "ipo_year": null, "industry": "Computer Software: Prepackaged Software" }, "_index": "symbol" } ], "total": 186, "max_score": 0.0 }, "_shards": { "successful": 1, "failed": 0, "total": 1 }, "took": 5, "timed_out": false }
Profilebash
[ { "query": [ { "query_type": "BooleanQuery", "lucene": "#exchange:nyse #sector:Technology", "time": "3.999703000ms", "breakdown": { "score": 54437, "create_weight": 413531, "next_doc": 1213355, "match": 0, "build_scorer": 736504, "advance": 0 }, "children": [ { "query_type": "TermQuery", "lucene": "exchange:nyse", "time": "1.175638000ms", "breakdown": { "score": 0, "create_weight": 186745, "next_doc": 0, "match": 0, "build_scorer": 616840, "advance": 372053 } }, { "query_type": "TermQuery", "lucene": "sector:Technology", "time": "0.4062380000ms", "breakdown": { "score": 0, "create_weight": 125321, "next_doc": 115632, "match": 0, "build_scorer": 45136, "advance": 120149 } } ] } ], "rewrite_time": 23008, "collector": [ { "name": "SimpleTopScoreDocCollector", "reason": "search_top_hits", "time": "0.1031780000ms" } ] } ]
SQLapp
$ cat << EOF | ./es_query.py http://127.0.0.1:9200 select * from symbol where last_sale > 985 limit 1 EOF
{"sector": "Finance", "_type": "symbol", "market_cap": 42010000, "name": "1347 Capital Corp.", "exchange": "nasdaq", "symbol": "TFSCU", "last_sale": 1005, "_index": "symbol", "ipo_year": 2014, "_id": "AVLqdtWdQ3iIyyVFLRZB", "industry": "Business Services"}
Elasticsearchelasticsearch
{ "query": { "range": { "last_sale": { "gt": 985.0 } } }, "size": 1 }
{ "hits": { "hits": [ { "_score": 1.0, "_type": "symbol", "_id": "AVLqdtWdQ3iIyyVFLRZB", "_source": { "sector": "Finance", "market_cap": 42010000, "name": "1347 Capital Corp.", "exchange": "nasdaq", "symbol": "TFSCU", "last_sale": 1005, "ipo_year": 2014, "industry": "Business Services" }, "_index": "symbol" } ], "total": 4285, "max_score": 1.0 }, "_shards": { "successful": 1, "failed": 0, "total": 1 }, "took": 2, "timed_out": false }
Profilepost
[ { "query": [ { "query_type": "MultiTermQueryConstantScoreWrapper", "lucene": "last_sale:{985 TO *]", "time": "4.684710000ms", "breakdown": { "score": 423966, "create_weight": 21384, "next_doc": 469032, "match": 0, "build_scorer": 3770328, "advance": 0 } } ], "rewrite_time": 10493, "collector": [ { "name": "SimpleTopScoreDocCollector", "reason": "search_top_hits", "time": "1.261998000ms" } ] } ]
SQL
$ cat << EOF | ./es_query.py http://127.0.0.1:9200 select * from symbol where last_sale != 985 limit 1 EOF
{"sector": "Finance", "_type": "symbol", "market_cap": null, "name": "1347 Capital Corp.", "exchange": "nasdaq", "symbol": "TFSCR", "last_sale": 16, "_index": "symbol", "ipo_year": 2014, "_id": "AVLqdtWdQ3iIyyVFLRZA", "industry": "Business Services"}
Elasticsearch
{ "query": { "bool": { "must_not": { "term": { "last_sale": 985 } } } }, "size": 1 }
{ "hits": { "hits": [ { "_score": 1.0, "_type": "symbol", "_id": "AVLqdtWdQ3iIyyVFLRZA", "_source": { "sector": "Finance", "market_cap": null, "name": "1347 Capital Corp.", "exchange": "nasdaq", "symbol": "TFSCR", "last_sale": 16, "ipo_year": 2014, "industry": "Business Services" }, "_index": "symbol" } ], "total": 6708, "max_score": 1.0 }, "_shards": { "successful": 1, "failed": 0, "total": 1 }, "took": 1, "timed_out": false }
Profile
[ { "query": [ { "query_type": "BooleanQuery", "lucene": "+*:* -last_sale: Y", "time": "14.10871500ms", "breakdown": { "score": 3397824, "create_weight": 401619, "next_doc": 7993655, "match": 0, "build_scorer": 141022, "advance": 0 }, "children": [ { "query_type": "MatchAllDocsQuery", "lucene": "*:*", "time": "1.694079000ms", "breakdown": { "score": 974401, "create_weight": 5175, "next_doc": 705676, "match": 0, "build_scorer": 8827, "advance": 0 } }, { "query_type": "TermQuery", "lucene": "last_sale: Y", "time": "0.4805160000ms", "breakdown": { "score": 0, "create_weight": 342905, "next_doc": 0, "match": 0, "build_scorer": 104919, "advance": 32692 } } ] } ], "rewrite_time": 32619, "collector": [ { "name": "SimpleTopScoreDocCollector", "reason": "search_top_hits", "time": "4.604778000ms" } ] } ]
SQL
$ cat << EOF | ./es_query.py http://127.0.0.1:9200 select * from symbol where exchange='nyse' AND NOT sector='Technology' limit 1 EOF
{"sector": "Health Care", "_type": "symbol", "market_cap": 3865437245, "name": "3M Company", "exchange": "nyse", "symbol": "MMM", "last_sale": 15244, "_index": "symbol", "ipo_year": null, "_id": "AVLqdtWhQ3iIyyVFLSJR", "industry": "Medical/Dental Instruments"}
Elasticsearch
{ "query": { "bool": { "filter": [ { "term": { "exchange": "nyse" } } ], "must_not": [ { "term": { "sector": "Technology" } } ] } }, "size": 1 }
{ "hits": { "hits": [ { "_score": 0.0, "_type": "symbol", "_id": "AVLqdtWhQ3iIyyVFLSJR", "_source": { "sector": "Health Care", "market_cap": 3865437245, "name": "3M Company", "exchange": "nyse", "symbol": "MMM", "last_sale": 15244, "ipo_year": null, "industry": "Medical/Dental Instruments" }, "_index": "symbol" } ], "total": 3054, "max_score": 0.0 }, "_shards": { "successful": 1, "failed": 0, "total": 1 }, "took": 5, "timed_out": false }
Profile
[ { "query": [ { "query_type": "BooleanQuery", "lucene": "#exchange:nyse -sector:Technology", "time": "3.078346000ms", "breakdown": { "score": 164364, "create_weight": 216094, "next_doc": 1872817, "match": 0, "build_scorer": 114716, "advance": 0 }, "children": [ { "query_type": "TermQuery", "lucene": "exchange:nyse", "time": "0.4679310000ms", "breakdown": { "score": 0, "create_weight": 119897, "next_doc": 290703, "match": 0, "build_scorer": 57331, "advance": 0 } }, { "query_type": "TermQuery", "lucene": "sector:Technology", "time": "0.2424240000ms", "breakdown": { "score": 0, "create_weight": 62239, "next_doc": 0, "match": 0, "build_scorer": 32978, "advance": 147207 } } ] } ], "rewrite_time": 19262, "collector": [ { "name": "SimpleTopScoreDocCollector", "reason": "search_top_hits", "time": "0.5360760000ms" } ] } ]
SQL
$ cat << EOF | ./es_query.py http://127.0.0.1:9200 select * from symbol where exchange='nyse' OR NOT sector='Technology' limit 1 EOF
{"sector": "Health Care", "_type": "symbol", "market_cap": 3865437245, "name": "3M Company", "exchange": "nyse", "symbol": "MMM", "last_sale": 15244, "_index": "symbol", "ipo_year": null, "_id": "AVLqdtWhQ3iIyyVFLSJR", "industry": "Medical/Dental Instruments"}
Elasticsearch
{ "query": { "bool": { "should": [ { "term": { "exchange": "nyse" } }, { "bool": { "must_not": [ { "term": { "sector": "Technology" } } ] } } ] } }, "size": 1 }
{ "hits": { "hits": [ { "_score": 0.99838185, "_type": "symbol", "_id": "AVLqdtWhQ3iIyyVFLSJR", "_source": { "sector": "Health Care", "market_cap": 3865437245, "name": "3M Company", "exchange": "nyse", "symbol": "MMM", "last_sale": 15244, "ipo_year": null, "industry": "Medical/Dental Instruments" }, "_index": "symbol" } ], "total": 6245, "max_score": 0.99838185 }, "_shards": { "successful": 1, "failed": 0, "total": 1 }, "took": 9, "timed_out": false }
Profile
[ { "query": [ { "query_type": "BooleanQuery", "lucene": "exchange:nyse (-sector:Technology +*:*)", "time": "21.24846700ms", "breakdown": { "score": 4197895, "create_weight": 815882, "next_doc": 5963510, "match": 0, "build_scorer": 3902610, "advance": 0 }, "children": [ { "query_type": "TermQuery", "lucene": "exchange:nyse", "time": "1.099460000ms", "breakdown": { "score": 219612, "create_weight": 529960, "next_doc": 266196, "match": 0, "build_scorer": 83692, "advance": 0 } }, { "query_type": "BooleanQuery", "lucene": "-sector:Technology +*:*", "time": "5.269110000ms", "breakdown": { "score": 1221522, "create_weight": 209290, "next_doc": 1693148, "match": 0, "build_scorer": 521166, "advance": 0 }, "children": [ { "query_type": "TermQuery", "lucene": "sector:Technology", "time": "0.6576720000ms", "breakdown": { "score": 0, "create_weight": 141704, "next_doc": 0, "match": 0, "build_scorer": 274371, "advance": 241597 } }, { "query_type": "MatchAllDocsQuery", "lucene": "*:*", "time": "0.9663120000ms", "breakdown": { "score": 441766, "create_weight": 5317, "next_doc": 508525, "match": 0, "build_scorer": 10704, "advance": 0 } } ] } ] } ], "rewrite_time": 61389, "collector": [ { "name": "SimpleTopScoreDocCollector", "reason": "search_top_hits", "time": "4.847758000ms" } ] } ]
SQL
$ cat << EOF | ./es_query.py http://127.0.0.1:9200 select * from quote where "date" > now() - interval '30 DAYS' limit 1 EOF
這個 now() 和 interval 的語法是和postgresql一致的(http://www.postgresql.org/docs/9.1/static/functions-datetime.html)
{"volume": 118900, "_type": "quote", "_index": "quote", "symbol": "AMRS", "adj_close": 147, "high": 149, "low": 138, "date": "2016-02-16", "close": 147, "_id": "AMRS-2016-02-16", "open": 140}
Elasticsearch
{ "query": { "range": { "date": { "gt": 1453212988000 } } }, "size": 1 }
查詢是和普通的大於同樣的。
SQL
$ cat << EOF | ./es_query.py http://127.0.0.1:9200 select * from symbol WHERE symbol LIKE 'AAP%' EOF
{"sector": "Technology", "_type": "symbol", "market_cap": 522690000000, "name": "Apple Inc.", "exchange": "nasdaq", "symbol": "AAPL", "last_sale": 9427, "_index": "symbol", "ipo_year": 1980, "_id": "AVL0FqFJog4u0JP7lzka", "industry": "Computer Manufacturing"} {"sector": "Finance", "_type": "symbol", "market_cap": 105960000, "name": "Atlantic Alliance Partnership Corp.", "exchange": "nasdaq", "symbol": "AAPC", "last_sale": 1019, "_index": "symbol", "ipo_year": 2015, "_id": "AVL0FqFJog4u0JP7lzlf", "industry": "Business Services"} {"sector": "Consumer Services", "_type": "symbol", "market_cap": 148395246, "name": "Advance Auto Parts Inc", "exchange": "nyse", "symbol": "AAP", "last_sale": 13857, "_index": "symbol", "ipo_year": null, "_id": "AVL0FqFQog4u0JP7l0R7", "industry": "Other Specialty Stores"}
Elasticsearch
{ "query": { "wildcard": { "symbol": "AAP*" } } }
{ "hits": { "hits": [ { "_score": 1.0, "_type": "symbol", "_id": "AVL0FqFJog4u0JP7lzka", "_source": { "sector": "Technology", "market_cap": 522690000000, "name": "Apple Inc.", "exchange": "nasdaq", "symbol": "AAPL", "last_sale": 9427, "ipo_year": 1980, "industry": "Computer Manufacturing" }, "_index": "symbol" }, { "_score": 1.0, "_type": "symbol", "_id": "AVL0FqFJog4u0JP7lzlf", "_source": { "sector": "Finance", "market_cap": 105960000, "name": "Atlantic Alliance Partnership Corp.", "exchange": "nasdaq", "symbol": "AAPC", "last_sale": 1019, "ipo_year": 2015, "industry": "Business Services" }, "_index": "symbol" }, { "_score": 1.0, "_type": "symbol", "_id": "AVL0FqFQog4u0JP7l0R7", "_source": { "sector": "Consumer Services", "market_cap": 148395246, "name": "Advance Auto Parts Inc", "exchange": "nyse", "symbol": "AAP", "last_sale": 13857, "ipo_year": null, "industry": "Other Specialty Stores" }, "_index": "symbol" } ], "total": 3, "max_score": 1.0 }, "_shards": { "successful": 1, "failed": 0, "total": 1 }, "took": 29, "timed_out": false }
Profile
[ { "query": [ { "query_type": "MultiTermQueryConstantScoreWrapper", "lucene": "symbol:AAP*", "time": "5.018644000ms", "breakdown": { "score": 3186, "create_weight": 34308, "next_doc": 31760, "match": 0, "build_scorer": 4949390, "advance": 0 } }, { "query_type": "BooleanQuery", "lucene": "symbol:AAP symbol:AAPC symbol:AAPL", "time": "4.731495000ms", "breakdown": { "score": 0, "create_weight": 205709, "next_doc": 26459, "match": 0, "build_scorer": 4299185, "advance": 0 }, "children": [ { "query_type": "TermQuery", "lucene": "symbol:AAP", "time": "0.09350600000ms", "breakdown": { "score": 0, "create_weight": 15337, "next_doc": 4021, "match": 0, "build_scorer": 74148, "advance": 0 } }, { "query_type": "TermQuery", "lucene": "symbol:AAPC", "time": "0.07045600000ms", "breakdown": { "score": 0, "create_weight": 6874, "next_doc": 1225, "match": 0, "build_scorer": 62357, "advance": 0 } }, { "query_type": "TermQuery", "lucene": "symbol:AAPL", "time": "0.03618000000ms", "breakdown": { "score": 0, "create_weight": 4934, "next_doc": 1253, "match": 0, "build_scorer": 29993, "advance": 0 } } ] } ], "rewrite_time": 25703, "collector": [ { "name": "SimpleTopScoreDocCollector", "reason": "search_top_hits", "time": "0.04072600000ms" } ] } ] } ]
從profile結果能夠看出,所謂的LIKE查詢,其實不是一個個去查文檔。而是先從字典表裏把這個字段的全部的符合LIKE條件的term查出來,而後去查知足這些term的文檔。把LIKE變成一堆=條件的OR來處理的。
SQL
$ cat << EOF | ./es_query.py http://127.0.0.1:9200 select * from symbol order by name limit 1 EOF
{"sector": "n/a", "_type": "symbol", "market_cap": 72460000, "name": "iShares 0-5 Year Investment Grade Corporate Bond ETF", "exchange": "nasdaq", "symbol": "SLQD", "last_sale": 4997, "_index": "symbol", "ipo_year": null, "_id": "AVLqdtWfQ3iIyyVFLRwf", "industry": "n/a"}
Elasticsearch
{ "sort": [ { "name": "asc" } ], "size": 1 }
{ "hits": { "hits": [ { "sort": [ "0" ], "_type": "symbol", "_source": { "sector": "n/a", "market_cap": 72460000, "name": "iShares 0-5 Year Investment Grade Corporate Bond ETF", "exchange": "nasdaq", "symbol": "SLQD", "last_sale": 4997, "ipo_year": null, "industry": "n/a" }, "_score": null, "_index": "symbol", "_id": "AVLqdtWfQ3iIyyVFLRwf" } ], "total": 6714, "max_score": null }, "_shards": { "successful": 1, "failed": 0, "total": 1 }, "took": 4, "timed_out": false }
Profile
[ { "query": [ { "query_type": "MatchAllDocsQuery", "lucene": "*:*", "time": "1.379354000ms", "breakdown": { "score": 0, "create_weight": 32506, "next_doc": 850386, "match": 0, "build_scorer": 496462, "advance": 0 } } ], "rewrite_time": 18167, "collector": [ { "name": "SimpleFieldCollector", "reason": "search_top_hits", "time": "1.225077000ms" } ] } ]