1. 程式人生 > 實用技巧 >Elasticsearch 學習(2)

Elasticsearch 學習(2)

Elasticsearch

目錄

Elasticsearch 環境安裝

  1. 下載Elasticsearch

  2. 配置跨域

    http.cors.enabled: true
    http.cors.allow-origin: "*"
    
  3. 下載Elasticsearch-head

  4. 下載操作視覺化工具 kibana

ik 分詞器

先下載 ik 分詞器 放到Elasticsearch 的 plugins 的ik z中

  1. ik_max_word 最細粒度
  2. ik_smart 最小拆分

ik 分詞器配置

​ IKAnalyzer.cfg.xml 配置分詞規則

  1. 自定義自己分詞規則

    • 新建 xx.dic 檔案

    • 配置到IKAnalyzer.cfg.xml

      <entry key="ext_dict">xx.dic</entry>
      
    • 把自己的分詞規則放到 xx.dic 檔案中

索引基本操作

mothod url 地址 描述
PUT localhost:9200/索引名稱/型別名稱/文件id 建立文件(指定文件id)
POST localhost:9200/索引名稱/型別名稱 建立文件(隨機文件id)
POST localhost:9200/索引名稱/型別名稱/文件id/_update 修改文件
DELETE localhost:9200/索引名稱/型別名稱/文件id 刪除文件
GET localhost:9200/索引名稱/型別名稱/文件id 查詢文件通過文件id
POST localhost:9200/索引名稱/型別名稱/_search 查詢所有資料

建立索引

put /索引名稱/型別名/文件id {請求資料}

Elasticsearch 字元型別

  1. 字串型別 text keyword
  2. 數值型別 long integer short byte double float half float scaled
  3. 日期型別 date
  4. 布林值型別 boolen
  5. 二進位制型別 binary
  6. 等等...

指定型別

先新建索引
put  /索引名稱/型別名/文件id {
    "mapping":{
        "properties":{
            "欄位名稱":{
                "type":"型別"
            }
        }
    }
}

獲取資料資訊 Get

​ get 表/文旦 等

預設指定型別 _doc

_cat 它幫助開發者快速查詢Elasticsearch的相關資訊。

修改資料put/update (曾經) post(現在)

刪除 delete

例子 :PUT /test/vus/1 
{
  "name":"什麼說的好的",
  "age":"20"
}

文件的基本操作

基本操作

查詢

GET /索引名稱/型別名稱/文件id(有沒有都可以)/_search?q=條件(如name:java)

結果裡面有個score 匹配度 就是匹配度越高分值越高

複雜操作

查詢 (排序 高亮 )

GET /索引名稱/型別名稱/文件id(有沒有都可以)/_search
{
  "query":{
        "match":{
            條件(例如 "name":"java")
        } 
   },
  "_source":[要查詢的欄位(意思是篩選欄位)],
  "sort":{
	欄位(根據那個欄位排序):{
		"order":"desc/aesc"
     }
  },
--分頁
  "from":0, //從那條資料開始
  "size":20 //一頁有幾條資料
}

根據score 那個更匹配

布林值查詢

GET /索引名稱/型別名稱/文件id(有沒有都可以)/_search
{
  "query":{
        "bool":{
        	"must"( 中有filter/must/must not /should):[
        		{ 
                    "match":
                        {
                            條件("name":"java")
                        },
                     "match":
                        {
                            條件("age":"20")
                        },
                        ........
                
                }
        	],
            "filter"( 中有filter/must/must not /should):[
                        { 
                            "range":
                                {
                                    條件("age"):{
									"gle":"",  //大於等於多少gl是大於
									 "lte":""  //小於等於多少lt是小於
                                     }
                                }
                        }
            ]
        } 
   }
}

must 和sql 中 where 中and相同

should 和where中or相同

mast not 是不等於

匹配多個條件

GET /索引名稱/型別名稱/文件id(有沒有都可以)/_search
{
  "query":{
        "match":{
            條件加空格(例如 "name":"java php" 這是隻要滿足一個條件就可以查出來)
        } 
   }

}

精確查詢

  • term 查詢是直接通過倒排索引指定的詞條程序精確的查詢(直接查詢精確的值 查詢多個值的時候需要重新寫個term 不能直接加空格)

  • match 會使用分詞器解析(通過分析文件 然後在通過分析文件進行查詢)

兩個型別 text和keyword text可以用分詞器解析keyword 不會用分詞器解析

高亮查詢

GET /索引名稱/型別名稱/文件id(有沒有都可以)/_search
{
  "query":{
        "match":{
            條件(例如 "name":"java")
        } 
   },
   "highlight":{ //高亮
       "pre_tags":自定義標籤字首,(如"<B class="hah">")
       "post_tags":自定義的字尾,(如 "</B>")
       "fields":{
       	  欄位:{}  //高亮的欄位
       }
   } 
}

搜尋的結果自動加上一個html標籤 或者自定義的標籤

整合springboot

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.8.1</version>
</dependency>
package com.example.elasticsearch.config;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ElasticSearchConfig {

    @Bean
    public RestHighLevelClient client(){
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(
                        new HttpHost("localhost", 9200, "http"),
                        new HttpHost("localhost", 9201, "http")));
        return client;
    }
}
package com.example.elasticsearch;

import com.alibaba.fastjson.JSON;
import com.example.elasticsearch.vo.user;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.support.master.AcknowledgedResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.CreateIndexResponse;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.TermQueryBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.FetchSourceContext;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

@SpringBootTest
class ElasticsearchApplicationTests {
    @Autowired
    RestHighLevelClient client;
    @Test
    void contextLoads() throws IOException {
        //===========================================================================
        //建立索引
        CreateIndexRequest createIndexRequest = new CreateIndexRequest("哈哈");
        CreateIndexResponse createIndexResponse = client.indices().create(createIndexRequest, RequestOptions.DEFAULT);
        //===========================================================================
        //獲取索引
        GetIndexRequest 哈哈 = new GetIndexRequest("哈哈");
        boolean exists = client.indices().exists(哈哈, RequestOptions.DEFAULT);
        //===========================================================================
        // 刪除索引
        DeleteIndexRequest 哈哈1 = new DeleteIndexRequest("哈哈");
        AcknowledgedResponse acknowledgedResponse= client.indices().delete(哈哈1,RequestOptions.DEFAULT);
        //===========================================================================
        //建立文件
        user user=new user();
        user.setAge(20);
        user.setName("li");
        IndexRequest request = new IndexRequest("哈哈"); //獲取索引
        request.id("1");
        request.timeout(TimeValue.MINUS_ONE);//超時時間
        request.source(JSON.toJSON(user), XContentType.JSON);
        IndexResponse index = client.index(request, RequestOptions.DEFAULT);
        index.status();//獲取執行狀態
        //===========================================================================
        //獲取文件
        GetRequest getRequest = new GetRequest("哈哈","1");
        getRequest.fetchSourceContext(new FetchSourceContext(false));
        boolean exists1 = client.exists(getRequest, RequestOptions.DEFAULT);//判斷是否存在
        GetResponse documentFields = client.get(getRequest, RequestOptions.DEFAULT);
        //===========================================================================
        //更新 文件
        UpdateRequest update = new UpdateRequest("哈哈","1");
        update.timeout("1s");
        user=new user();
        user.setAge(21);
        user.setName("lilong");
        UpdateRequest doc = update.doc(JSON.toJSON(user), XContentType.JSON);
        UpdateResponse update1 = client.update(doc, RequestOptions.DEFAULT);
        //===========================================================================
        //刪除文件
        DeleteRequest deleteRequest = new DeleteRequest("哈哈", "1");
        deleteRequest.timeout("1s");
        DeleteResponse delete = client.delete(deleteRequest, RequestOptions.DEFAULT);
        delete.status();
        //===========================================================================
        //批量請求
        BulkRequest bulkRequest=new BulkRequest();
        List<user> usr = new ArrayList<>();
        for (int i=0;i<usr.size();i++){ //批量刪除 更新在這更改就可以了
            bulkRequest.add(new IndexRequest("哈哈").id("1"+i).source(JSON.toJSON(usr.get(i)),XContentType.JSON));
        }
        BulkResponse bulk = client.bulk(bulkRequest, RequestOptions.DEFAULT);
        bulk.hasFailures();//是否執行成功

        //===========================================================================

        //查詢
        SearchRequest searchResponse=new SearchRequest("哈哈");
        SearchSourceBuilder searchSourceBuilder=new SearchSourceBuilder();
        TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("hahh", "en"); //QueryBuilders 這裡面有很多精確查詢
        searchSourceBuilder.query(termQueryBuilder);
        searchSourceBuilder.timeout(new TimeValue(60, TimeUnit.MICROSECONDS));
        searchResponse.source(searchSourceBuilder);
        SearchResponse search = client.search(searchResponse, RequestOptions.DEFAULT);
        SearchHits hits = search.getHits();
        String s = JSON.toJSONString(hits);

        //=============================================
        //高亮
        HighlightBuilder highlightBuilder=new HighlightBuilder();
        highlightBuilder.field("欄位名稱");
        highlightBuilder.requireFieldMatch(false);//是否顯示多個高亮
        highlightBuilder.preTags("<span style='color:red'");
        highlightBuilder.postTags("</span>");
        searchSourceBuilder.highlighter(highlightBuilder);

        List<Map> list=new ArrayList<>();//就是得到最後的結果
        for (SearchHit d:hits.getHits()){
            Map<String, Object> sourceAsMap = d.getSourceAsMap();
            //====高亮取出
            Map<String, HighlightField> highlightFields = d.getHighlightFields();
            HighlightField highlightField = highlightFields.get("欄位名稱");
            Text[] fragments = highlightField.fragments();
            String realut="";
            for (Text text:fragments){
                realut+= text;
            }
            sourceAsMap.put("欄位名稱",realut);
            list.add(sourceAsMap);
        }


    }

}

jsoup 是解析網頁的包(爬蟲用的)