1. 程式人生 > 其它 >2-2、深入搜尋 -基於詞項和基於全文的搜尋

2-2、深入搜尋 -基於詞項和基於全文的搜尋

1. 基於詞項和基於全文的搜尋
  • 基於 Term 的查詢

    Term 是表達語意的最⼩單位。搜尋和利⽤統計語⾔模型進⾏⾃然語⾔處理都需要處理 Term

  • 特點

    • Term Level Query: Term Query / Range Query / Exists Query / Prefix Query /Wildcard Query
    • 在 ES 中,Term 查詢,對輸⼊不做分詞。會將輸⼊作為⼀個整體,在倒排索引中查詢準確的詞項,並
      且使⽤相關度算分公式為每個包含該詞項的⽂檔進⾏相關度算分 – 例如“Apple Store”
    • 可以通過 Constant Score 將查詢轉換成⼀個 Filtering,避免算分,並利⽤快取,提⾼效能
  • 例子
    建立index products_test

關於Term 查詢的例子
POST /products_test/product/_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" }

POST /products_test/_search
{
  "query": {
    "term": {
      "desc.keyword": {
        //"value": "iPhone"  查不到結果
        //"value":"iphone"   可以查到
      }
    }
  }
}
上面查詢分別返回什麼?

term 查詢 欄位不分詞 ,可以再mapping 中設定 keyword

  • 複合查詢 Constant Score 轉為 Filter
    • 將 Query 轉成 Filter,忽略 TF-IDF 計算,避免相關性算分的開銷
    • Filter 可以有效利⽤快取
POST /products_test/_search
{
  //"explain": true,
  "query": {
    "constant_score": {     // 忽視計算分數帶來的效能影響
      "filter": {
        "term": {
          "productID.keyword": "XHDK-A-1293-#fJ3"
        }
      }

    }
  }
}

基於全文的查詢

  • 基於全⽂本的查詢
    • Match Query / Match Phrase Query / Query String Query
  • 特點
    • 索引和搜尋時都會進⾏分詞,查詢字串先傳遞到⼀個合適的分詞器,然後⽣成⼀個供查詢的詞
      項列表
    • 查詢時候,先會對輸⼊的查詢進⾏分詞,然後每個詞項逐個進⾏底層的查詢,最終將結果進⾏合
      並。併為每個⽂檔⽣成⼀個算分。- 例如查 “Matrix reloaded”,會查到包括 Matrix 或者 reload
      的所有結果。
 post product_test/_search
{
 "query":{
    "match":{
      "desc":{
          "query":"dejxv"
      }
    }
  }
}

match 與 match_phrase 區別?