Elasticsearch 2.20 搜索詳解

TodThurston 8年前發布 | 12K 次閱讀 ElasticSearch 搜索引擎

來自: http://my.oschina.net/secisland/blog/614690


    之前的文章中簡單介紹過搜索,在這里對搜索進行詳細的介紹。在之前的介紹中可以知道,搜索有兩種方式,一種是通過url參數進行搜索,另一種是通過POST請求參數進行搜索。

url參數搜索

請求:GET http://localhost:9200/secilog/log/_search?參數,多個參數用&分來。

參數詳解:

參數 解釋
q 查詢字符串,例如:q=syslog
df 查詢中沒有定義前綴的時候默認使用的字段
analyzer 當分析查詢字符串的時候使用的分詞器
lowercase_expanded_terms 搜索的時候忽略大小寫標志,默認為true
analyze_wildcard 通配符或者前綴查詢是否被分析,默認false
default_operator 默認多個條件的關系,AND或者OR,默認OR
lenient 如果設置為true,字段類型轉換失敗的時候將被忽略,默認為false
explain 在每個返回結果中,將包含評分機制的解釋
_source 是否包含元數據,同時支持_source_include 和_source_exclude
fields 只放回索引中指定的列,多個列中間用逗號分開
sort 排序,例如fieldName:asc或者fieldName:desc
track_scores 評分軌跡,當排序的時候,設置為true的時候返回評分的信息
timeout 超時的時間設置
terminate_after 在每個分片中查詢的最大條數,如果設置返回結果中會有一個terminated_early字段
from 開始的記錄數
size 搜索結果中的條數
search_type 搜索的類型,可以是dfs_query_then_fetch,query_then_fetch,默認query_then_fetch

POST請求參數

請求:POST http://localhost:9200/secilog/log/_search

參數在請求頭中。

參數是JSON格式的查詢領域語法(query dsl)。例如:

{
    "query" : {
        "term" : { "type" : "syslog" }
    }
}

返回的結果:

{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 1.0,
    "hits" : [ {
      "_index" : "secilog",
      "_type" : "log",
      "_id" : "1",
      "_score" : 1.0,
      "_source" : {
        "type" : "syslog",
        "message" : "secilog test test test "
      }
    } ]
  }
}

    如果需要搜索分頁,可以通過from size組合來進行。from表示從第幾行開始,size表示查詢多少條文檔。from默認為0,size默認為10,例如:

{
    "from" : 0, "size" : 10,
    "query" : {
        "term" : { "type" : "syslog" }
    }
}

注意:size的大小不能超過index.max_result_window這個參數的設置,默認為10,000。

排序sort

    可以通過一個或者多個字段進行排序。例如:

{
"sort" : [
         {"type" :{"order": "asc"}},
         {"message" :{"order": "asc"}},
    ]
}

返回的結果為:

{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "failed" : 0
  },
  "hits" : {
    "total" : 2,
    "max_score" : null,
    "hits" : [ {
      "_index" : "secilog",
      "_type" : "log",
      "_id" : "2",
      "_score" : null,
      "_source" : {
        "type" : "file",
        "message" : "Another secilog test "
      },
      "sort" : [ "file", "test" ]
    }, {
      "_index" : "secilog",
      "_type" : "log",
      "_id" : "1",
      "_score" : null,
      "_source" : {
        "type" : "syslog",
        "message" : "secilog test test test "
      },
      "sort" : [ "syslog", "test" ]
    } ]
  }
}

    當一個字段的內容有多個值的時候,系統支持一些計算進行排序,包括min,max,sum,avg,median(中間值),例如下面的請求表示order有多個值,取平均值排序:

{
   "query" : {
    ...
   },
   "sort" : [
      {"price" : {"order" : "asc", "mode" : "avg"}}
   ]}

數據列過濾

    數據列過濾允許在查詢的時候不顯示原始數據或者顯示部分原始字段。例如不顯示原始文檔:

{
    "_source": false,
    "query" : {
        "term" : { "type" : "syslog" }
    }}

例如顯示部分文檔列:

{
    "_source": "obj.*",
    "query" : {
        "term" : { "type" : "syslog" }
    }
}
{
    "_source": [ "obj1.*", "obj2.*" ],
    "query" : {
        "term" : { "type" : "syslog" }
    }
}

例如可以包含或者排除某些列:

{
    "_source": {
        "include": [ "obj1.*", "obj2.*" ],
        "exclude": [ "*.description" ]
    },
    "query" : {
         "term" : { "type" : "syslog" }
    }
}

腳本支持

同樣對搜索也支持腳本,例如:

請求:POST http://localhost:9200/secilog/log/_search?pretty

參數:

{
    "query": {
        "term": {
            "type": "syslog"
        }
    }, 
    "script_fields": {
        "test1": {
            "script": "doc['type'].value * 2"
        }
    }
}

得到返回結果:

{
  "took" : 16,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 1.0,
    "hits" : [ {
      "_index" : "secilog",
      "_type" : "log",
      "_id" : "1",
      "_score" : 1.0,
      "fields" : {
        "test1" : [ "syslogsyslog" ]
      }
    } ]
  }
}

    賽克藍德(secisland)后續會逐步對Elasticsearch的最新版本的各項功能進行分析,近請期待。也歡迎加入secisland公眾號進行關注

 本文由用戶 TodThurston 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!