Elastic Search對Document的搜索

在ES中使用的重點。ES中存儲的數據。核心就是爲了提供全文搜索能力的。搜索功能很是重要。多練。

php

1 query string search
search的參數都是相似http請求頭中的字符串參數提供搜索條件的。
GET [/index_name/type_name/]_search[?parameter_name=parameter_value&...]
如: 全數據搜索。也就是沒有搜索條件。
GET /test_index/my_type/_search
結果:java

{
    "took": 8, # 執行的時長。單位毫秒。
    "timed_out": false, # 是否超時
    "_shards": { # shard 相關數據
        "total": 5, # 總計多少個shard
        "successful": 5, # 成功返回結果的shard數量
        "skipped": 0,
        "failed": 0
    },
    "hits": { # 搜索結果相關數據,
        "total": 3, # 總計多少數據,符合搜索條件的數據數量。
        "max_score": 1, # 最大相關度分數。和搜索條件的匹配度。
        "hits": [ # 具體的搜索結果
            {
                "_index": "test_index", # 索引名稱
                "_type": "my_type", # 類型名稱
                "_id": "2", # id值
                "_score": 1, # 匹配度分數,本條數據匹配度分數
                "_source": { # 具體的數據內容,源
                    "name": "test_doc_02",
                    "remark": "second test elastic search",
                    "order_no": 2
                }
            }
        ]
    }
}

  

GET /index_name/type_name/_search?q=field_name:key_word&sort=field_name:order
如:
GET /test_index/my_type/_search?q=remark:test&sort=order_no:desc
結果:spa

{
    "took":17,
    "timed_out":false,
    "_shards":{
        "total":5,
        "successful":5,
        "skipped":0,
        "failed":0
    },
    "hits":{
        "total":3,
        "max_score":null,
        "hits":[
            {
                "_index":"test_index",
                "_type":"my_type",
                "_id":"3",
                "_score":null,
                "_source":{
                    "name":"test_doc_03",
                    "remark":"third test elastic search",
                    "order_no":3
                },
                "sort":[
                    3
                ]
            },
            {
                "_index":"test_index",
                "_type":"my_type",
                "_id":"2",
                "_score":null,
                "_source":{
                    "name":"test_doc_02",
                    "remark":"second test elastic search",
                    "order_no":2
                },
                "sort":[
                    2
                ]
            },
            {
                "_index":"test_index",
                "_type":"my_type",
                "_id":"1",
                "_score":null,
                "_source":{
                    "name":"test_doc_01",
                    "remark":"first test elastic search",
                    "order_no":1
                },
                "sort":[
                    1
                ]
            }
        ]
    }
}

注意:此搜索操做通常只用在快速檢索數據使用,若是查詢條件複雜,很難構建query string。生產環境中不多使用。如:要求搜索條件爲商品名稱包含手機,價格在1000~5000之間,銷量在每個月500以上,根據價格升序排列,分頁查詢第二頁,每頁40條數據。
?q=xxxx:xxx&range=xxx:xxx:xxx&aggs&sort&from&size.net


2 query DSL
DSL - Domain Specified Language , 特殊領域的語言。blog

GET /index_name/type_name/_search
{
    "commond":{ "parameter_name" : "parameter_value"}
}

  


如:查詢全部數據排序

GET /test_index/my_type/_search
{
    "query" : { "match_all" : {} }
}

  


如:條件查詢,排序索引

GET /test_index/my_type/_search
{
    "query" : {
        "match" : {
            "remark" : "test"
        }
    },
    "sort" : [
        { "order_no" : "asc" }
    ]
}

  


如:分頁查詢ip

GET /test_index/my_type/_search
{
   "query" : { "match_all" : {} },
   "from" : 1, # 從第幾條數據開始查詢,從0開始計數
   "size" : 2, # 查詢多少數據。
   "sort" : [
      { "order_no" : "asc" }
   ]
}

 


如:查詢部分字段ci

GET /test_index/my_type/_search
{
    "query": {
        "match": {
            "tags": "java"
        }
    },
    "sort": [
        {
            "age": {
                "order": "desc"
            }
        }
    ],
    "_source": ["name", "tags"], 
    "from": 1,
    "size": 1
}

注意:此搜索操做適合構建複雜查詢條件,生產環境經常使用。rem

3 query filter
過濾查詢。此操做實際上就是query DSL的補充語法。過濾的時候,不進行任何的匹配分數計算,相對於query來講,filter相對效率較高。Query要計算搜索匹配相關度分數。Query更加適合複雜的條件搜索。
如:使用符合條件查詢。搜索tags中包含java字符串的數據,且年齡在20~25之間。
不使用filter, 年齡須要計算相關度分數GET /test_index/my_type/_search

{
     "query": {
         "bool": { # 多條件搜索,內部的若干條件,只要有正確結果,便可。
             "must": [ # 必須,內部若干條件,必須都匹配纔有結果
                 {"match": { # 匹配, 字段中必須匹配對應數據纔有結果
                     "tags": "java"
                 }},
                 {"range": { # 範圍, 字段的數據必須知足某範圍纔有結果。
                     "age": {
                         "gte": 20, # 比較符號 lt gt lte gte
                         "lte": 25
                     }
                 }}
             ]
         }
    }
}

  

 

使用filter, 假設年齡不須要計算任何的相關度分數。

GET /test_index/my_type/_search
{
    "query": {
        "bool": { # 多條件搜索,內部的若干條件,只要有正確結果,便可。
        "must": [ # 必須,內部若干條件,必須都匹配纔有結果
            {"match": { # 匹配, 字段中必須匹配對應數據纔有結果
                "tags": "java"
            }},
            {"range": { # 範圍, 字段的數據必須知足某範圍纔有結果。
                "age": {
                    "gte": 20, # 比較符號 lt gt lte gte
                    "lte": 25
                }
            }}
            ]
        }
    }
}

  


4 full-text search
全文檢索。要求查詢條件拆分後的任意詞條與具體數據匹配就算搜索結果。查詢結果順序默認與匹配度分數相關。
搜索 tags中包含 java php .net的數據。

GET /test_index/my_type/_search
{
    "query": {
        "match": {
            "tags": "java php .net sales"
        }
    }
}

  

 

5 phrase search
短語檢索。要求查詢條件必須和具體數據徹底匹配纔算搜索結果。

GET /test_index/my_type/_search
{
     "query": {
         "match_phrase": {
             "tags": "java developer"
         }
     }
}

  


6 highlight display
高亮顯示。高亮不是搜索條件,是顯示邏輯。在搜索的時候,常常須要對條件實現高亮顯示。

GET /test_index/my_type/_search
{
    "query": {
        "match": {
            "tags": "java sales developer"
        }
    },
    "highlight": {
         "fields": {
             "tags": {
                 "number_of_fragments": 1,
                 "fragment_size": 1
             }
         }
    }
}
相關文章
相關標籤/搜索