1. 程式人生 > >通過命令curl 操作ElasticSearch指南

通過命令curl 操作ElasticSearch指南

叢集操作

查詢叢集的名字

⇒  curl -XGET 'http://localhost:9200'
複製程式碼

查詢叢集的健康狀況

⇒  curl -XGET 'http://localhost:9200/_cluster/health?format=yaml'
複製程式碼

status欄位說明:

  1. green 一切正常
  2. yellow replicas沒有分配[可能是隻有單個節點],叢集正常
  3. red 某些資料取不到 format=yaml指定使用yaml格式輸出,方便檢視

索引操作

獲取叢集的所有索引

⇒  curl -XGET 'http://localhost:9200/_cat/indices'
複製程式碼

索引的欄位

⇒  curl -XGET 'http://localhost:9200/mytest/_mapping?format=yaml'
複製程式碼

結果

 mytest:
 mappings:
   external:
  properties:
    addre:
      type: "string"
    name:
      type: "string"
複製程式碼

它類似於資料庫的schema,描述文件可能具有的欄位或屬性、每個欄位的資料型別。

欄位對於非string型別,一般只需要設定type。string域兩重要屬性 index analyzer

index

	1. analyzed 全文索引這個域。首先分析字串,然後索引

	2. not_analyzed 精確索引 ,不分析			

	3. no 此域不會被搜尋
複製程式碼

analyzer

	將文字分成四核倒排索引的獨立詞條,後將詞條統一化提高可搜尋性
複製程式碼

動態對映: 文件中出現之前從未遇到過的欄位,動態確定資料型別,並自動把新的欄位新增到型別對映

新建索引

⇒  curl -XPUT 'localhost:9200/mytest'
複製程式碼

刪除索引

⇒  curl -XDELETE 'localhost:9200/mytest?format=yaml'
複製程式碼

資料查詢

插入單條資料

⇒  curl -XPUT 'localhost:9200/mytest/external/1?format=yaml' -d '
quote> { "name":"paxi"}'
複製程式碼

查詢單條資料

⇒  curl -XGET 'localhost:9200/mytest/external/1?format=yaml'
複製程式碼

刪除單條資料

curl -XDELETE 'localhost:9200/mytest/external/3?format=yaml'
複製程式碼

儲存的文字分析

curl -XGET 'localhost:9200/_analyze?format=yaml' -d '
{"papa xixi write"}'
複製程式碼

結果為

tokens:
- token: "papa"
  start_offset: 3
  end_offset: 7
  type: "<ALPHANUM>"
  position: 1
- token: "xixi"
  start_offset: 8
  end_offset: 12
  type: "<ALPHANUM>"
  position: 2
- token: "write"
  start_offset: 13
  end_offset: 18
  type: "<ALPHANUM>"
  position: 3
複製程式碼

token 表示實際儲存的詞條,position表示詞條在原始文字中的位置。

可以看出完整的文字會被切割儲存成不同的詞條

不返回元資料

curl -XGET 'localhost:9200/mytest/_search?filter_path=hits.hits._source&format=yaml' -d '
{ "query":{"match":{"name":"papa xixi write"}}}'
複製程式碼

低版本無法生效

只返回部分欄位

curl -XGET 'localhost:9200/mytest/_search?format=yaml' -d '
{ "query":{"match":{"name":"papa xixi write"}},"_source":["name"]}'
複製程式碼

低版本無效,可以用萬用字元

match查詢

curl -XGET 'localhost:9200/mytest/_search?format=yaml' -d '
{ "query":{"match":{"name":"papa xixi write"}}}'
複製程式碼

查詢匹配的結果如下

 hits:
  - _index: "mytest"
    _type: "external"
    _id: "11"
    _score: 0.6532502
    _source:
      name: "papa xixi write"
  - _index: "mytest"
    _type: "external"
    _id: "4"
    _score: 0.22545706
    _source:
      name: "papa xixi"
  - _index: "mytest"
    _type: "external"
    _id: "2"
    _score: 0.12845722
    _source:
      name: "papa"
  - _index: "mytest"
    _type: "external"
    _id: "10"
    _score: 0.021688733
    _source:
      name: "xixi"
複製程式碼

從查詢結果,它獲取到了所有包含 papa 、 xixi和write 的詞,相當於將原來的詞拆開,然後兩個單詞做了 OR 操作,如果要全部匹配,可以使用AND操作

curl -XGET 'localhost:9200/mytest/_search?format=yaml' -d '
{ "query":{"match":{"name":{"query":"papa xixi write","operator":"and"}}}}'
---
  hits:
  total: 1
  max_score: 0.6532502
  hits:
  - _index: "mytest"
    _type: "external"
    _id: "11"
    _score: 0.6532502
    _source:
      name: "papa xixi write"
複製程式碼

如果只是想提高精度

 curl -XGET 'localhost:9200/mytest/_search?format=yaml' -d '
{ "query":{"match":{"name":{"query":"papa xixi write","minimum_should_match":"75%"}}}}'
---
hits:
  total: 2
  max_score: 0.6532502
  hits:
  - _index: "mytest"
    _type: "external"
    _id: "11"
    _score: 0.6532502
    _source:
      name: "papa xixi write"
  - _index: "mytest"
    _type: "external"
    _id: "4"
    _score: 0.22545706
    _source:
      name: "papa xixi"
複製程式碼

term查詢

curl -XGET 'localhost:9200/mytest/_search?format=yaml' -d '
{ "query":{"term":{"name":"papa xixi write"}}}'
複製程式碼

它的結果是什麼也沒有查到

 total: 0
  max_score: null
  hits: []
複製程式碼

換用查詢語句

curl -XGET 'localhost:9200/mytest/_search?format=yaml' -d '
{ "query":{"term":{"name":"papa"}}}'
複製程式碼

結果為

 hits:
  - _index: "mytest"
    _type: "external"
    _id: "2"
    _score: 1.0
    _source:
      name: "papa"
  - _index: "mytest"
    _type: "external"
    _id: "4"
    _score: 0.37158427
    _source:
      name: "papa xixi"
  - _index: "mytest"
    _type: "external"
    _id: "11"
    _score: 0.2972674
    _source:
      name: "papa xixi write"
複製程式碼

match 和 term的區別

match 如果在全文欄位上查詢,會使用正確的分析器分析查詢字串;如果精確值欄位使用,會精確匹配。 term精確匹配,只要包含了對應的文字就可以,不對文字分析(not_analyzed文字會精確匹配,terms 多個值只要有一個匹配就匹配);

從"papa xixi write"的儲存文字分析來看,它本身會被切割成不同的詞條,所以用 term查詢"papa xixi write",無法獲取到結果,但是match確能夠匹配

filter使用

curl -XGET 'localhost:9200/mytest/_search?format=yaml' -d '
{ "query":{"filtered":{"filter":{"range":{"name":{"gt":"w"}}}}}}'
複製程式碼

或者

 curl -XGET 'localhost:9200/mytest/_search?format=yaml' -d '
{ "query":{"constant_score":{"filter":{"range":{"name":{"gt":"w"}}}}}}'
複製程式碼

驗證語法是否正確

⇒  curl -XGET 'localhost:9200/_validate/query?explain&format=yaml' -d '{ "query":{{"filter":{"range":{"name":{"gt":"w"}}}}}'
---
valid: false
//原因省略
複製程式碼

bool使用

使用term查詢

 curl -XGET 'localhost:9200/mytest/_search?format=yaml' -d '
{ "query":{"term":{"addre":"beijing"}}}'
複製程式碼

結果為

  hits:
  - _index: "mytest"
    _type: "external"
    _id: "5"
    _score: 0.30685282
    _source:
      addre: "beijing"
  - _index: "mytest"
    _type: "external"
    _id: "6"
    _score: 0.30685282
    _source:
      addre: "beijing"
      name: "px"
複製程式碼

轉換為bool查詢,結果一樣

curl -XGET 'localhost:9200/mytest/_search?format=yaml' -d '
{ query:{bool:{must:{match:{addre:"beijing"}}}}}'
複製程式碼

如果只想要最後一條

curl -XGET 'localhost:9200/mytest/_search?format=yaml' -d '
{ query:{bool:{must:{match:{addre:"beijing"}},must:{match:{name:"px"}}}}}'
複製程式碼

想要第一條

 curl -XGET 'localhost:9200/mytest/_search?format=yaml' -d '
{ query:{bool:{must:{match:{addre:"beijing"}},must_not:{match:{name:"px"}}}}}'
複製程式碼

都想要

curl -XGET 'localhost:9200/mytest/_search?format=yaml' -d '
{ query:{bool:{must:{match:{addre:"beijing"}},should:{match:{name:"px"}}}}}'
複製程式碼

must的意思是當前值必須是有的,must_not必須沒有,should表示資料可以有也可以沒有