Elasticsearch聚合結(jié)果分頁(yè)并支持之模糊查詢

0覆致、背景:

解決了Elasticsearch聚類結(jié)果分頁(yè)的問題后的某一天霞扬,產(chǎn)品找到了我洼畅。
產(chǎn)品:這里需要加一個(gè)搜索功能胖替!明天和其他功能一起上線焊唬!
我:好的(wdnmd故痊,你是拉屎的時(shí)候突然來靈感了顶瞳?之前給原型的時(shí)候怎么沒有?)愕秫。
心里問候完產(chǎn)品后慨菱,開始思考怎么實(shí)現(xiàn)。

1戴甩、Terms aggregation之include

ES版本7.9.2
想獲取demo數(shù)據(jù)符喝,請(qǐng)點(diǎn)擊這篇文章
先看看之前分頁(yè)的解決辦法:

GET employees/_search
{
  "size": 0,
  "query": {
    "match_all": {}
  },
  "aggs": {
    "myTerms": {
      "terms": {
        "field": "job.keyword",
        "size": 10
      },
      "aggs": {
        "myBucketSort": {
          "bucket_sort": {
            "from": 0,
            "size": 5,
            "gap_policy": "SKIP"
          }
        }
      }
    },
    "termsCount": {
      "cardinality": {
        "field": "job.keyword",
        "precision_threshold": 30000
      }
    }
  }
}

這里是利用bucket_sort來分頁(yè),cardinality來獲取total甜孤。
在官方文檔里邊逛了一圈洲劣,發(fā)現(xiàn)terms aggregation有include好像可以解決這個(gè)問題闷愤,直接開始:

GET employees/_search
{
  "size": 0,
  "query": {
    "match_all": {}
  },
  "aggs": {
    "myTerms": {
      "terms": {
        "include": ".*Programmer.*", 
        "field": "job.keyword",
        "size": 10
      },
      "aggs": {
        "myBucketSort": {
          "bucket_sort": {
            "from": 0,
            "size": 5,
            "gap_policy": "SKIP"
          }
        }
      }
    },
    "termsCount": {
      "cardinality": {
        "field": "job.keyword",
        "precision_threshold": 30000
      }
    }
  }
}

include:為字符串時(shí)支持正則表達(dá)式。為數(shù)組的時(shí)候支持多字段精確過濾悲伶。
如:

  ...
  "aggs": {
    "myTerms": {
      "terms": {
        "include": ".*Programmer.*", #支持正則秕铛,但部分字符為保留字
        "field": "job.keyword",
        "size": 10
      }
  }
  ...
  ...
  "aggs": {
    "myTerms": {
      "terms": {
        "include": ["Programmer","DBA"], #支持多值,但是不支持正則
        "field": "job.keyword",
        "size": 10
     }
  }

正在暗爽的時(shí)候战惊,發(fā)現(xiàn)上面獲取到的total是不帶include過濾條件時(shí)的total流昏,不符合要求。

2吞获、cardinality之script

利用cardinality 的script來達(dá)到過濾效果:

GET employees/_search
{
  "size": 0,
  "query": {
    "match_all": {}
  },
  "aggs": {
    "myTerms": {
      "terms": {
        "include": ".*Programmer.*", 
        "field": "job.keyword",
        "size": 10
      },
      "aggs": {
        "myBucketSort": {
          "bucket_sort": {
            "from": 0,
            "size": 5,
            "gap_policy": "SKIP"
          }
        }
      }
    },
    "termsCount": {
      "cardinality": {
       "script": {
          "source": """if(doc['job.keyword'].value.contains('Programmer')) {doc['job.keyword'].value }"""
        },
        "precision_threshold": 30000
      }
    }
  }
}

對(duì)應(yīng)結(jié)果:

{
  "took" : 4,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 20,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "myTerms" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "Java Programmer",
          "doc_count" : 7
        },
        {
          "key" : "Javascript Programmer",
          "doc_count" : 4
        }
      ]
    },
    "termsCount" : {
      "value" : 2
    }
  }
}

3况凉、問題

關(guān)鍵字為英文時(shí)的大小寫問題,terms aggregations的include雖然支持正則各拷,但是正則中的(?i)不支持刁绒,所以大小寫敏感是個(gè)問題。
比如:關(guān)鍵詞為“ai”或者“Ai”想要檢索出來AI烤黍。當(dāng)然terms aggregations也可以用script如:

GET employees/_search
{
  "size": 0,
  "query": {
    "match_all": {}
  },
  "aggs": {
    "myTerms": {
      "terms": {
        "script": {
          "source": """if(doc['job.keyword'].value.contains('Programmer')) {doc['job.keyword'].value }"""
        },
        "size": 10
      },
      "aggs": {
        "myBucketSort": {
          "bucket_sort": {
            "from": 0,
            "size": 5,
            "gap_policy": "SKIP"
          }
        }
      }
    },
    "termsCount": {
      "cardinality": {
       "script": {
          "source": """if(doc['job.keyword'].value.contains('Programmer')) {doc['job.keyword'].value }"""
        },
        "precision_threshold": 30000
      }
    }
  }
}

雖然可以在if條件中知市,編寫滿足大寫或者小寫的條件,但類似Ai這樣的仍然不能滿足命中AI速蕊。
這個(gè)問題的其他解決辦法利用normalizer嫂丙,但仍會(huì)有缺陷。
本來就想大小寫敏感檢索规哲,可以忽略以上問題

4跟啤、總結(jié)

  • 方法1:
GET employees/_search
{
  "size": 0,
  "query": {
    "match_all": {}
  },
  "aggs": {
    "myTerms": {
      "terms": {
        "include": ".*programmer.*", 
        "field": "job.keyword",
        "size": 10
      },
      "aggs": {
        "myBucketSort": {
          "bucket_sort": {
            "from": 0,
            "size": 5,
            "gap_policy": "SKIP"
          }
        }
      }
    },
    "termsCount": {
      "cardinality": {
       "script": {
          "source": """if(doc['job.keyword'].value.contains('Programmer')) {doc['job.keyword'].value }"""
        },
        "precision_threshold": 30000
      }
    }
  }
}
  • 方法2:
GET employees/_search
{
  "size": 0,
  "query": {
    "match_all": {}
  },
  "aggs": {
    "myTerms": {
      "terms": {
        "script": {
          "source": """if(doc['job.keyword'].value.contains('Programmer')) {doc['job.keyword'].value }"""
        },
        "size": 10
      },
      "aggs": {
        "myBucketSort": {
          "bucket_sort": {
            "from": 0,
            "size": 5,
            "gap_policy": "SKIP"
          }
        }
      }
    },
    "termsCount": {
      "cardinality": {
       "script": {
          "source": """if(doc['job.keyword'].value.contains('Programmer')) {doc['job.keyword'].value }"""
        },
        "precision_threshold": 30000
      }
    }
  }
}
  • 其他方法:利用normalizer或者analyzer,但同樣有弊端唉锌,如何實(shí)現(xiàn)可以google搜索一下隅肥。

參考:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市袄简,隨后出現(xiàn)的幾起案子腥放,更是在濱河造成了極大的恐慌,老刑警劉巖痘番,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捉片,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡汞舱,警方通過查閱死者的電腦和手機(jī)伍纫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來昂芜,“玉大人莹规,你說我怎么就攤上這事∶谏瘢” “怎么了良漱?”我有些...
    開封第一講書人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵舞虱,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我母市,道長(zhǎng)矾兜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任患久,我火速辦了婚禮椅寺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蒋失。我一直安慰自己返帕,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開白布篙挽。 她就那樣靜靜地躺著荆萤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪铣卡。 梳的紋絲不亂的頭發(fā)上链韭,一...
    開封第一講書人閱讀 51,562評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音算行,去河邊找鬼梧油。 笑死苫耸,一個(gè)胖子當(dāng)著我的面吹牛州邢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播褪子,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼量淌,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了嫌褪?” 一聲冷哼從身側(cè)響起呀枢,我...
    開封第一講書人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎笼痛,沒想到半個(gè)月后裙秋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡缨伊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年摘刑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刻坊。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡枷恕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出谭胚,到底是詐尸還是另有隱情徐块,我是刑警寧澤未玻,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站胡控,受9級(jí)特大地震影響扳剿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜昼激,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一舞终、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧癣猾,春花似錦敛劝、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至像捶,卻和暖如春上陕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拓春。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工释簿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人硼莽。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓庶溶,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親懂鸵。 傳聞我的和親對(duì)象是個(gè)殘疾皇子偏螺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355