hadoop生態--ElasticSearch--ES操做

拋開細節不提,記住ES就是一個數據庫(只是整個數據庫有些特殊,話說回來,哪一個數據庫沒點本身的特色呢:) ),因此不少ES的中的概念咱們能夠類比普通的數據庫來幫助理解和記憶,爲了學習這個數據庫呢,咱們須要先了解幾個概念html

1、ES中幾個重要概念:java

索引:Index  注意不是luence中的索引的概念,至關於數據庫中的DataBase  ,在ES中建一個索引,能夠類比爲在mysql中建立了一個databasemysql

類型:Type  至關於數據庫中的tablelinux

主鍵:id  至關於數據庫中的主鍵sql

因此,向ES中存儲數據,就是往ES中的Index下的Type中存儲數據,數據格式爲JSON。數據庫


那麼如何對這個數據庫進行操做呢?建索引、存數據,查數據…… ES提供了多種方式:如RESTFul風格api、java api等。json

2、RESTFul風格APIapi

這種方式就是經過http形式發送請求,對ES進行操做。數組

接口URL格式:緩存

http://host_IP:9200/<Index>/<Type>/[<id>]

index和type必須提供,id是可選的,不提供es會自動生成。index、type將信息進行分層,利於管理。index能夠理解爲數據庫;type理解爲數據表;id至關於數據庫表中記錄的主鍵,是惟一的。

查詢的請求方式  GET

#在linux中經過curl的方式查詢
curl -XGET 'http://192.168.10.18:9200/store/books/1'
# 經過_source獲取指定的字段
curl -XGET 'http://192.168.10.16:9200/store/books/1?_source=title'
curl -XGET 'http://192.168.10.16:9200/store/books/1?_source=title,price'
curl -XGET 'http://192.168.10.16:9200/store/books/1?_source'

刪除  DELETE

#刪除一個文檔
curl -XDELETE 'http://192.168.10.16:9200/store/books/1'

添加  PUT/POST

#向store索引中添加一些書籍,若是數據已經存在,會經過覆蓋的方式對數據進行更新
curl -XPUT 'http://192.168.10.16:9200/store/books/1' -d '{
  "title": "Elasticsearch: The Definitive Guide",
  "name" : {
    "first" : "Zachary",
    "last" : "Tong"
  },
  "publish_date":"2015-02-06",
  "price":"49.99"
}'

修改  PUT/POST  

#能夠經過覆蓋的方式更新
curl -H "Content-Type: application/json" -XPUT 'http://192.168.10.16:9200/store/books/1' -d '{
  "title": "Elasticsearch: The Definitive Guide",
  "name" : {
    "first" : "Zachary",
    "last" : "Tong"
  },
  "publish_date":"2016-02-06",
  "price":"99.99"
}'

# 或者經過 _update  API的方式單獨更新你想要更新的
curl -XPOST 'http://192.168.10.16:9200/store/books/1/_update' -d '{
  "doc": {
     "price" : 88.88
  }
}'

建立索引

#建立索引名字叫news
curl -XPUT http://192.168.100.211:9200/news

爲索引建立mapping

建立mapping(至關於數據中的schema信息,約束type表名和字段名以及字段的類型)

curl -XPOST http://192.168.100.211:9200/news/fulltext/_mapping -d'
{
        "properties": {
            "content": {
                "type": "text",
                "analyzer": "ik_max_word",
                "search_analyzer": "ik_max_word"
            }
        }
}'

 

curl -XPUT 'https://192.168.100.211:9200/iktest?pretty' -d '{
    "settings" : {
        "analysis" : {
            "analyzer" : {
                "ik" : {
                    "tokenizer" : "ik_max_word"
                }
            }
        }
    },
    "mappings" : {
        "article" : {
            "dynamic" : true,
            "properties" : {
                "subject" : {
                    "type" : "string",
                    "analyzer" : "ik_max_word"
                }
            }
        }
    }
}'

添加文本內容

curl -H "Content-Type: application/json" -XPOST http://192.168.1.237:9200/news/fulltext/1 -d'
{"content":"美國留給伊拉克的是個爛攤子嗎"}'

curl -H "Content-Type: application/json" -XPOST http://192.168.1.237:9200/news/fulltext/2 -d'
{"content":"公安部:各地校車將享最高路權"}'

curl -H "Content-Type: application/json" -XPOST http://192.168.1.237:9200/news/fulltext/3 -d'
{"content":"中韓漁警衝突調查:韓警平均天天扣1艘中國漁船"}'

curl -H "Content-Type: application/json" -XPOST http://192.168.1.237:9200/news/fulltext/4 -d'
{"content":"中國駐洛杉磯領事館遭亞裔男子槍擊 嫌犯已自首"}'

curl -H "Content-Type: application/json" -XPOST http://192.168.1.2371:9200/news/fulltext/_search  -d'
{
    "query" : { "match" : { "content" : "中國" }},
    "highlight" : {
        "pre_tags" : ["<font color='red'>", "<tag2>"],
        "post_tags" : ["</font>", "</tag2>"],
        "fields" : {
            "content" : {}
        }
    }
}'

 

發起分詞請求

指定最大分詞或智能分詞

curl -XGET 'http://192.168.100.211:9200/_analyze?pretty&analyzer=ik_max_word' -d '聯想是全球最大的筆記本廠商'

curl -XGET 'https://192.168.100.211:9200/_analyze?pretty&analyzer=ik_smart' -d '聯想是全球最大的筆記本廠商'

 


3、ES查詢

Hats off to the shares

做者:2zju 
來源:CSDN 
原文:https://blog.csdn.net/ifenggege/article/details/86103918

--------------------- 
做者:梧桐和風 
來源:CSDN 
原文:https://blog.csdn.net/wthfeng/article/details/53001218 

https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html

-------------------------------------------------------------------------------------

準確來講,ES中的查詢操做分爲2種:查詢(query)和過濾(filter)。查詢便是以前提到的query查詢,它(查詢)默認會計算每一個返回文檔的得分,而後根據得分排序。而過濾(filter)只會篩選出符合的文檔,並不計算得分,且它能夠緩存文檔。因此,單從性能考慮,過濾比查詢更快。

換句話說,過濾適合在大範圍篩選數據,而查詢則適合精確匹配數據。通常應用時,應先使用過濾操做過濾數據,而後使用查詢匹配數據。

例如:

查詢16年10月以來全部內容含有「java」的文檔,先過濾剩下符合10月的文章,再精確匹配。

{
    "query": {
        "filtered": {
            "query": {
                "range": {
                    "date": {
                        "lte": "2016-10-01"
                    }
                }
            },
            "filter": {
                "match": {
                    "contents": "ES"
                }
            }
        }
    }
}

 

過濾查詢包含filtered關鍵字,裏面又包含普通的查詢query邏輯和filter 過濾邏輯。運行時先執行過濾語句,後執行普通查詢。對比下面只使用了查詢的DSL,二者返回結果相同

{
    "query": {
        "bool":{
            "must":[{
                "range":{
                    "date":{
                        "lte":"2016-10-01"
                    }
                }
            },{
                "match":{
                    "contents":"ES"
                }
            }]
        }       
    }
}

 

 

3-1 term query 和 terms query

term至關於=

查詢的字段只有一個值的時候,應該使用term而不是terms,在查詢字段包含多個的時候才使用terms,使用terms語法,json中必須包含數組。

match在匹配時會對所查找的關鍵詞進行分詞,而後按分詞匹配查找,而term會直接對關鍵詞進行查找。通常模糊查找的時候,多用match,而精確查找時能夠使用term
3-2 match query  

match至關於like

一、match

二、match_all

三、multi_match 多字段查詢

若是想要再一個搜索中查詢多個字段,好比使用一個查詢關鍵字同時在title和summery中查詢,能夠使用multi_match查詢。

#name和author都必須包含Guide,而且價錢等於33.99或者188.99
curl -XGET 'http://192.168.10.16:9200/store/books/_search' -d '{
    "query": {
        "bool": {
            "must": {
                "multi_match": {
                    "operator": "and",
                    "fields": [
                        "name",
                        "author"
                    ],
                    "query": "Guide"
                }
            },
            "filter": {
                "terms": {
                    "price": [
                        35.99,
                        188.99
                    ]
                }
            }
        }
    }
}'

3-3 bool query

bool查詢包含must,should,must_not,用於鏈接多個查詢條件

格式以下:
{
  "bool" : {
    "must" : [],
    "should" : [],
    "must_not" : [],
  }
}

must: 條件必須知足,至關於 and
should: 條件能夠知足也能夠不知足,至關於 or
must_not: 條件不須要知足,至關於 not

SELECT * FROM books WHERE (price = 35.99 OR price = 99.99) AND publish_date != "2016-02-06"

curl -XGET 'http://192.168.10.16:9200/store/books/_search' -d '{
  "query" : {
    "bool" : {
      "should" : [
        { "term" : {"price" : 35.99}},
        { "term" : {"price" : 99.99}}
      ],
      "must_not" : {
        "term" : {"publish_date" : "2016-02-06"}
      }
    }
  }
}'

 

 

 

3-1 term query 和 terms query

查詢的字段只有一個值得時候,應該使用term而不是terms,在查詢字段包含多個的時候才使用terms,使用terms語法,json中必須包含數組。

match在匹配時會對所查找的關鍵詞進行分詞,而後按分詞匹配查找,而term會直接對關鍵詞進行查找。通常模糊查找的時候,多用match,而精確查找時能夠使用term

3-2 match query  
1、match

2、match_all

3、multi_match 多條件查詢

若是想要再一個搜索中查詢多個字段,好比使用一個查詢關鍵字同時在title和summery中查詢,能夠使用multi_match查詢。

3-3 bool query

bool查詢包含四個子句,must,filter,should,must_not



 

{
    "query": {
        "bool": {
            "must": [
                {
                    "term": {
                        "_type": {
                            "value": "age"
                        }
                    }
                },
                {
                    "term": {
                        "account_grade": {
                            "value": "23"
                        }
                    }
                }
            ]
        }
    }
}
 

{
    "bool":{
            "must":{
                "term":{"user":"lucy"}
            },
            "filter":{
                "term":{"tag":"teach"}    
            },
            "should":[
                  {"term":{"tag":"wow"}},
                {"term":{"tag":"elasticsearch"}}
            ],
               "mininum_should_match":1,
               "boost":1.0                      
        }
}


 
boolquery

 

 

{
    "bool":{
            "must":{
                "term":{"user":"lucy"}
            },
            "filter":{
                "term":{"tag":"teach"}    
            },
            "should":[
                  {"term":{"tag":"wow"}},
                {"term":{"tag":"elasticsearch"}}
            ],
               "mininum_should_match":1,
               "boost":1.0                      
        }
}
View Code

3-4 Filter

query和filter的區別:query查詢的時候,會先比較查詢條件,而後計算分值,最後返回文檔結果;而filter是先判斷是否知足查詢條件,若是不知足會緩存查詢結果(記錄該文檔不知足結果),知足的話,就直接緩存結果。

SELECT * FROM books WHERE price = 35.99
filtered 查詢價格是35.99的

# 返回的得分是1.0
curl -XGET 'http://192.168.10.16:9200/store/books/_search' -d '{
  "query": {
    "bool": {
      "must": {
        "match_all": {}
      },
      "filter": {
        "term": {
          "price": 35.99
        }
      }
    }
  }
}'
# 返回的得分是1.0
curl -XGET 'http://192.168.10.16:9200/store/books/_search' -d '{
  "query": {
    "constant_score": {
      "filter": {
        "term": {
          "price": 35.99
        }
      }
    }
  }
}'
# 返回的得分是0.0
curl -XGET 'http://192.168.10.16:9200/store/books/_search' -d '{
    "query": {
        "bool": {
           "filter" : {
                "term" : {
                  "price" : 35.99
                }
            }
        }
    }
}'

 指定多個值,or的關係

#指定多個值
curl -XGET 'http://192.168.10.16:9200/store/books/_search' -d '{
    "query" : {
        "bool" : {
            "filter" : {
                "terms" : {
                    "price" : [35.99, 99.99]
                  }
              }
        }
    }
}'

curl -XGET 'http://192.168.10.16:9200/store/books/_search' -d '{
    "query" : {
        "bool" : {
            "must": {
                "match_all": {}
            },
            "filter" : {
                "terms" : {
                    "price" : [35.99, 99.99]
                  }
              }
        }
    }
}'

 3-5 嵌套查詢

# SELECT * FROM books WHERE price = 35.99 OR ( publish_date = "2016-02-06" AND price = 99.99 )

curl -XGET 'http://192.168.10.16:9200/store/books/_search' -d '{
    "query": {
        "bool": {
            "should": [
                {
                    "term": {
                        "price": 35.99
                    }
                },
                {
                    "bool": {
                        "must": [
                            {
                                "term": {
                                    "publish_date": "2016-02-06"
                                }
                            },
                            {
                                "term": {
                                    "price": 99.99
                                }
                            }
                        ]
                    }
                }
            ]
        }
    }
}'

3-6 range範圍過濾

range範圍過濾
gt : > 大於
lt : < 小於
gte : >= 大於等於
lte : <= 小於等於

SELECT * FROM books WHERE price >= 10 AND price < 99

curl -XGET 'http://192.168.10.16:9200/store/books/_search' -d '{
    "query": {
        "range" : {
            "price" : {
                "gte" : 10,
                "lt" : 99
            }
        }
    }
}

 

 

 

 

查詢結果字段:

_index

_type

_id

_score{}

hits:{}

相關文章
相關標籤/搜索