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條件