ElasticSearch[v6.2] 在實際項目中的應用

        摘要:本文所講述的內容,爲ElasticSearch(如下簡稱ES)全文搜索引擎在實際大數據項目的應用;ES的底層是開源庫 Lucene。可是,你無法直接用 Lucene,必須本身寫代碼去調用它的接口。ES 是 Lucene 的封裝,java開發,提供了 REST API 的操做接口,開箱即用,是目前全文搜索的首選;html

  本文的使用項目爲基於Spring Boot 的快速開發環境搭建的項目框架,使用Spring Cloud做爲服務治理的框架;集成ES的過程當中,考慮過使用Spring Data的方式集成,進行數據的對接,後面經過多方面的調研和學習討論,最終肯定了bboss的集成方案,一個 高性能elasticsearch ORM開發庫使用介紹,在這裏特別感謝bboss的做者大河和他的團隊提供的幫助;java

  1、ES基礎git

網上關於ES的介紹已經特別多,這裏將再也不進行詳細介紹,只是針對幾個重點進行說明;數據庫

推薦剛開始的小夥伴去看一看阮一峯老師的博客:全文搜索引擎 Elasticsearch 入門教程apache

  一、Index (索引)--能夠理解爲關係型數據庫中的 數據庫的概念json

  一個索引就是含有某些類似特性的文檔的集合。例如,你能夠有一個用戶數據的索引,一個產品目錄的索引,還有其餘的有規則數據的索引。一個索引被一個名稱(必須都是小寫)惟一標識,而且這個名稱被用於索引經過文檔去執行索引,搜索,更新和刪除操做。安全

  二、Type(類型)--能夠理解爲關係型數據庫中的 表的概念(6.2版本中一個index下只有一個Type)網絡

  三、Document(文檔)--能夠理解爲關係型數據庫中表的ROW多線程

  一個文檔是一個可被索引的數據的基礎單元。例如,你能夠給一個單獨的用戶建立一個文檔,給單個產品建立一個文檔,以及其餘的單獨的規則。這個文檔用JSON格式表現,JSON是一種廣泛的網絡數據交換格式。架構

  四、Field(字段)--至關於表中的COLUMN

  五、在一個關係型數據庫裏面,schema定義了表、每一個表的字段,還有表和字段之間的關係。 與之對應的,在ES中:Mapping定義索引下的Type的字段處理規則,即索引如何創建、索引類型、是否保存原始索引JSON文檔、是否壓縮原始JSON文檔、是否須要分詞處理、如何進行分詞處理等。 

   六、ELK是什麼?

  ELK=elasticsearch+Logstash+kibana 
  elasticsearch:後臺分佈式存儲以及全文檢索 
  logstash: 日誌加工、「搬運工」 
  kibana:數據可視化展現。 特別是在DSL的學習過程當中,至關於數據庫的可視化工具,實時交互操做。
  ELK架構爲數據分佈式存儲、可視化查詢和日誌解析建立了一個功能強大的管理鏈。 三者相互配合,取長補短,共同完成分佈式大數據處理工做。

  2、ES能解決什麼樣的問題?

  實際項目開發實戰中,幾乎每一個系統都會有一個搜索的功能,當搜索作到必定程度時,維護和擴展起來難度就會慢慢變大,因此不少公司都會把搜索單獨獨立出一個模塊,用ElasticSearch等來實現。近年ElasticSearch發展迅猛,已經超越了其最初的純搜索引擎的角色,如今已經增長了數據聚合分析(aggregation)和可視化的特性,若是你有數百萬的文檔須要經過關鍵詞進行定位時,ElasticSearch確定是最佳選擇。固然,若是你的文檔是JSON的,你也能夠把ElasticSearch看成一種「NoSQL數據庫」, 應用ElasticSearch數據聚合分析(aggregation)的特性,針對數據進行多維度的分析。

  而在本文的項目中,輿情監測部分,搜索功能將是該模塊的核心功能;包括條件檢索,中文分詞,全文搜索等功能,而BBOSS對於該部分功能的實現,提供了極大的便利;

  3、ES環境搭建和在項目中的應用

  一、ES集羣搭建,關於ES集羣的搭建,這裏再也不單獨介紹,推薦的博客特別多。但有一點要注意,就是不一樣版本的ES對於功能的支持會有一些區別,要注意;

  二、ES的查詢語法;項目集成BBOSS後,比較相似Mybatis框架,直接完成DSL語句的編寫放入XML,經過對應的DAO方法調用便可,因此ES的查詢語法是ES學習的重點,也是ES進階的重點,不一樣的需求對於DSL的查詢複雜度不一,能夠經過ES的中文官方網站進行閱讀學習,並在自身搭建的ES集羣提供的kibana中進行操做,ES權威中文指南

  三、項目集成bboss

  第一步、maven引入包

<dependency>
    <groupId>com.bbossgroups.plugins</groupId>
    <artifactId>bboss-elasticsearch-rest</artifactId>
    <version>5.0.6.3</version>
</dependency>

  第二步、bboss elasticsearch配置

運行bboss es須要三個配置文件,放到資源目錄(resources)的conf目錄下便可:

conf/elasticsearch.xml        es客戶端配置文件

conf/httpclient.xml             es http鏈接池配置文件

conf/elasticsearch.properties   es參數配置文件,在上面的兩個xml文件中引用,因此咱們只須要修改elasticsearch.properties便可。
  第三步、配置ES查詢DSL

在resources下建立配置文件estrace/xxx.xml,配置一個query dsl腳本,名稱爲queryServiceByCondition,咱們將在後面的ClientInterface 組件中經過queryServiceByCondition引用這個腳本,定義腳本內容;

加載query dsl文件,並執行查詢操做

  @Override
  public String searchInfo(JSONObject jsonObject) {
        Map<String, Object> params = formatParams(jsonObject);
        JSONObject result = new JSONObject();
        //建立加載配置文件的客戶端工具,用來檢索文檔,單實例多線程安全
        ClientInterface clientUtil = ElasticSearchHelper.getConfigRestClientUtil("esmapper/opinion.xml");
        ESDatas<OpinionInfo> esDatas = clientUtil.searchList("act_yq_info_summary/_search",//act_yq_info_summary爲索引名稱,search爲操做的action
                "searchOpinionInfo",//esmapper/opinion.xml中定義的dsl語句
                params, OpinionInfo.class);
        result.put("esDatas", esDatas);
        return JSONObject.toJSONString(result);
    }

關於BBOSS語法的具體學習,能夠移步到  高性能elasticsearch ORM開發庫使用介紹,或者入QQ羣 166471282

  四、提供一個mapping設置和dsl的示例,僅供參考;

PUT /act_yq_info_summary/
{  
   "settings":{  
      "number_of_shards":6,
      "index.refresh_interval": "5s",
      "analysis" : {
          "analyzer" : {
                "ik" : {
                    "tokenizer" : "ik_max_word"
                }
            }
        }
   },
   "mappings":{  
      "articles":{  
         "dynamic_date_formats":[  
            "yyyy-MM-dd HH:mm:ss",
            "yyyyMMdd",
            "yyyy-MM-dd"
         ],
         "dynamic":"false",
         "properties":{  
            "infoUid":{  
               "type":"text"
            },
            "compareId":{  
               "type":"text"
            },
            "plats":{  
               "type":"keyword"
            },
            "keyWords":{  
               "type":"keyword"
            },
            "infoTitle":{  
               "type":"text",
               "store":true,
               "analyzer" : "ik_max_word"
            },
            "infoDetail":{  
               "type":"text",
               "store":true,
               "analyzer" : "ik_max_word"
            },
            "infoUrl":{  
               "type":"text"
            },
            "pubTime":{  
               "type":"date",
               "format":"yyyy-MM-dd HH:mm:ss"
            },
            "platsType":{  
               "type":"keyword"
            },
            "mlEmotion":{  
               "type":"keyword"
            },
            "userEmotion":{  
               "type":"keyword"
            }
         }
      }
   }
}

查詢的DSL

GET act_yq_info_summary/_search
{
    "query": {
        "bool": {
            "must": [{
                    "bool": {
                        "should": [{
                                "match": {
                                    "infoDetail": "喬軍"
                                }
                            },
                            {
                                "match": {
                                    "infoTitle": "喬軍"
                                }
                            }
                        ]
                    }
                },
                {
                    "terms": {
                        "userEmotion": ["pos", "neg", "neu"]
                    }
                }
            ],
            "filter": {
                "bool": {
                    "must": [{
                            "terms": {
                                "plats": ["jingdong", "toutiao_news", "toutiao_ans", "sina_blog", "sina_com", "bd_news", "bd_konws", "bd_tieba", "zhihu_ques", "zhihu_ans"]
                            }
                        },
                        {
                            "range": {
                                "pubTime": {
                                    "gte": "2016-05-01 00:00:00",
                                    "lte": "2018-05-07 23:59:59"
                                }
                            }
                        },
                        {
                            "terms": {
                                "keyWords": ["藍月亮湖南衛視中秋晚會", "藍月亮央視中秋晚會", "藍月亮旋風孝子"]
                            }
                        }
                    ]
                }
            }
        }
    },
    "highlight": {
        "fields": [{
                "infoTitle": {}
            },
            {
                "infoDetail": {}
            }
        ]
    },
    "from": 0,
    "size": 10,
    "sort": [{
            "_score": {
                "order": "desc"
            }
        },
        {
            "pubTime": {
                "order": "desc"
            }
        }
    ]
}

  五、關於分詞器,這裏仍是推薦IK分詞吧,IK分詞能夠設置 ik_smart  或者  ik_max_word,這裏不作詳解,推薦使用ik_max_word

  寫在最後的話,ES是一個很是強大的搜索引擎,要入門不是很難,可是要精通查詢,查詢優化,最大程度的搜索最想要的結果是有不少優化的餘地的,包括評分機制,包括新版本提供的聚合功能等,只能說,加油學習吧

相關文章
相關標籤/搜索