ELK-全文檢索技術-kibana操做elasticsearch

 

 

前言:建議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

1.6.1   不指定id的新增

post heima/goods

{

  "goodsName":"小米6X手機",

  "price":1199,

  "image":"http://image.im.com/123.jpg"

}

效果:

 

 

 

根據id查詢文檔

get heima/goods/MaZWNmwBTaoWGIHgAuHg

 

1.6.2   指定id的新增

 

 

 

 

 

1.6.3   修改

put heima/goods/2

{

  "goodsName":"小米6X手機",

  "price":1199,

  "image":"http://image.im.com/123.jpg"

}

 

使用put和post是同樣的效果 根據id修改,若是沒有id就是新增

 

1.6.4   刪除

DELETE heima/goods/MaZWNmwBTaoWGIHgAuHg

DELETE heima/goods/1

 

 

1.6.5   自定義模板(瞭解)

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       查詢(重點)

2.1     MatchAll

get heima/_search

{

  "query":{

    "match_all": {}

  }

}

 

 

2.1     Term

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       過濾(重點)

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);         }     }

相關文章
相關標籤/搜索