下面的查詢語句都是在 Elasticsearch-head中執行。
先往elsearch中添加一些數據
{
"name":"aaa",
"sex":1,
"address":"西安"
}
{
"name":"bbb",
"sex":1,
"address":"深圳"
}
{
"name":"ccc",
"sex":2,
"address":"北京"
}
{
"name":"ddd",
"sex":2,
"address":"上海"
}
1.matcch_all 查詢
match_all查詢是elsearch最簡單的查詢,它用來匹配elsearch中所有的文檔,具體命令如:
{
"query":{
"match_all":{}
}
}
將命令在head插件中直接插件,結果如圖:
2.term查詢
term查詢是在索引中搜索與輸入查詢條件完全匹配的文檔
{
"query": {
"term": {
"name": "aaa"
}
}
}
執行結果如下:
這裡說明一下中文搜索的問題。上面的搜索,是根據名字來搜索,是字母,沒有中文,如果用相同的語句來搜索address,就沒有結果。
{
"query": {
"term": {
"address": "西安"
}
}
}
這是因為:elasticsearch 裡默認的IK分詞器是會將每一箇中文都進行了分詞的切割,所以你直接想查一整個詞,或者一整句話是無返回結果的。
可以將搜索改為
{
"query": {
"term": {
"address.keyword": "西安"
}
}
}
就可以得到我們想要的結果。
3.boolean查詢
boolean查詢允許我們模擬AND和OR操作,可以使用MUST,MUST_NOT和SHOULD操作符來構造boolean查詢。MUSH和MUST_NOT負責過濾出結果集中滿足和不滿足條件的數據。默認情況下,SHOULD要檢查它的多個條件中至少滿足一個才會返回數據。
比如查詢 sex=1的用戶:
{
"query":{
"bool":{
"must":{
"term":{"sex":1}
}
}
}
}
查詢sex=1且不在西安的用戶:
查詢sex=1,地址在西安或者深圳的用戶:
{
"query": {
"bool": {
"must": {
"term": {
"sex": 1
}
},
"should": [
{
"term": {
"address.keyword": "西安"
}
},
{
"term": {
"address.keyword": "深圳"
}
}
]
}
}
}
4.match查詢
查詢與搜索條件匹配的文檔,默認情況下,match查詢是一個使用了or操作符的boolean類型的查詢
如查詢 address 是 西安 或者 深圳 的用戶
{
"query": {
"match": {
"address": {
"query": "西安 深圳"
}
}
}
}
5.range查詢
range查詢半按照指定字段值的範圍進行匹配。我們可以使用gt,gte,lt,lte操作符來定義這個範圍。這幾個操作符分別表示:大於,大於等於,小於,小於等於
比如,查詢sex大於1的數據:
{
"query": {
"range": {
"sex" : {
"gt" : 1
}
}
}
}
查詢大於等於2且小於5的數據
{
"query": {
"range": {
"sex": {
"gte": 2,
"lt": 5
}
}
}
}
由於我們測試數據的問題,這裡還只會列出來大於等於2的數據。
6.wildcard查詢
wildcard查詢是在字段上使用通配符表達式來進行查詢。你可以使用 * 匹配不限數量的所有字符,? 可以匹配所有字符,與 * 不同的是它只能匹配單個字符
比如:查詢name以a開頭的用戶:
{
"query": {
"wildcard": {
"name": {
"value": "a*"
}
}
}
}
如果將上面查詢語句中的 * 改為 ? ,就匹配不到結果
因為?只匹配單個字符。
上面只是一些基本的查詢類型,elsearch還支持更多不同類型的查詢,以後有機會再補充。
閱讀更多 程序從入門到放棄 的文章