ES 筆記十六:基於詞項和基於全文的搜尋

CrazyZard發表於2019-11-04
  • Term 的 重要性
    • Term 是表達語意的最小單位。搜尋和利用統計語言模型進行自然語言處理都需要處理Term
  • 特點
    • Term Level Query:Term Query / Range Query / Exists Query / Prefix Query / Wildcard Query
    • 在ES中,Term 查詢,對輸入不做分詞。會將輸入作為一個整體,在倒排索引中查詢準確的詞項,並且使用相關度算分公式為每個包含該詞項的文件進行相關度算分- 例如“Apple Store”
    • 可以通過Constant Score 將查詢轉換換成一個Filtering,避免算分,並利用快取,提交效能

Demo

  • 插入資料
    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" }
  • 查詢
    POST /products/_search
    {
    "query": {
    "term": {
      "desc.keyword": {
        "value": "iPhone" //查不多資料,term查詢
        //"value":"iphone" // 查到資料 term查詢會做分詞
      }
    }
    }
    }
    POST /products/_search
    {
    "query": {
    "term": {
      "productID": {
        "value": "XHDK-A-1293-#fJ3"  // 無結果
        "value": "xhdk" //有一條資料
        "value": "xhdk-a-1293-#fj3"
      }
    }
    }
    }
    //如果對值進行查詢
    POST /products/_search
    {
    //"explain": true,
    "query": {
    "term": {
      "productID.keyword": {
        "value": "XHDK-A-1293-#fJ3"
      }
    }
    }
    }
  • 將Query 轉成 Filter,忽略TF-IDF計算,避免相關性算分的開銷
  • Filter 可以有效利用快取
POST /products/_search
{
  "explain": true,
  "query": {
    "constant_score": {
      "filter": {
        "term": {
          "productID.keyword": "XHDK-A-1293-#fJ3"
        }
      }
    }
  }
}
  • 基於全文字的查詢
    • Match Query / Match Phrase Query / Query String Query
  • 特點
    • 索引和搜尋時會進行分詞,查詢字串先傳遞到一個合適的分詞器,然後生成一個供查詢的詞項列表
    • 查詢時候,先會對輸入的查詢進行分詞。然後每個詞項逐個進行底層的查詢,最終將結果進行合併。並未每個文件生成一個算分。 例如查“Martix reloaded”,會查到包括 Matrix或者 reload的所有結果。

Match Query Result

POST movies/_search
{
  "query":{
    "match": {
      "title":{
        "query": "Matrix reloaded"
      }
    }
  }
}

Operator

POST movies/_search
{
  "query":{
    "match": {
      "title":{
        "query": "Matrix reloaded",
        "operator":"AND"
      }
    }
  }
}

Minimun_should_match

POST movies/_search
{
  "query":{
    "match": {
      "title":{
        "query": "Matrix reloaded",
        "minimum_should_match":2"
      }
    }
  }
}

Match Phrase Query

POST movies/_search
{
  "profile":true,
  "query":{
    "match_phrase": {
      "title":{
        "query": "Matrix reloaded",
        "slop":1"
      }
    }
  }
}

Match Query 查詢過程

  • 基於全文字的查詢
    • Match Query / Match Phrase Query / Query String Query
  • 基於全文字的查詢的特點
    • 索引和搜尋時都會進行分詞,查詢字串先傳遞到一個合適的分詞器,然後生成一個供查詢的詞項列表
    • 查詢會對每個詞項逐個進行底層的查詢,再將結果進行合併,並未每個文件生成一個算分

ES 筆記十六:基於詞項和基於全文的搜尋

  • 基於詞項的查詢 vs 基於全文的查詢
  • 通過欄位 Mapping 控制欄位的分詞
    • “Text” vs “Keyword”
  • 通過引數控制查詢的Precision & Recall
  • 複合查詢
    • 即使是對Keyword 進行Term 查詢,同樣會進行算分
    • 可以將查詢轉為Filtering,取消相關性算分的環節,以提高效能

相關文章