1. 程式人生 > >ElasticSearch進階(一)結構化搜尋_在案例中使用term filter來搜尋資料

ElasticSearch進階(一)結構化搜尋_在案例中使用term filter來搜尋資料

1、根據使用者ID、是否隱藏、帖子ID、發帖日期來搜尋帖子

(1)插入一些測試帖子資料

初步來說,就先搞4個欄位,因為整個es是支援json document格式的,所以說擴充套件性和靈活性非常之好。如果後續隨著業務需求的增加,要在document中增加更多的field,那麼我們可以很方便的隨時新增field。但是如果是在關係型資料庫中,比如mysql,我們建立了一個表,現在要給表中新增一些column,那就很坑爹了,必須用複雜的修改表結構的語法去執行。而且可能對系統程式碼還有一定的影響。

POST /forum/article/_bulk
{ "index": { "_id": 1 }}
{ "articleID" : "XHDK-A-1293-#fJ3", "userID" : 1, "hidden": false, "postDate": "2017-01-01" }
{ "index": { "_id": 2 }}
{ "articleID" : "KDKE-B-9947-#kL5", "userID" : 1, "hidden": false, "postDate": "2017-01-02" }
{ "index": { "_id": 3 }}
{ "articleID" : "JODL-X-1937-#pV7", "userID" : 2, "hidden": false, "postDate": "2017-01-01" }
{ "index": { "_id": 4 }}
{ "articleID" : "QQPX-R-3956-#aD8", "userID" : 2, "hidden": true, "postDate": "2017-01-02" }

在這裡插入圖片描述

在這裡插入圖片描述

現在es 5.2版本,type=text,預設會設定兩個field,一個是field本身,比如articleID,就是分詞的;還有一個的話,就是field.keyword,articleID.keyword,預設不分詞,會最多保留256個字元

(2)根據使用者ID搜尋帖子

term filter/query:對搜尋文字不分詞,直接拿去倒排索引中匹配,你輸入的是什麼,就去匹配什麼
比如說,如果對搜尋文字進行分詞的話,“helle world” --> “hello”和“world”,兩個詞分別去倒排索引中匹配
term,“hello world” --> “hello world”,直接去倒排索引中匹配“hello world”
在這裡插入圖片描述

(3)搜尋沒有隱藏的帖子

在這裡插入圖片描述

(4)根據發帖日期搜尋帖子
GET /forum/article/_search
{
    "query" : {
        "constant_score" : { 
            "filter" : {
                "term" : { 
                    "postDate" : "2017-01-01"
                }
            }
        }
    }
}
(5)根據帖子ID搜尋帖子
GET /forum/article/_search
{
    "query" : {
        "constant_score" : { 
            "filter" : {
                "term" : { 
                    "articleID" : "XHDK-A-1293-#fJ3"
                }
            }
        }
    }
}

在這裡插入圖片描述
在這裡插入圖片描述

articleID.keyword,是es最新版本內建建立的field,就是不分詞的。所以一個articleID過來的時候,會建立兩次索引,一次是自己本身,是要分詞的,分詞後放入倒排索引;另外一次是基於articleID.keyword,不分詞,保留256個字元最多,直接一個字串放入倒排索引中。
所以term filter,對text過濾,可以考慮使用內建的field.keyword來進行匹配。但是有個問題,預設就保留256個字元。所以儘可能還是自己去手動建立索引,指定not_analyzed吧。在最新版本的es中,不需要指定not_analyzed也可以,將type=keyword即可。

(6)檢視分詞

預設是analyzed的text型別的field,建立倒排索引的時候,就會對所有的articleID分詞,分詞以後,原本的articleID就沒有了,只有分詞後的各個word存在於倒排索引中。
term,是不對搜尋文字分詞的,XHDK-A-1293-#fJ3 --> XHDK-A-1293-#fJ3;但是articleID建立索引的時候,XHDK-A-1293-#fJ3 --> xhdk,a,1293,fj3
在這裡插入圖片描述

(7)重建索引
DELETE /forum

PUT /forum
{
  "mappings": {
    "article": {
      "properties": {
        "articleID": {
          "type": "keyword"
        }
      }
    }
  }
}
POST /forum/article/_bulk
{ "index": { "_id": 1 }}
{ "articleID" : "XHDK-A-1293-#fJ3", "userID" : 1, "hidden": false, "postDate": "2017-01-01" }
{ "index": { "_id": 2 }}
{ "articleID" : "KDKE-B-9947-#kL5", "userID" : 1, "hidden": false, "postDate": "2017-01-02" }
{ "index": { "_id": 3 }}
{ "articleID" : "JODL-X-1937-#pV7", "userID" : 2, "hidden": false, "postDate": "2017-01-01" }
{ "index": { "_id": 4 }}
{ "articleID" : "QQPX-R-3956-#aD8", "userID" : 2, "hidden": true, "postDate": "2017-01-02" }
(8)重新根據帖子ID和發帖日期進行搜尋
GET /forum/article/_search
{
    "query" : {
        "constant_score" : { 
            "filter" : {
                "term" : { 
                    "articleID" : "XHDK-A-1293-#fJ3"
                }
            }
        }
    }
}

在這裡插入圖片描述

2、知識點

(1)term filter:根據exact value進行搜尋,數字、boolean、date天然支援
(2)text需要建索引時指定為not_analyzed,才能用term query
(3)相當於SQL中的單個where條件