全文搜尋 二 多詞查詢及查詢的合併

2021-08-01 20:45:52 字數 3452 閱讀 6343

如果我們一次只能搜尋乙個詞,那麼全文搜尋就會顯得相當不靈活。幸運的是,通過match查詢來實現多詞查詢也同樣簡單:

get /my_index/my_type/_search

}}

以上的查詢會返回所有的四份文件:

},},},}

]}

文件4的相關度最高因為它包含了"brown"兩次和"dog"一次。 文件2和文件3都包含了"brown""dog"一次,同時它們的title字段擁有相同的長度,因此它們的分值相同。 文件1只包含了"brown"

因為match查詢需要查詢兩個詞條 -["brown","dog"]- 在內部它需要執行兩個term查詢,然後將它們的結果合併來得到整體的結果。因此,它會將兩個term查詢通過乙個bool查詢組織在一起,我們會在合併查詢一節中詳細介紹。

從上面的例子中需要吸取的經驗是,文件的title欄位中只需要包含至少乙個指定的詞條,就能夠匹配該查詢。如果匹配的詞條越多,也就意味著該文件的相關度就越高。

match查詢接受乙個operator引數,該引數的預設值是"or"。你可以將它改變為"and"來要求所有的詞條都需要被匹配:

get /my_index/my_type/_search}}

}

match查詢的結構需要被稍稍改變來容納operator引數。

這個查詢的結果會將文件1排除在外,因為它只包含了乙個查詢詞條。

在all和any中選擇有種非黑即白的感覺。如果使用者指定了5個查詢詞條,而乙份文件只包含了其中的4個呢?將"operator"設定成"and"會將它排除在外。

有時候這正是你想要的,但是對於大多數全文搜尋的使用場景,你會希望將相關度高的文件包含在結果中,將相關度低的排除在外。換言之,我們需要一種介於兩者中間的方案。

match查詢支援minimum_should_match引數,它能夠讓你指定有多少詞條必須被匹配才會讓該文件被當做乙個相關的文件。儘管你能夠指定乙個詞條的絕對數量,但是通常指定乙個百分比會更有意義,因為你無法控制使用者會輸入多少個詞條:

get /my_index/my_type/_search

}}}

當以百分比的形式指定時,minimum_should_match會完成剩下的工作:在上面擁有3個詞條的例子中,75%會被向下捨入到66.6%,即3個詞條中的2個。無論你輸入的是什麼,至少有2個詞條被匹配時,該文件才會被算作最終結果中的一員。

minimum_should_match引數非常靈活,根據使用者輸入的詞條的數量,可以適用不同的規則。具體可以參考minimum_should_match引數的相關文件。

為了更好地了解match查詢是如何處理多詞查詢的,我們需要看看bool查詢是如何合併多個查詢的。

在合併過濾器中我們討論了使用bool過濾器來合併多個過濾器以實現andornot邏輯。bool查詢也做了類似的事,但有乙個顯著的不同。

過濾器做出乙個二元的決定:這份文件是否應該被包含在結果列表中?而查詢,則更加微妙。它們不僅要決定是否包含乙份文件,還需要決定這份文件有多相關。

和過濾器類似,bool查詢通過mustmust_not以及should引數來接受多個查詢。比如:

get /my_index/my_type/_search

}, "must_not"

: },

"should"

: [ },}]

}}}

title欄位中含有詞條quick,且不含有詞條lazy的任何文件都會被作為結果返回。目前為止,它的工作方式和bool過濾器十分相似。

差別來自於兩個should語句,它表達了這種意思:乙份文件不被要求需要含有詞條brown或者dog,但是如果它含有了,那麼它的相關度應該更高。

},}

]}

文件3的分值更高因為它包含了brown以及dog

bool查詢通過將匹配的mustshould語句的_score相加,然後除以mustshould語句的總數來得到相關度分值_score

must_not語句不會影響分值;它們唯一的目的是將不需要的文件排除在外。

所有的must語句都需要匹配,而所有的must_not語句都不能匹配,但是should語句需要匹配多少個呢?預設情況下,should語句乙個都不要求匹配,只有乙個特例:如果查詢中沒有must語句,那麼至少要匹配乙個should語句。

正如我們可以控制match查詢的精度,我們也能夠通過minimum_should_match引數來控制should語句需要匹配的數量,該引數可以是乙個絕對數值或者乙個百分比:

get /my_index/my_type/_search

}, },}],

"minimum_should_match"

: 2

}}}

以上查詢的而結果僅包含以下文件:

title字段包含:"brown" and "fox"或者"brown" and "dog"或者"fox" and "dog"

如果乙份文件含有所有三個詞條,那麼它會被認為更相關。

二分查詢及遞迴的二分查詢

一 思路 二分查詢又名折半查詢,顧名思義是分成兩部分,每查詢一次資料減半,所以查詢起來會很快。但是二分查詢的條件是已經有序的資料。1 設定兩個變數i,j.為查詢的範圍,i一般為0,j一般為陣列長度減一 2 設定變數mid,mid為所查陣列範圍的中間位置,即mid i j 2 3 比較所要查詢的資料v...

二項佇列的查詢插入合併操作

源 如下 一棵二次冪堆是一棵左有序的堆,由右子樹為空左子樹為完全二叉樹構成的根組成 二項佇列 是二次冪堆的乙個集合。其中不存在相等大小的堆。其結構由佇列節點數目確定 對應整數的二進位制表示。include include define maxbqsize 40 typedef struct pqno...

(演算法)二分查詢的搜尋區間

給定乙個包含 n 個整數的排序陣列,找出給定目標值 target 的起始和結束位置。如果目標值不在陣列中,則返回 1,1 1 直接遍歷陣列,複雜度o n 2 二分查詢 先通過二分查詢,找到target出現的最左邊的位置,如果不存在,返回 1 再通過二分查詢,找到target出現的最右邊的位置,如果不...