ElasticSearch(4)

之前說了很多查詢,接下來繼續:

我們可以利用query_string的關鍵詞來做匹配,可以省去之前用寫bool加兩個must的方式。例如:

GET /movie/_search
{
  "query": {
    "query_string": {
      "fields": ["title"],
      "query": "steve AND jobs"
    }
  }
}

filter,關於filter的但條件過濾之前就講過了,回顧一下:

GET /movie/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "term":{"title":"steve"}
        }
      ]
    }
  }
}

那麼多條件過濾呢?

GET /movie/_search
{
  "query": {
    "bool": {
      "filter": [
        {"term":{"title":"steve"}},
        {"term":{"cast.name":"gaspard"}},
        {"range":{"release_date":{"lte":"2015/01/01"}}},
        {"range":{"popularity":{"gte":"25"}}}
      ]
    }
  },
  "sort": [
    {
      "popularity": {
        "order": "desc"
      }
    }
  ]
}

先提一下,一般filter過濾是打分都是0,所以都用term精確匹配。關於“range”更像是大於小於的排序。

那如果想在filter中還帶條件呢?

GET /movie/_search
{
  "query": {
    "bool": {
      "should": [
        {"match": {
          "title": "life"
        }}
      ], 
      "filter": [
        {"term":{"title":"steve"}},
        {"term":{"cast.name":"gaspard"}},
        {"range":{"release_date":{"lte":"2015/01/01"}}},
        {"range":{"popularity":{"gte":"25"}}}
      ]
    }
  }
}

當布爾表達式中有filter的時候,也就是說即便should不滿足條件也會返回,只不過返回的是0而已,那should加filter一起的話,filter控制條件搜索,should控制打分,那麼兩個一起用,有結果二者都滿足的話,也就有分數了。


關於查全率和查準率

查全率:例如一共有100個文檔,正確的結果有60個文檔,而查詢出來正確的有40個,這樣的查全率就是40/60

查準率:查出了40個文檔,裏面有30個是正確的,那麼查準率就是30/40

這裏的正確是人爲感知的正確。例如查詢“蘋果”,會顯示出食物和手機,那麼二者只有一個是正確的。

雖然二者不可兼得,但可以調整排序。

自定義score算法:

GET /movie/_search
{
  "query": {
    "function_score": {
      "query": {
        "multi_match": {
          "query": "steve jobs",
          "fields": ["title","overview"],
          "operator": "or",
          "type": "most_fields"
        }
      },
      "functions": [
        {
          "field_value_factor": {
            "field": "popularity",
            "modifier": "log2p",
            "factor": 10
          }
        }
      ]
    }
  }
}

打開分數監控可以看出,在tf/idf的打分下面,還有一個打分:

這就是我們上面自定義的分數,乘以之前的分數,就得到了現在的分數。當然從上面代碼也可以看出,functions是個數組,可以放多個,需要注意的是,這裏面的分數都是相乘的。

當然這個分數相乘會變得很大,所以添加命令,使相乘變成相加:其中score_mode是指function內部分數相加,boost_mode指function得分與TF/IDF得分相加。

GET /movie/_search
{"explain": true, 
  "query": {
    "function_score": {
      "query": {
        "multi_match": {
          "query": "steve jobs",
          "fields": ["title","overview"],
          "operator": "or",
          "type": "most_fields"
        }
        
      },
      "functions": [
        {
          "field_value_factor": {
            "field": "popularity",
            "modifier": "log2p",    //將字段值+2後計算對數
            "factor": 10            //字段預處理*10
          }
        }
      ],
      "score_mode": "sum",
      "boost_mode": "sum"
    }
  }
}

 

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