ES 筆記十九:Query & Filtering 與 多字串多欄位查詢

CrazyZard發表於2019-11-10
  • 高階搜尋的功能,支援多想文字輸入,針對多個欄位進行搜尋
  • 搜尋引擎一般也提供時間,價格等條件過濾
  • 在ES中,有QueryFilter 兩種 Context
    • Query Context :相關性算分
    • Filter Context :不需要算分(YES OR NO),可以利用Cache 獲得更好的效能
  • 假設搜尋一本電影
    • 評論中包含了Guitar ,使用者打分高於3分,同時上映時間在1993到2000年之間
  • 這個搜尋包含了3段邏輯,針對不同的欄位
    • 評論欄位中要包含Guitar 、使用者評論大於3、上映時間日期在給定範圍內
  • 同時包含這三個邏輯,並且有比較好的效能
    • 複合查詢: bool Query

bool 查詢

  • 一個bool查詢,是一個或者多個查詢子句的組合
    • 總共包含4種子句,其中2種會影響算分,2種不影響算分
  • 相關性並不只是全文字搜尋的專利。也適合 yes | no 的子句,匹配的子句越多,相關性評分越高。如果多條查詢子句被合併為一條複合查詢語句,比如bool查詢,則每個查詢子句計算得出的評分會被合併到總的相關性評分中。

ES 筆記十九:Query & Filtering 與 多字串多欄位查詢

bool 查詢語句

  • 子查詢可以任意順序出現
  • 可以巢狀多個查詢
  • 如果你的bool 查詢中,沒有must條件,should 中必須滿足一條查詢
    //插入資料
    POST /products/_bulk
    {"index":{"_id":1}}
    {"price":10,"avaliable":true,"date":"2018-01-01","productID":"XHDK-A-1293-#fJ3"}
    {"index":{"_id":2}}
    {"price":20,"avaliable":true,"date":"2019-01-01","productID":"KDKE-B-9947-#kL5"}
    {"index":{"_id":3}}
    {"price":30,"avaliable":true,"productID":"JODL-X-1937-#pV7"}
    {"index":{"_id":4}}
    {"price":30,"avaliable":false,"productID":"QQPX-R-3956-#aD8"}
    //查詢
    POST /products/_search
    {
    "query": {
    "bool": {
      "must": {
        "term": {
          "price": "30"
        }
      },
      "filter": {
        "term": {
          "avaliable": "true"
        }
      },
      "must_not": {
        "range": {
          "price": {
            "lte": 10
          }
        }
      },
      "should": [
        {
          "term": {
            "productID.keyword": "JODL-X-1937-#pV7"
          }
        },
        {
          "term": {
            "productID.keyword": "XHDK-A-1293-#fJ3"
          }
        }
      ],
      "minimum_should_match": 1
    }
    }
    }

    增加count欄位,使用bool查詢

  • 從業務角度,按需改進資料模型
    POST /newmovies/_bulk
    {"index":{"_id":1}}
    {"title":"Father of the Bridge Part II","year":1995,"genre":"Comedy","genre_count":1}
    {"index":{"_id":2}}
    {"title":"Dave","year":1993,"genre":["Comedy","Romance"],"genre_count":2}
    # must  有算分
    POST /newmovies/_search
    {
    "query": {
    "bool": {
      "must": [
        {"term": {"genre.keyword": {"value": "Comedy"}}},
        {"term": {"genre_count": {"value": 1}}}
      ]
    }
    }
    }
    #Filter。不參與算分,結果的score是0
    POST /newmovies/_search
    {
    "query": {
    "bool": {
      "filter": [
        {"term": {"genre.keyword": {"value": "Comedy"}}},
        {"term": {"genre_count": {"value": 1}}}
        ]
    }
    }
    }

Filter Context - 不影響算分

ES 筆記十九:Query & Filtering 與 多字串多欄位查詢

Query Context - 影響算分

POST /products/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "term": {
            "productID.keyword": {
              "value": "JODL-X-1937-#pV7"}}
        },
        {"term": {"avaliable": {"value": true}}
        }
      ]
    }
  }
}
// 算分
"hits" : {
    "total" : {
      "value" : 3,
      "relation" : "eq"
    },
    "max_score" : 1.5606477, //算分的
    "hits" : [
      {
        "_index" : "products",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 1.5606477,
        "_source" : {
          "price" : 30,
          "avaliable" : true,
          "productID" : "JODL-X-1937-#pV7"
        }
      },
      {
        "_index" : "products",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.35667494, 
        "_source" : {
          "price" : 10,
          "avaliable" : true,
          "date" : "2018-01-01",
          "productID" : "XHDK-A-1293-#fJ3"
        }
      },
      {
        "_index" : "products",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 0.35667494,
        "_source" : {
          "price" : 20,
          "avaliable" : true,
          "date" : "2019-01-01",
          "productID" : "KDKE-B-9947-#kL5"
        }
      }
    ]
  }

bool 巢狀

ES 筆記十九:Query & Filtering 與 多字串多欄位查詢

查詢語句的結構,會對相關度算分產生影響

  • 同一層級下的競爭欄位,具有相同的權重
  • 通過巢狀bool查詢,可以改變對算分的影響

ES 筆記十九:Query & Filtering 與 多字串多欄位查詢

控制欄位的Boosting

  • Boosting 是控制相關度的一種手段
    • 索引,欄位或查詢子條件
  • 引數boost的含義
    • 當 boost > 1
    • 當 0 < boost < 1
    • 當 boost < 0
      ES 筆記十九:Query & Filtering 與 多字串多欄位查詢

Not Quite Not

ES 筆記十九:Query & Filtering 與 多字串多欄位查詢

Boosting Query

ES 筆記十九:Query & Filtering 與 多字串多欄位查詢

  • Query Context vs Filter Context
  • Bool Query - 更多的條件組合
  • 查詢結構與相關性算分
  • 如何控制查詢的精確度
    • Boosting & Boosting Query

相關文章