ElasticSerach DSL基本語法

請求參數(shù)的查詢(QueryString)

查詢[字段]包含[內(nèi)容]的文檔

GET請求     http://192.168.1.181:9200/shop/_doc/_search?q=desc:我真帥
GET請求     http://192.168.1.181:9200/shop/_doc/_search?q=desc:我真帥&q=age:18

這種方式一般稱之為QueryString查詢方式,參數(shù)都是在URL中作為請求參數(shù)的。

點擊一下,咻的一下就可以查看官方文檔了,可直接翻譯es DSL操作官方文檔

DSL基本語法

QueryString用的很少,一旦參數(shù)復雜就很難構(gòu)建,所以大多數(shù)查詢都是使用dsl來進行查詢比較好。

  • Domain Specific Language
  • 特定領(lǐng)域語言
  • 基于JSON格式的數(shù)據(jù)查詢
  • 查詢更靈活,有利于復雜查詢

1、match語法

  #查詢
 POST   http://192.168.1.181:9200/shop/_doc/_search
 {
    "query":{
        "match":{
            "desc":"我真帥"
        }
    }
}
# 同等于: GET  http://192.168.1.181:9200/shop/_doc/_search?q=desc:我真帥

#判斷某個字段是否存在
{
    "query":{
        "exists":{
            "field":"desc"
        }
    }
}

!補充:語法格式為一個json object,內(nèi)容都是key-value鍵值對,json可以嵌套。 key可以是一些es的關(guān)鍵字,也可以是某個field字段

2、match_all

在索引中查詢所有的文檔

  GET http://113.98.58.50:9200/shop/_doc/_search  
  
  POST  http://113.98.58.50:9200/shop/_doc/_search
{
    "query":{
        "match_all":{}
    },
    "_source":["id","nickname","age"], # 類似mysql中select * 替換
    "from": 0,   # 從那一條數(shù)據(jù)開始
    "size": 10   # 每一頁展示多少條數(shù)據(jù)
}

3、match_phrase

match:分詞后只要有數(shù)據(jù)就會進行匹配然后返回
match_phrase:分詞結(jié)果必須在text字段分詞中都包含,而且順序必須相同,而且必須都是連續(xù)的(搜索相對而言比較嚴格)

  # slop:允許詞語間跳過的數(shù)量
  POST  http://113.98.58.50:9200/shop/_doc/_search
{
    "query": {
        "match_phrase": {
            "desc": {
                "query": "大學 畢業(yè) 研究生",
                "slop": 2
            }
        }
    }
}

4、match 擴展

operator:

  • or:搜索內(nèi)容分詞后,只要存在一個詞語匹配就能有結(jié)果
  • and:搜索內(nèi)容分詞后,都要滿足詞語匹配
 POST  http://113.98.58.50:9200/shop/_doc/_search
{
 "query": {
     "match": {
         "desc": "我真帥!"
     }
 }
}
# 等同于
{
 "query": {
     "match": {
         "desc": {
             "query": "xbox游戲機",
             "operator": "or"
         }
     }
 }
}
# 相當于 select * from shop where desc='xbox' or|and desc='游戲機'
  • minimum_should_match:最低匹配精度,至少有[分詞后的詞語個數(shù)]百分位,的出一個數(shù)據(jù)值取整。舉個??:當前屬性設置為70,若一個用戶查詢檢索內(nèi)容分詞后有10個詞語,那么匹配度就是1070%=7,則desc中至少需要有7個成語進行匹配,就展示。若分詞后有八個,則8*70% =5.6,則desc中至少需要有5個成語匹配,就展示。
  • minimum_shodld_match 也能設置具體的數(shù)字,表示個數(shù)
POST  http://113.98.58.50:9200/shop/_doc/_search
{
    "query": {
        "match": {
            "desc": {
                "query": "女友在我生日的時候送了我一雙限量版球鞋,可把我開心壞了。",
                "minimum_should_match": "60%"
            }
        }
    }
}

根據(jù)文檔主鍵ids搜索

#查詢當個
GET /shop/_doc/1001
#查詢多個
POST  http://113.98.58.50:9200/shop/_doc/_search
{
    "query": {
        "ids": {
            "type": "_doc",
            "values": ["1001", "1010", "1008"]
        }
    }
}

5、multi_match/boost

#滿足使用match在多個字段中進行查詢的需求
  POST  http://113.98.58.50:9200/shop/_doc/_search
{
    "query": {
        "multi_match": {
                "query": "王二  18",
                "fields": ["name", "age"]
        }
    }
}

#boost
#權(quán)重,為某個字段設置權(quán)重,權(quán)重越高,文檔相關(guān)性得分就越高。通暢來說搜索商品名稱要比商品簡介的權(quán)重更高。
{
    "query": {
        "multi_match": {
                "query": "王二  18",
                "fields": ["name", "age^10"]

        }
    }
}
#age^10 代表搜索提升10倍相關(guān)性,也就是說用戶搜索的時候其實以這個age為主,name為輔,age的匹配相關(guān)度當然要提高權(quán)重比例了。

6、term

搜索的時候會吧用戶搜索內(nèi)容,比如:"你是真的丑爆了!"作為一個整體的關(guān)鍵字去搜索,而不會對其他的分詞后在搜索。

  POST  http://113.98.58.50:9200/shop/_doc/_search
{
    "query":{
        "term":{
            "desc":"你是真的丑爆了!"
        }
    }
}
# 可以對比:
{
    "query": {
        "match": {
            "desc": "你是真的丑爆了!"
        }
    }
}

# terms 多個詞語匹配檢索
# 相當于是tag標簽查詢,比如慕課網(wǎng)的一些淘寶會打上衣服、褲子、鞋子、襪子這樣的標簽,可以完全匹配做類似標簽的查詢
 {
    "query":{
        "terms":{
            "desc":["衣服","褲子","鞋子"]
        }
    }
}

!注:match會對"你是真的丑爆了!"些進行分詞(其實就是全文搜索),在查詢,而term則不會,直接吧"你是真的丑爆了!"作為一個整的詞匯去搜索。

6、布爾查詢

可以組合多重查詢

  • must:查詢必須匹配搜索條件,比如and
  • should: 查詢匹配滿足1個以上條件,比如or
  • must_not:不匹配搜索條件,一個都不需要滿足
  POST  http://113.98.58.50:9200/shop/_doc/_search
實操1:
{
    "query": {
        "bool": {
            "must": [
                {
                    "multi_match": {
                        "query": "我可真帥",
                        "fields": ["desc", "nickname"]
                    }
                },
                {
                    "term": {
                        "sex": 1
                    }
                },
                {
                    "term": {
                        "birthday": "1996-01-14"
                    }
                }
            ]
        }
    }
}

{
    "query": {
        "bool": {
            "should(must_not)": [
                {
                    "multi_match": {
                        "query": "學習",
                        "fields": ["desc", "nickname"]
                    }
                },
                {
                    "match": {
                        "desc": "游戲"
                    }   
                },
                {
                    "term": {
                        "sex": 0
                    }
                }
            ]
        }
    }
}

實操2:
{
    "query": {
        "bool": {
            "must": [
                {
                    "match": {
                        "desc": "愛"
                    }   
                },
                {
                    "match": {
                        "nickname": "愛"
                    }   
                }
            ],
            "should": [
                {
                    "match": {
                        "sex": "0"
                    }   
                }
            ],
            "must_not": [
                {
                    "term": {
                        "birthday": "1998-12-24"
                    }   
                }
            ]
        }
    }
}

#為指定詞語加權(quán)
#特殊場景下,某些詞語可以單獨加權(quán),這樣可以排得更加靠前。
{
    "query": {
        "bool": {
            "should": [
                {
                    "match": {
                        "desc": {
                            "query": "律師",
                            "boost": 18
                        }
                    }
                },
                {
                    "match": {
                        "desc": {
                            "query": "進修",
                            "boost": 2
                        }
                    }
                }
            ]
        }
    }
}

7、過濾器

對搜索出來的結(jié)果進行數(shù)據(jù)過濾。不會到es庫里去搜,不會去計算文檔的相關(guān)度分數(shù),所以過濾的性能會比較高,過濾器可以和全文搜索結(jié)合在一起使用。

post_filter元素是一個頂層元素,只會對搜索結(jié)果進行過濾。不會計算數(shù)據(jù)的匹配度相關(guān)性分數(shù),不會根據(jù)分數(shù)去排序,query則相反,會計算分數(shù),也會按照分數(shù)去排序。

使用場景:

  • query:根據(jù)用戶搜索條件檢索匹配記錄
  • post_filter:用于查詢后,對結(jié)果數(shù)據(jù)的篩選

實操:查詢賬戶金額大于80元,小于160元的用戶。并且生日在1998-07-14的用戶

  • gte:大于等于
  • lte:小于等于
  • gt:大于
  • lt:小于
    (除此以外還能做其他的match等操作也行)
  POST  http://113.98.58.50:9200/shop/_doc/_search
{
    "query": {
        "match": {
            "desc": "玩吃雞滴滴我呀!我鋼槍賊6"
        }   
    },
    "post_filter": {
        "range": {
            "money": {
                "gt": 60,
                "lt": 1000
            }
        }
    }   
}

8、排序

es的排序同sql,可以desc也可以asc。也支持組合排序。

實操:

  POST  http://113.98.58.50:9200/shop/_doc/_search
{
    "query": {
        "match": {
            "desc": "玩吃雞滴滴我呀!我鋼槍賊6"
        }
    },
    "post_filter": {
        "range": {
            "money": {
                "gt": 55.8,
                "lte": 155.8
            }
        }
    },
    "sort": [
        {
            "age": "desc"
        },
        {
            "money": "desc"
        }
    ]
}

對文本排序

由于文本會被分詞,所以往往要去做排序會報錯,通常我們可以為這個字段增加額外的一個附屬屬性,類型為keyword,用于做排序。

  • 創(chuàng)建新的索引
POST        /shop2/_mapping
{
    "properties": {
        "id": {
            "type": "long"
        },
        "nickname": {
            "type": "text",
            "analyzer": "ik_max_word",
            "fields": {
                "keyword": {
                    "type": "keyword"
                }
            }
        }
    }
}
  • 插入數(shù)據(jù)
POST         /shop2/_doc
{
    "id": 1001,
    "nickname": "美麗的風景"
}
{
    "id": 1002,
    "nickname": "漂亮的小哥哥"
}
{
    "id": 1003,
    "nickname": "飛翔的巨鷹"
}
{
    "id": 1004,
    "nickname": "完美的天空"
}
{
    "id": 1005,
    "nickname": "廣闊的海域"
}
  • 排序
{
    "sort": [
        {
            "nickname.keyword": "desc"
        }
    ]
}

9、高亮highlight

高亮顯示

 POST  http://113.98.58.50:9200/shop/_doc/_search
{
    "query": {
        "match": {
            "desc": "你真帥"
        }
    },
    "highlight": {
        "pre_tags": ["<tag>"],
        "post_tags": ["</tag>"],
        "fields": {
            "desc": {}
        }
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容