我們有一個簡單的網頁,用戶可以在其中提供一些輸入和查詢數據庫。我們目前使用mongodb,但希望遷移到elasticsearch,因爲查詢速度更快。elasticsearch:決定哪個查詢應該先運行
有一些必需的搜索字段,如開始日期和結束日期,以及一些可選的搜索字段,如匹配條目的搜索字符串或父搜索字符串,以匹配父條目。親子關係只是通過包含每個條目的祖先ID的字段來描述。
問題如下:如果提供了搜索和父搜索字符串,是否有一種方法可以在執行查詢之前知道,應該先執行哪個查詢,以便更快地提供結果並提高性能?
例如,它可能是一個特定的父搜索結果只有2個文檔/父項,然後我們可以獲取匹配搜索字符串的所有孩子。在這種情況下,我們應該首先執行父查詢,然後執行條目查詢。
一個選項是獲取兩個查詢的計數,然後首先執行計數最小的計數,但是這種解決方案更糟糕,因爲查詢將執行兩次?一次用於計數,一次用於實際查詢。
有沒有其他的選擇來解決這個問題?
PS。我們使用elasticsearch V1.7
例
比方說用戶想搜索匹配以下字段的所有條目。
搜索字符串:type:BLOCK AND name:test
parentSearchString:name:parentTest AND NOT type:BLOCK
這意味着,我們要麼必須
- 取匹配
parentSearchString
所有條目(父母)和存儲它們的ID。然後,我們必須獲取與searchString
匹配的所有條目,並且還必須包含ancestors
字段中的任何父ID。
OR
- 取匹配
searchString
所有條目,並存儲所有ancestors
IDS。然後獲取與parentSearchString
匹配的所有條目,其ID是ancestors
ID之一。
爲了澄清,父項和子項都具有完全相同的結構並位於相同的索引中。由於父子關係可以嵌套10次,所以我們不能有不同的索引,所以一個條目既可以是父母,也可以是孩子。一個條目看起來或多或少是:
{
id: "e32452365321",
name: "name",
type: "type",
ancestors: "id1 id2 id3" // stored in node as an array of ids
}
對於我們來說,更新彈性並不是一件容易的事情,所以我現在必須使用它。如果我也很瞭解你,我不認爲我可以在一個嵌套查詢中同時查詢兩個查詢,因爲要編寫每個查詢,我需要另一個查詢的結果。例如,如果我首先查詢父母的查詢,則子查詢必須對父母ID進行過濾。而且我在某處看到,這種彈性不是現在可用的 – XeniaSis
似乎我不太瞭解您的搜索。你能否在你的開場白中提供一個簡單的例子?也許在SQL中,如果這更容易表達。然後我會嘗試相應地更新我的答案。如果你的搜索過於複雜(我假設,因爲你有一個'簡單的網頁'),我仍然認爲它可以在一個查詢中完成。 – Slomo
我添加了一個小例子 – XeniaSis