前言:建議kibana語法必定要學好!html
1 軟件安裝java
1.1 ES的安裝node
第一步:解壓壓縮包,放到一個沒有中文沒有空格的位置mysql
第二步:修改配置文件sql
一、 jvm.options 第22和23行數據庫
-Xms128mjson
-Xmx128mapi
二、 elasticsearch.yml 第33行和37行app
path.data: D:\class96\elasticsearch-6.2.4\data框架
#
# Path to log files:
#
path.logs: D:\class96\elasticsearch-6.2.4\logs
第三步:直接雙擊批處理文件
效果以下:
兩個端口號
9200 http協議的端口號
9300 tcp協議的端口號
使用http訪問
1.2 安裝操做ES的客戶端軟件Kibana
須要說明的是:
一、Kibana軟件的版本必定要和ES的版本保持一致
二、Kibana須要依賴nodejs的環境
第一步:安裝nodejs
雙擊安裝
驗證安裝效果
Dos窗口中輸入 node –v
第二步:安裝kibana,解壓
第三步:構建kibana和ES的關聯關係
第21行
elasticsearch.url: http://localhost:9200
第四步:啓動kibana
雙擊啓動
1.3 安裝IK分詞器
第一步:解壓
第二步:把改完名爲ik的文件夾直接拷貝到es軟件的plugins文件夾下
第三步:重啓ES軟件
第四步:在kibana中測試
IK分詞器提供了兩種分詞效果
Ik_max_word
Ik_smart
2 瞭解幾個概念
mysql數據庫 |
ES |
Database |
Indices index的複數 |
Table |
Type 通常一個索引庫中只有一個type |
數據 |
Document |
約束 列存儲什麼數據類型之類的 |
Mapping 規定字段什麼數據類型、什麼分詞器 |
Column |
Field |
3 Kibana的操做
1.4 操做索引庫index
建立索引庫 heima表明一個索引庫的名稱
put heima
get heima
delete heima
1.5 操做映射和類型
好比:建立一個商品類型goods 有一下字段 goodsName price image
一、建立類型而且制定每一個字段的屬性(數據類型、是否存儲、是否索引、哪一種分詞器)
put heima/_mapping/goods
{
"properties":{
"goodsName":{
"type":"text",
"analyzer":"ik_max_word",
"index":true,
"store":true
},
"price":{
"type":"double",
"index":true,
"store":true
},
"image":{
"type":"keyword",
"index":false,
"store":true
}
}
}
二、查看映射
get heima/_mapping[/goods]
三、 一塊兒建立索引庫和映射+類型
put heima2
{
"mappings": {
"goods": {
"properties": {
"goodsName": {
"type": "text",
"store": true,
"analyzer": "ik_max_word"
},
"image": {
"type": "keyword",
"index": false,
"store": true
},
"price": {
"type": "double",
"store": true
}
}
}
}
}
1.6 操做document
post heima/goods
{
"goodsName":"小米6X手機",
"price":1199,
"image":"http://image.im.com/123.jpg"
}
效果:
根據id查詢文檔
get heima/goods/MaZWNmwBTaoWGIHgAuHg
put heima/goods/2
{
"goodsName":"小米6X手機",
"price":1199,
"image":"http://image.im.com/123.jpg"
}
使用put和post是同樣的效果 根據id修改,若是沒有id就是新增
DELETE heima/goods/MaZWNmwBTaoWGIHgAuHg
DELETE heima/goods/1
put heima3
{
"mappings": {
"goods": {
"properties": {
"goodsName": {
"type": "text",
"store": true,
"analyzer": "ik_max_word"
},
"image": {
"type": "keyword",
"index": false,
"store": true
},
"price": {
"type": "double",
"store": true
}
},
"dynamic_templates":[
{
"myString":{
"match_mapping_type":"string",
"mapping":{
"type":"keyword"
}
}
}
]
}
}
}
新增數據
get heima3/_mapping
{
"goodsName":"小米6X手機",
"price":1199,
"image":"http://image.im.com/123.jpg",
"brand":"小米"
}
查看brand的映射
2.1 MatchAll
get heima/_search
{
"query":{
"match_all": {}
}
}
get heima/_search
{
"query":{
"term": {
"goodsName":"小米"
}
}
}
2.2 分詞match
get heima/_search
{
"query":{
"match": {
"goodsName": "小米手機"
}
}
}
2.3 Range範圍查詢
get heima/_search
{
"query":{
"range": {
"price": {
"gte": 100,
"lte": 1000
}
}
}
}
2.4 Fuzzy容錯
get heima/_search
{
"query":{
"fuzzy": {
"goodsName": {
"value": "大米",
"fuzziness": 1
}
}
}
}
2.5 Bool組合查詢
get heima/_search
{
"query":{
"bool":
{
"must": {"match":{"goodsName":"手機"}},
"must_not": {"range":{"price": {
"gte": 100,
"lte": 1000
}
}
}
}
}
}
3.1 、顯示字段的過濾
get heima/_search
{
"_source":{
"excludes":["goodsName"] //排除 不顯示goodsName
"includes":["goodsName"] //只顯示goodsName
},
"query":{
"match_all": {}
}
}
}
3.2 、查詢結果的過濾
get heima/_search
{
"query":{
"bool": {
"must": {"term":{"goodsName":"手機"}},
"filter": {
"range": {
"price": {
"gte": 2000,
"lte": 5000
}
}
}
}
}
}
}
4 分頁 和mysql分頁一致的(重點)
get heima/_search
{
"query":{
"match_all": {}
},
"from":0, 起始位置 和mysql同樣 (當前頁-1)*size
"size":2
}
}
5 排序(重點)
get heima/_search
{
"query":{
"match_all": {}
},
"from":0,
"size":10,
"sort":{
"price":"desc"
}
}
}
6 高亮(重點)
get heima/_search
{
"query":{
"term": {
"goodsName": "小米"
}
},
"highlight":{
"pre_tags": "<font style='color:red'>",
"post_tags": "</font>",
"fields": {
"goodsName": {}
}
}
}
}
7 聚合(瞭解)
Min max count avg sum group by
桶: 就是group by 根據什麼分組
度量:聚合函數的結果
3.3 建立測試數據
一、測試數據:
PUT /car
{
"mappings": {
"orders": {
"properties": {
"color": {
"type": "keyword"
},
"make": {
"type": "keyword"
}
}
}
}
}
POST /car/orders/_bulk
{ "index": {}}
{ "price" : 10000, "color" : "紅", "make" : "本田", "sold" : "2014-10-28" }
{ "index": {}}
{ "price" : 20000, "color" : "紅", "make" : "本田", "sold" : "2014-11-05" }
{ "index": {}}
{ "price" : 30000, "color" : "綠", "make" : "福特", "sold" : "2014-05-18" }
{ "index": {}}
{ "price" : 15000, "color" : "藍", "make" : "豐田", "sold" : "2014-07-02" }
{ "index": {}}
{ "price" : 12000, "color" : "綠", "make" : "豐田", "sold" : "2014-08-19" }
{ "index": {}}
{ "price" : 20000, "color" : "紅", "make" : "本田", "sold" : "2014-11-05" }
{ "index": {}}
{ "price" : 80000, "color" : "紅", "make" : "寶馬", "sold" : "2014-01-01" }
{ "index": {}}
{ "price" : 25000, "color" : "藍", "make" : "福特", "sold" : "2014-02-12" }
Term的聚合:根據color分組
3.4 演示聚合
get /car/orders/_search
{
"size":0,
"aggs":{
"populor_color":{
"terms": {
"field": "color",
"size": 10
}
}
}
}
3.5 聚合中計算平均值
get /car/orders/_search
{
"size":0,
"aggs":{
"populor_color":{
"terms": {
"field": "color",
"size": 10
},
"aggs": {
"avg_price": {
"avg": {
"field": "price"
}
}
}
}
}
}
8 使用java操做ES
Java代碼操做ES有三種方式
一、ES原生api
二、ES rest風格api
三、SpringDataElasticSearch框架操做ES
https://www.elastic.co/guide/en/elasticsearch/client/index.html
第一步:建立maven項目 導入兩個依賴
<dependencies>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>6.2.4</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.35</version>
</dependency>
</dependencies>
第二步:在代碼中準備client
public class EsManager {
private TransportClient client = null;
@Before
public void init() throws Exception{
client = new PreBuiltTransportClient(Settings.EMPTY)
.addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
}
@After
public void end(){
client.close();
}
}
第三步:各類查詢
@Test
public void queryTest() throws Exception{
// QueryBuilder queryBuilder = QueryBuilders.matchAllQuery();
// QueryBuilder queryBuilder = QueryBuilders.matchQuery("goodsName","小米手機");
// QueryBuilder queryBuilder = QueryBuilders.termQuery("goodsName","小米");
// FuzzyQueryBuilder queryBuilder = QueryBuilders.fuzzyQuery("goodsName", "大米");
// queryBuilder.fuzziness(Fuzziness.ONE);
// QueryBuilder queryBuilder = QueryBuilders.rangeQuery("price").gte(1000).lte(2000);
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
queryBuilder.must(QueryBuilders.rangeQuery("price").gte(1000).lte(8000));
queryBuilder.mustNot(QueryBuilders.termQuery("goodsName", "華爲"));
SearchResponse searchResponse = client.prepareSearch("heima").setQuery(queryBuilder).get();
SearchHits searchHits = searchResponse.getHits();
long totalHits = searchHits.getTotalHits();
System.out.println("總記錄數:"+totalHits);
SearchHit[] hits = searchHits.getHits();
for (SearchHit hit : hits) {
String sourceAsString = hit.getSourceAsString();
Goods goods = JSON.parseObject(sourceAsString, Goods.class);
System.out.println(goods); } }