- 高階搜尋的功能,支援多想文字輸入,針對多個欄位進行搜尋
- 搜尋引擎一般也提供時間,價格等條件過濾
- 在ES中,有
Query
和 Filter
兩種 Context
- Query Context :相關性算分
- Filter Context :不需要算分(YES OR NO),可以利用Cache 獲得更好的效能
- 假設搜尋一本電影
- 評論中包含了Guitar ,使用者打分高於3分,同時上映時間在1993到2000年之間
- 這個搜尋包含了3段邏輯,針對不同的欄位
- 評論欄位中要包含Guitar 、使用者評論大於3、上映時間日期在給定範圍內
- 同時包含這三個邏輯,並且有比較好的效能
bool 查詢
- 一個bool查詢,是一個或者多個查詢子句的組合
- 總共包含4種子句,其中2種會影響算分,2種不影響算分
- 相關性並不只是全文字搜尋的專利。也適合 yes | no 的子句,匹配的子句越多,相關性評分越高。如果多條查詢子句被合併為一條複合查詢語句,比如bool查詢,則每個查詢子句計算得出的評分會被合併到總的相關性評分中。
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 - 不影響算分
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 巢狀
查詢語句的結構,會對相關度算分產生影響
- 同一層級下的競爭欄位,具有相同的權重
- 通過巢狀bool查詢,可以改變對算分的影響
控制欄位的Boosting
- Boosting 是控制相關度的一種手段
- 引數boost的含義
- 當 boost > 1
- 當 0 < boost < 1
- 當 boost < 0
Not Quite Not
Boosting Query
- Query Context vs Filter Context
- Bool Query - 更多的條件組合
- 查詢結構與相關性算分
- 如何控制查詢的精確度
- Boosting & Boosting Query