- 單字串查詢
- Google 只提供一個輸入框,查詢相關的多個欄位
- 支援按照價格,時間等進行過慮
DEMO
PUT /blogs/_doc/1
{
"title": "Quick brown rabbits",
"body": "Brown rabbits are commonly seen."
}
PUT /blogs/_doc/2
{
"title": "Keeping pets healthy",
"body": "My quick brown fox eats rabbits on a regular basis."
}
//查詢語句
POST /blogs/_search
{
"query": {
"bool": {
"should": [
{
"match": {
"title": "Brown fox"
}
},
{
"match": {
"body": "Brown fox"
}
}
]
}
}
}
- 查詢should 語句中的兩個查詢
- 加和兩個查詢的評分
- 乘以匹配語句的總數
- 除以所有語句的總數
結果
"hits" : {
"total" : {
"value" : 2,
"relation" : "eq"
},
"max_score" : 0.90425634,
"hits" : [
{
"_index" : "blogs",
"_type" : "_doc",
"_id" : "1",
"_score" : 0.90425634, // 因為2個欄位都有brown
"_source" : {
"title" : "Quick brown rabbits",
"body" : "Brown rabbits are commonly seen."
}
},
{
"_index" : "blogs",
"_type" : "_doc",
"_id" : "2",
"_score" : 0.77041256,
"_source" : {
"title" : "Keeping pets healthy",
"body" : "My quick brown fox eats rabbits on a regular basis."
}
}
]
}
- 上列中,title 和 body 相互競爭
- 不應該將分數簡單疊加,而是應該找個單個最佳匹配的欄位的評分
- Disjunction Max Query
- 將任何與任一查詢匹配的文件作為結果返回。採用欄位上最匹配的評分返回
POST /blogs/_search
{
"query": {
"dis_max": {
"queries": [
{
"match": {
"title": "Quick fox"
}
},
{
"match": {
"body": "Quick fox"
}
}
]
}
}
}
最佳欄位查詢調優
- 有一些情況下,同時匹配title 和 body 欄位的文件比只與一個欄位匹配的文件的相關度更高
- 但
disjunction max query
查詢指揮簡單的使用單個最佳匹配語句的評分_scoce 作為整體評分
通過Tie Breaker 引數調整
- 獲得最佳匹配語句的評分
- 將其他匹配語句的評分 與 tie_breaker 相乘
- 對以上評分求和並規範化