之前說了很多查詢,接下來繼續:
我們可以利用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"
}
}
}