請求一個elasticsearch的查詢語句怎麼寫
Elasticsearch是一個高伸縮、高可用、基於Apache Lucene的開源搜索與分析引擎。通過它你可以很方便地對數據進行深入挖掘,可以隨時放大與縮小搜索與分析的區間,並且這一切都是實時的。為了提供了一 個優秀的用戶體驗,我們對Elasticsearch投入了很大的精力。Elasticsearch本身的各種選項已有了良好的默認值,使用戶能夠更方便 地上手。但我們也為用戶提供了全方麵的選項,在必要的情況下,可以對該引擎的幾乎每個方麵進行定製。 舉例來說,當你使用它搜索數據的時候,可以使 用傳統的查詢(‘查找滿足條件Y的所有項X’)進行過濾(在Elasticsearch術語中稱為逗視圖地),高亮顯示搜索片段,為每條結果提供相應的上 下文。也可以使用地理位置(‘查找在Z裏之內的所有項’),或是為用戶提供搜索關鍵字建議,並且提供了強大的聚合(即Elasticsearch中的逗分 麵地(facet))能力,例如時間分布圖或者統計圖。 Elasticsearch既可以搜索、也可以保存數據。它提供了一種半結構化、不依賴 schema並且基於JSON的模型,你可以直接傳入原始的JSON文檔,Elasticsearch會自動地檢測出你的數據類型,並對文檔進行索引。你 也可以對schema映射進行定製,以實現你的目的,例如對單獨的字段或文檔進行boost映射,或者是定製全文搜索的分析方式等等。 你既可以在自己的膝上電腦中啟用一個小型實例,也可以在雲端啟用幾十乃至幾百個實例,隻需要一些極小的改變而已。Elasticsearch會自動進行橫向擴展,它能夠隨著你的應用一起成長。 Elasticsearch 運行在JVM之上,它使用JSON格式,通過RESTful HTTP接口的方式訪問,因此任何一種客戶端或語言都能夠與其交互。目前已經有了大量的客戶端和框架的整合方案,包括對多種編程語言的支持,通過這些原生 的API與專門的DSL將不一致的地方最小化,並實現性能最大化。 Elasticsearch非常適合於大數據的場合,它的高伸縮性與分布式架構 的本質使得對大量信息的搜索與存儲都可以在近乎實時的情況下完成。通過Elasticsearch-Hadoop這個項目,我們使Hadoop使用者(這 裏也包括Hive、Pig和Cascading)能夠用一個成熟的搜索引擎來增強他們的工作流。我們還為他們提供了一種豐富的語言,能夠讓他們更好地表達 意圖,因而更準確地獲得想要的結果,並且速度也大大提高了。
java怎麼打印最終提交給elasticsearch的dsl查詢語句
SearchRequestBuilder對象設置index、type、分頁、高亮等等後,打印這個對象即可
java怎麼打印最終提交給elasticsearch的dsl查詢語句
SearchRequestBuilder對象設置index、type、分頁、高亮等等後,打印這個對象即可
elasticsearch 在大數據中能實現哪些功能
由於需要提升項目的搜索質量,最近研究了一下Elasticsearch,一款非常優秀的分布式搜索程序。最開始的一些筆記放到github,這裏隻是歸納總結一下。
首先,為什麼要使用Elasticsearch?最開始的時候,我們的項目僅僅使用MySQL進行簡單的搜索,然後一個不能索引的like語句,直接拉低MySQL的性能。後來,我們曾考慮過sphinx,並且sphinx也在之前的項目中成功實施過,但想想現在的數據量級,多台MySQL,以及搜索服務本身HA,還有後續擴容的問題,我們覺得sphinx並不是一個最優的選擇。於是自然將目光放到了Elasticsearch上麵。
根據官網自己的介紹,Elasticsearch是一個分布式搜索服務,提供Restful API,底層基於Lucene,采用多shard的方式保證數據安全,並且提供自動resharding的功能,加之github等大型的站點也采用 Elasticsearch作為其搜索服務,我們決定在項目中使用Elasticsearch。
對於Elasticsearch,如果要在項目中使用,需要解決如下問題:
索引,對於需要搜索的數據,如何建立合適的索引,還需要根據特定的語言使用不同的analyzer等。
搜索,Elasticsearch提供了非常強大的搜索功能,如何寫出高效的搜索語句?
數據源,我們所有的數據是存放到MySQL的,MySQL是唯一數據源,如何將MySQL的數據導入到Elasticsearch?
對於1和2,因為我們的數據都是從MySQL生成,index的field是固定的,主要做的工作就是根據業務場景設計好對應的mapping以及search語句就可以了,當然實際不可能這麼簡單,需要我們不斷的調優。
而對於3,則是需要一個工具將MySQL的數據導入Elasticsearch,因為我們對搜索實時性要求很高,所以需要將MySQL的增量數據實時導入,筆者唯一能想到的就是通過row based binlog來完成。而近段時間的工作,也就是實現一個MySQL增量同步到Elasticsearch的服務。
Lucene
Elasticsearch底層是基於Lucene的,Lucene是一款優秀的搜索lib,當然,筆者以前仍然沒有接觸使用過。:-)
Lucene關鍵概念:
Document:用來索引和搜索的主要數據源,包含一個或者多個Field,而這些Field則包含我們跟Lucene交互的數據。
Field:Document的一個組成部分,有兩個部分組成,name和value。
Term:不可分割的單詞,搜索最小單元。
Token:一個Term呈現方式,包含這個Term的內容,在文檔中的起始位置,以及類型。
Lucene使用Inverted index來存儲term在document中位置的映射關係。
譬如如下文檔:
Elasticsearch Server 1.0 (document 1)
Mastring Elasticsearch (document 2)
Apache Solr 4 Cookbook (document 3)
使用inverted index存儲,一個簡單地映射關係:
Term
Count
Docuemnt
1.0 1 <1>
4 1 <3>
Apache 1 <3>
Cookbook 1 <3>
Elasticsearch 2 <1>.<2>
Mastering 1 <2>
Server 1 <1>
Solr 1 <3>
對於上麵例子,我們首先通過分詞算法將一個文檔切分成一個一個的token,再得到該token與document的映射關係,並記錄token出現的總次數。這樣就得到了一個簡單的inverted index。
Elasticsearch關鍵概念
要使用Elasticsearch,筆者認為,隻需要理解幾個基本概念就可以了。
在數據層麵,主要有:
Index:Elasticsearch用來存儲數據的邏輯區域,它類似於關係型數據庫中的db概念。一個index可以在一個或者多個shard上麵,同時一個shard也可能會有多個replicas。
Document:Elasticsearch裏麵存儲的實體數據,類似於關係數據中一個table裏麵的一行數據。
document由多個field組成,不同的document裏麵同名的field一定具有相同的類型。document裏麵field可以重複出現,也就是一個field會有多個值,即multivalued。
Document type:為了查詢需要,一個index可能會有多種document,也就是document type,但需要注意,不同document裏麵同名的field一定要是相同類型的。
Mapping:存儲field的相關映射信息,不同document type會有不同的mapping。
對於熟悉MySQL的童鞋,我們隻需要大概認為Index就是一個db,document就是一行數據,field就是table的column,mapping就是table的定義,而document type就是一個table就可以了。
Document type這個概念其實最開始也把筆者給弄糊塗了,其實它就是為了更好的查詢,舉個簡單的例子,一個index,可能一部分數據我們想使用一種查詢方式,而另一部分數據我們想使用另一種查詢方式,於是就有了兩種type了。不過這種情況應該在我們的項目中不會出現,所以通常一個index下麵僅會有一個 type。
在服務層麵,主要有:
Node: 一個server實例。
Cluster:多個node組成cluster。
Shard:數據分片,一個index可能會存在於多個shards,不同shards可能在不同nodes。
Replica:shard的備份,有一個primary shard,其餘的叫做replica shards。
Elasticsearch之所以能動態resharding,主要在於它最開始就預先分配了多個shards(貌似是1024),然後以shard為單位進行數據遷移。這個做法其實在分布式領域非常的普遍,codis就是使用了1024個slot來進行數據遷移。
因為任意一個index都可配置多個replica,通過冗餘備份的方式保證了數據的安全性,同時replica也能分擔讀壓力,類似於MySQL中的slave。
Restful API
Elasticsearch提供了Restful API,使用json格式,這使得它非常利於與外部交互,雖然Elasticsearch的客戶端很多,但筆者仍然很容易的就寫出了一個簡易客戶端用於項目中,再次印證了Elasticsearch的使用真心很容易。
Restful的接口很簡單,一個url表示一個特定的資源,譬如/blog/article/1,就表示一個index為blog,type為aritcle,id為1的document。
而我們使用http標準method來操作這些資源,POST新增,PUT更新,GET獲取,DELETE刪除,HEAD判斷是否存在。
這裏,友情推薦httpie,一個非常強大的http工具,個人感覺比curl還用,幾乎是命令行調試Elasticsearch的絕配。
一些使用httpie的例子:
# create
http POST :9200/blog/article/1 title="hello elasticsearch" tags:='["elasticsearch"]'
# get
http GET :9200/blog/article/1
# update
http PUT :9200/blog/article/1 title="hello elasticsearch" tags:='["elasticsearch", "hello"]'
# delete
http DELETE :9200/blog/article/1
# exists
http HEAD :9200/blog/article/1
索引和搜索
雖然Elasticsearch能自動判斷field類型並建立合適的索引,但筆者仍然推薦自己設置相關索引規則,這樣才能更好為後續的搜索服務。
我們通過定製mapping的方式來設置不同field的索引規則。
而對於搜索,Elasticsearch提供了太多的搜索選項,就不一一概述了。
索引和搜索是Elasticsearch非常重要的兩個方麵,直接關係到產品的搜索體驗,但筆者現階段也僅僅是大概了解了一點,後續在詳細介紹。
同步MySQL數據
Elasticsearch是很強大,但要建立在有足量數據情況下麵。我們的數據都在MySQL上麵,所以如何將MySQL的數據導入Elasticsearch就是筆者最近研究的東西了。
雖然現在有一些實現,譬如elasticsearch-river-jdbc,或者elasticsearch-river-mysql,但筆者並不打算使用。
elasticsearch-river-jdbc的功能是很強大,但並沒有很好的支持增量數據更新的問題,它需要對應的表隻增不減,而這個幾乎在項目中是不可能辦到的。
elasticsearch-river-mysql倒是做的很不錯,采用了python-mysql-replication來通過binlog獲取變更的數據,進行增量更新,但它貌似處理MySQL dump數據導入的問題,不過這個筆者真的好好確認一下?話說,python-mysql-replication筆者還提交過pull解決了minimal row image的問題,所以對elasticsearch-river-mysql這個項目很有好感。隻是筆者決定自己寫一個出來。
為什麼筆者決定自己寫一個,不是因為筆者喜歡造輪子,主要原因在於對於這種MySQL syncer服務(增量獲取MySQL數據更新到相關係統),我們不光可以用到Elasticsearch上麵,而且還能用到其他服務,譬如cache上麵。所以筆者其實想實現的是一個通用MySQL syncer組件,隻是現在主要關注Elasticsearch罷了。
項目代碼在這裏go-mysql-elasticsearch,現已完成第一階段開發,內部對接測試中。
go-mysql-elasticsearch的原理很簡單,首先使用mysqldump獲取當前MySQL的數據,然後在通過此時binlog的name和position獲取增量數據。
一些限製:
binlog一定要變成row-based format格式,其實我們並不需要擔心這種格式的binlog占用太多的硬盤空間,MySQL 5.6之後GTID模式都推薦使用row-based format了,而且通常我們都會把控SQL語句質量,不允許一次性更改過多行數據的。
需要同步的table最好是innodb引擎,這樣mysqldump的時候才不會阻礙寫操作。
需要同步的table一定要有主鍵,好吧,如果一個table沒有主鍵,筆者真心會懷疑設計這個table的同學編程水平了。多列主鍵也是不推薦的,筆者現階段不打算支持。
一定別動態更改需要同步的table結構,Elasticsearch隻能支持動態增加field,並不支持動態刪除和更改field。通常來說,如果涉及到alter table,很多時候已經證明前期設計的不合理以及對於未來擴展的預估不足了。
更詳細的說明,等到筆者完成了go-mysql-elasticsearch的開發,並通過生產環境中測試了,再進行補充。
總結
最近一周,筆者花了不少時間在Elasticsearch上麵,現在算是基本入門了。其實筆者覺得,對於一門不懂的技術,找一份靠譜的資料(官方文檔或者入門書籍),蛋疼的對著資料敲一遍代碼,不懂的再問google,最後在將其用到實際項目,這門技術就算是初步掌握了,當然精通還得在下點功夫。
現在筆者隻是覺得Elasticsearch很美好,上線之後鐵定會有坑的,那時候隻能慢慢填了。話說,筆者是不是要學習下java了,省的到時候看不懂代碼就慘了。:-)
elasticsearch 查詢語句怎麼把查詢和聚合弄到一起
當數據量過大時,可能會導致各種各樣的問題發生,例如:服務器資源被耗盡,因數據傳輸量過大而使處理超時,等等。最終都會導致查詢無法完成。解決這個問題的一個策略就是“分頁查詢”,也就是說不要一次性查詢所有的數據,
如何用ElasticSearch實現下麵的SQL
elasticsearch version
latest version
remarks
1.X 1.4.6 tested against elastic 1.4-1.6
2.0.0 2.0.1 delete commands not supported
Elasticsearch 1.X
./bin/plugin -u [github.com] --install sql
Elasticsearch 2.0.0
Elasticsearch到底能玩多大的數據量
由於需要提升項目的搜索質量,最近研究了一下Elasticsearch,一款非常優秀的分布式搜索程序。最開始的一些筆記放到github,這裏隻是歸納總結一下。首先,為什麼要使用Elasticsearch?最開始的時候,我們的項目僅僅使用MySQL進行簡單的搜索,然後一個不能索引的like語句,直接拉低MySQL的性能。後來,我們曾考慮過sphinx,並且sphinx也在之前的項目中成功實施過,但想想現在的數據量級,多台MySQL,以及搜索服務本身HA,還有後續擴容的問題,我們覺得sphinx並不是一個最優的選擇。於是自然將目光放到了Elasticsearch上麵。根據官網自己的介紹,Elasticsearch是一個分布式搜索服務,提供RestfulAPI,底層基於Lucene,采用多shard的方式保證數據安全,並且提供自動resharding的功能,加之github等大型的站點也采用Elasticsearch作為其搜索服務,我們決定在項目中使用Elasticsearch。對於Elasticsearch,如果要在項目中使用,需要解決如下問題:索引,對於需要搜索的數據,如何建立合適的索引,還需要根據特定的語言使用不同的analyzer等。搜索,Elasticsearch提供了非常強大的搜索功能,如何寫出高效的搜索語句?數據源,我們所有的數據是存放到MySQL的,MySQL是唯一數據源,如何將MySQL的數據導入到Elasticsearch?對於1和2,因為我們的數據都是從MySQL生成,index的field是固定的,主要做的工作就是根據業務場景設計好對應的mapping以及search語句就可以了,當然實際不可能這麼簡單,需要我們不斷的調優。而對於3,則是需要一個工具將MySQL的數據導入Elasticsearch,因為我們對搜索實時性要求很高,所以需要將MySQL的增量數據實時導入,筆者唯一能想到的就是通過rowbasedbinlog來完成。而近段時間的工作,也就是實現一個MySQL增量同步到Elasticsearch的服務。LuceneElasticsearch底層是基於Lucene的,Lucene是一款優秀的搜索lib,當然,筆者以前仍然沒有接觸使用過。:-)Lucene關鍵概念:Document:用來索引和搜索的主要數據源,包含一個或者多個Field,而這些Field則包含我們跟Lucene交互的數據。Field:Document的一個組成部分,有兩個部分組成,name和value。Term:不可分割的單詞,搜索最小單元。Token:一個Term呈現方式,包含這個Term的內容,在文檔中的起始位置,以及類型。Lucene使用Invertedindex來存儲term在document中位置的映射關係。譬如如下文檔:ElasticsearchServer1.0(document1)MastringElasticsearch(document2)ApacheSolr4Cookbook(document3)使用invertedindex存儲,一個簡單地映射關係:TermCountDocuemnt1.0141Apache1Cookbook1Elasticsearch2.Mastering1Server1Solr1對於上麵例子,我們首先通過分詞算法將一個文檔切分成一個一個的token,再得到該token與document的映射關係,並記錄token出現的總次數。這樣就得到了一個簡單的invertedindex。Elasticsearch關鍵概念要使用Elasticsearch,筆者認為,隻需要理解幾個基本概念就可以了。在數據層麵,主要有:Index:Elasticsearch用來存儲數據的邏輯區域,它類似於關係型數據庫中的db概念。一個index可以在一個或者多個shard上麵,同時一個shard也可能會有多個replicas。Document:Elasticsearch裏麵存儲的實體數據,類似於關係數據中一個table裏麵的一行數據。document由多個field組成,不同的document裏麵同名的field一定具有相同的類型。document裏麵field可以重複出現,也就是一個field會有多個值,即multivalued。Documenttype:為了查詢需要,一個index可能會有多種document,也就是documenttype,但需要注意,不同document裏麵同名的field一定要是相同類型的。Mapping:存儲field的相關映射信息,不同documenttype會有不同的mapping。對於熟悉MySQL的童鞋,我們隻需要大概認為Index就是一個db,document就是一行數據,field就是table的column,mapping就是table的定義,而documenttype就是一個table就可以了。Documenttype這個概念其實最開始也把筆者給弄糊塗了,其實它就是為了更好的查詢,舉個簡單的例子,一個index,可能一部分數據我們想使用一種查詢方式,而另一部分數據我們想使用另一種查詢方式,於是就有了兩種type了。不過這種情況應該在我們的項目中不會出現,所以通常一個index下麵僅會有一個type。在服務層麵,主要有:Node:一個server實例。Cluster:多個node組成cluster。Shard:數據分片,一個index可能會存在於多個shards,不同shards可能在不同nodes。Replica:shard的備份,有一個primaryshard,其餘的叫做replicashards。Elasticsearch之所以能動態resharding,主要在於它最開始就預先分配了多個shards(貌似是1024),然後以shard為單位進行數據遷移。這個做法其實在分布式領域非常的普遍,codis就是使用了1024個slot來進行數據遷移。因為任意一個index都可配置多個replica,通過冗餘備份的方式保證了數據的安全性,同時replica也能分擔讀壓力,類似於MySQL中的slave。RestfulAPIElasticsearch提供了RestfulAPI,使用json格式,這使得它非常利於與外部交互,雖然Elasticsearch的客戶端很多,但筆者仍然很容易的就寫出了一個簡易客戶端用於項目中,再次印證了Elasticsearch的使用真心很容易。Restful的接口很簡單,一個url表示一個特定的資源,譬如/blog/article/1,就表示一個index為blog,type為aritcle,id為1的document。而我們使用http標準method來操作這些資源,POST新增,PUT更新,GET獲取,DELETE刪除,HEAD判斷是否存在。這裏,友情推薦httpie,一個非常強大的http工具,個人感覺比curl還用,幾乎是命令行調試Elasticsearch的絕配。一些使用httpie的例子:#createhttpPOST:9200/blog/article/1title="helloelasticsearch"tags:='["elasticsearch"]'#gethttpGET:9200/blog/article/1#updatehttpPUT:9200/blog/article/1title="helloelasticsearch"tags:='["elasticsearch","hello"]'#deletehttpDELETE:9200/blog/article/1#existshttpHEAD:9200/blog/article/1索引和搜索雖然Elasticsearch能自動判斷field類型並建立合適的索引,但筆者仍然推薦自己設置相關索引規則,這樣才能更好為後續的搜索服務。我們通過定製mapping的方式來設置不同field的索引規則。而對於搜索,Elasticsearch提供了太多的搜索選項,就不一一概述了。索引和搜索是Elasticsearch非常重要的兩個方麵,直接關係到產品的搜索體驗,但筆者現階段也僅僅是大概了解了一點,後續在詳細介紹。同步MySQL數據Elasticsearch是很強大,但要建立在有足量數據情況下麵。我們的數據都在MySQL上麵,所以如何將MySQL的數據導入Elasticsearch就是筆者最近研究的東西了。雖然現在有一些實現,譬如elasticsearch-river-jdbc,或者elasticsearch-river-mysql,但筆者並不打算使用。elasticsearch-river-jdbc的功能是很強大,但並沒有很好的支持增量數據更新的問題,它需要對應的表隻增不減,而這個幾乎在項目中是不可能到的。elasticsearch-river-mysql倒是做的很不錯,采用了python-mysql-replication來通過binlog獲取變更的數據,進行增量更新,但它貌似處理MySQLdump數據導入的問題,不過這個筆者真的好好確認一下?話說,python-mysql-replication筆者還提交過pull解決了minimalrowimage的問題,所以對elasticsearch-river-mysql這個項目很有好感。隻是筆者決定自己寫一個出來。為什麼筆者決定自己寫一個,不是因為筆者喜歡造輪子,主要原因在於對於這種MySQLsyncer服務(增量獲取MySQL數據更新到相關係統),我們不光可以用到Elasticsearch上麵,而且還能用到其他服務,譬如cache上麵。所以筆者其實想實現的是一個通用MySQLsyncer組件,隻是現在主要關注Elasticsearch罷了。項目代碼在這裏go-mysql-elasticsearch,現已完成第一階段開發,內部對接測試中。go-mysql-elasticsearch的原理很簡單,首先使用mysqldump獲取當前MySQL的數據,然後在通過此時binlog的name和position獲取增量數據。一些限製:binlog一定要變成row-basedformat格式,其實我們並不需要擔心這種格式的binlog占用太多的硬盤空間,MySQL5.6之後GTID模式都推薦使用row-basedformat了,而且通常我們都會把控SQL語句質量,不允許一次性更改過多行數據的。需要同步的table最好是innodb引擎,這樣mysqldump的時候才不會阻礙寫操作。需要同步的table一定要有主鍵,好吧,如果一個table沒有主鍵,筆者真心會懷疑設計這個table的同學編程水平了。多列主鍵也是不推薦的,筆者現階段不打算支持。一定別動態更改需要同步的table結構,Elasticsearch隻能支持動態增加field,並不支持動態刪除和更改field。通常來說,如果涉及到altertable,很多時候已經證明前期設計的不合理以及對於未來擴展的預估不足了。更詳細的說明,等到筆者完成了go-mysql-elasticsearch的開發,並通過生產環境中測試了,再進行補充。總結最近一周,筆者花了不少時間在Elasticsearch上麵,現在算是基本入門了。其實筆者覺得,對於一門不懂的技術,找一份靠譜的資料(官方文檔或者入門書籍),蛋疼的對著資料敲一遍代碼,不懂的再問google,最後在將其用到實際項目,這門技術就算是初步掌握了,當然精通還得在下點功夫。現在筆者隻是覺得Elasticsearch很美好,上線之後鐵定會有坑的,那時候隻能慢慢填了。話說,筆者是不是要學習下java了,省的到時候看不懂代碼就慘了。:-)
Elasticsearch 怎麼執行 and 條件的 in 查詢
SQL語句可沒有這樣的語法。 可以這樣實現,如果有子查詢的話。 select * from a where a.b_id in (select id from b where ...) and ...
Elasticsearch 查詢怎麼返回指定的字段值
指定返回字段,查詢方式,
SearchResponse response = client.prepareSearch("sb").setTypes("sb")
.setQuery(query).setFrom(0).setSize(500)
.setExplain(false)
.addFields(new String[]{"cphm1","jcdid","cplx1","tpid1","tgsj","cdid"})
.execute().actionGet();```
**結果獲取方式:**
//指定返回字段時的結果獲取方式------begin---------
Map List