Elasticsearch(ES)的高級搜索(DSL搜索)(上篇)

1. 概述

之前聊了一下 Elasticsearch(ES)的基本使用,今天我們聊聊 Elasticsearch(ES)的高級搜索(DSL搜索),由於DSL搜索內容比較多,因此分為兩篇文章完成。

 

2. 場景說明

2.1 創建索引同時創建映射

PUT  //192.168.1.11:9200/index_user

參數:

{
    "settings":{
        "index":{
            "number_of_shards":5,
            "number_of_replicas":0
        }
    },
    "mappings" : {
        "properties":{
            "user_id":{
                "type":"long"
            },
            "name":{
                "type":"text",
                "analyzer":"ik_max_word"
            },
            "login_name":{
                "type":"keyword"
            },
            "age":{
                "type":"integer"
            },
            "birthday":{
                "type":"date"
            },
            "desc":{
                "type":"text",
                "analyzer":"ik_max_word"
            },
            "head_url":{
                "type":"text",
                "index":false
            }
        }
    }
}

 

2.2 創建文檔

此處只舉幾個例子

POST  //192.168.1.11:9200/index_user/_doc/1

參數:

{
    "user_id":"1",
    "name":"殭屍獵手",
    "login_name":"jsls",
    "age":25,
    "birthday":"1990-03-01",
    "desc":"我是一名房產經紀人,現在轉行了,目前是一名運輸工人",
    "head_url":"//www.zhuifengren.cn/img/jsls.jpg"
}

POST  //192.168.1.11:9200/index_user/_doc/2

參數:

{
    "user_id":"2",
    "name":"夏維爾",
    "login_name":"xwe",
    "age":28,
    "birthday":"1992-06-06",
    "desc":"我是一名高級開發經理,每天坐地鐵上班,在北京住,從不堵車",
    "head_url":"//www.zhuifengren.cn/img/xwe.jpg"
}

POST  //192.168.1.11:9200/index_user/_doc/3

參數:

{
    "user_id":"3",
    "name":"迪士尼在逃仙柔",
    "login_name":"dsnzxr",
    "age":10,
    "birthday":"2011-06-22",
    "desc":"我是一名五年級的小學生,每天專車接專車送,中午在學校入伙,食堂菜可好了,上學期期末考試我拿了三好學生獎",
    "head_url":"//www.zhuifengren.cn/img/dsnzxr.jpg"
}

 

……………………

 

3. 高級搜索(DSL搜索)(上篇)

3.1 在url中指定查詢條件(非DSL搜索)

GET  //192.168.1.11:9200/index_user/_doc/_search?q=desc:一名&q=age:10

desc 是索引中的一個字段,一名 是需要檢索的關鍵字

age 是索引中的一個字段,10是要查的值

 

此方式用的比較少。

 

3.2 DSL基本查詢

POST  //192.168.1.11:9200/index_user/_doc/_search

參數:

{
    "query":{
        "match":{
            "desc":"一名"
        }
    }
}

 

3.3 文檔中是否存在某字段

文檔中存在該字段,就會被查出來

POST  //192.168.1.11:9200/index_user/_doc/_search

參數:

{
    "query":{
        "exists":{
            "field":"name"
        }
    }
}

 

3.4 查詢所有 

POST  //192.168.1.11:9200/index_user/_doc/_search

參數:

{
    "query":{
        "match_all":{}
    }
}

 

3.5 查詢部分字段

POST  //192.168.1.11:9200/index_user/_doc/_search

參數:

{
    "query":{
        "match_all":{}
    },
    "_source": [
        "user_id",
        "name"
    ]
}

 

3.6 分頁

POST  //192.168.1.11:9200/index_user/_doc/_search

參數:

{
    "query":{
        "match_all":{}
    },
    "from":0,   // 從哪條文檔開始,文檔下標從 0 開始
    "size":10   // 每頁多少條文檔
}

 

 3.7 term查詢

term查詢,不會將關鍵字分詞,直接拿來查詢。

POST  //192.168.1.11:9200/index_user/_doc/_search 

參數:

{
    "query":{
        "term":{
            "desc":"一名"
        }
    }
}

 

3.8 match查詢

match查詢,會將關鍵字先分詞,然後用每一個分詞去查詢,最後將結果取並集。

POST  //192.168.1.11:9200/index_user/_doc/_search 

參數:

{
    "query":{
        "match":{
            "desc":"一名小學生"
        }
    }
}

 

3.9 terms查詢

與term查詢類似,可以寫多個關鍵字,會用每個關鍵字去查詢,最後將結果取並集。

POST  //192.168.1.11:9200/index_user/_doc/_search 

參數:

{
    "query":{
        "terms":{
            "desc":[
                "一名",
                "小學生"
            ]
        }
    }
}

 

3.10 match_phrase查詢

與match類似,會先將關鍵字分詞,然後用每個分詞去查詢,但會對文檔中分詞間的間隔有一定限制,使用slop屬性去限制,默認是0,需要小於設置的間隔,才能匹配文檔。

例如:slop設置為0,則兩個分詞在文檔中的位置必須是緊挨着,否則無法命中。

POST  //192.168.1.11:9200/index_user/_doc/_search 

參數:

{
    "query":{
        "match_phrase":{
            "desc":{
                "query": "一名 學生",
                "slop":8
            }
        }
    }
}

 

3.11 match查詢擴展

1)match查詢後,結果取交集

POST  //192.168.1.11:9200/index_user/_doc/_search 

參數:

{
    "query":{
        "match":{
            "desc": {
                "query": "一名小學生",
                "operator": "and"
            }
        }
    }
}

 

2)指定匹配率

指定為整數,意思是文檔匹配分詞的最小個數,例如設置為3,意思是有關鍵字中3個分詞命中文檔就可以被查出來。

指定為百分比,意思是匹配關鍵字分詞的百分比,例如設置為60%,如果關鍵字分詞數量是4,則匹配的關鍵字分詞數除以總數大於60%就可以被查出來。

POST  //192.168.1.11:9200/index_user/_doc/_search 

參數:

{
    "query":{
        "match":{
            "desc": {
                "query": "一名小學生",
                "minimum_should_match":"3"  // 或 "minimum_should_match":"60%"
} } } }

 

3.12 使用id集合查詢

POST  //192.168.1.11:9200/index_user/_doc/_search 

參數:

{
    "query": {
        "ids":{
            "type":"_doc",
            "values":["1","3"]
        }
    }
}

 

3.13 match的多字段查詢

當字段名稱寫為  “name^10″時,意思是將 name 字段的權重提升10倍,則命中name的文檔分數會高,排序會靠前。

POST  //192.168.1.11:9200/index_user/_doc/_search 

參數:

{
    "query":{
        "multi_match":{
            "query":"一名小學生 殭屍",
            "fields":[
                    "desc",
                    "name"   // "name^10"
                ]
        }
    }
}

 

4. 綜述

今天簡單聊了一下 Elasticsearch(ES)的高級搜索(DSL搜索)的一部分內容,希望可以對大家的工作有所幫助。

歡迎大家幫忙點贊、評論、加關注 :)

關注追風人聊Java,每天更新Java乾貨。