Elasticsearch核心技術與實戰學習筆記 第四章 24 | 基於詞項和基於全文的搜索

一 序

   本文屬於極客時間Elasticsearch核心技術與實戰學習筆記系列。從本節開始,學習進入深入階段。本節主要學習基於term 的查詢與全文本查詢的區別。

二 基於term 查詢

   

  • Term Level Query:Term Query / Range Query / Exists Query / Prefix Query / Wildcard Query
  • 在 ES 中,Term 查詢,對輸入不做分詞。會將輸入作爲一個整體,在倒排索引中查找準確的詞項,並且使用相關度算分公式爲每個包含該詞項的文檔進行相關度算分 - 例如 “Apple Store”
  • 可以通過 Constant Score 將查詢轉換換成一個 Filtering,避免算分,並利用緩存,提交性能

demo

插入數據

DELETE products
PUT products
{
  "settings": {
    "number_of_shards": 1
  }
}


POST /products/_bulk
{ "index": { "_id": 1 }}
{ "productID" : "XHDK-A-1293-#fJ3","desc":"iPhone" }
{ "index": { "_id": 2 }}
{ "productID" : "KDKE-B-9947-#kL5","desc":"iPad" }
{ "index": { "_id": 3 }}
{ "productID" : "JODL-X-1937-#pV7","desc":"MBP" }

查詢: iPhone ,term 查詢不到。 

改爲小寫iphone. 能查到。因爲post寫入數據的過程中,把大寫字母改爲小寫。上面term 查詢是精準查詢。

 

針對ID查詢:// 無結果

es對輸入做標準輸入,會拆分

//如果對值進行查詢

POST /products/_search
{
  "query": {
    "term": {
      "productID.keyword": {
       "value": "XHDK-A-1293-#fJ3"
      }
    }
  }
}

term查詢還是會返回算分結果的。

  • 將 Query 轉成 Filter,忽略 TF-IDF 計算,避免相關性算分的開銷
  • Filter 可以有效利用緩存

三 基於全文本的查詢

  

基於全文本的查找

  • Match Query / Match Phrase Query / Query String Query

特點

  • 索引和搜索時會進行分詞,查詢字符串先傳遞到一個合適的分詞器,然後生成一個供查詢的詞項列表
  • 查詢時候,先會對輸入的查詢進行分詞。然後每個詞項逐個進行底層的查詢,最終將結果進行合併。並未每個文檔生成一個算分。 例如查 “Martix reloaded”, 會查到包括 Matrix 或者 reload 的所有結果。

查詢過程

 

基於全文本的查找

  • Match Query / Match Phrase Query / Query String Query

基於全文本的查詢的特點

  • 索引和搜索時都會進行分詞,查詢字符串先傳遞到一個合適的分詞器,然後生成一個供查詢的詞項列表
  • 查詢會對每個詞項逐個進行底層的查詢,再將結果進行合併,並未每個文檔生成一個算分

demo:

PUT groups
{
  "mappings": {
    "properties": {
      "names":{
        "type": "text",
        "position_increment_gap": 0
      }
    }
  }
}

GET groups/_mapping

POST groups/_doc
{
  "names": [ "John Water", "Water Smith"]
}

POST groups/_search
{
  "query": {
    "match_phrase": {
      "names": {
        "query": "Water Water",
        "slop": 100
      }
    }
  }
}

總結

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章