2017-07-19 68 views
1

我們有一個簡單的網頁,用戶可以在其中提供一些輸入和查詢數據庫。我們目前使用mongodb,但希望遷移到elasticsearch,因爲查詢速度更快。elasticsearch:決定哪個查詢應該先運行

有一些必需的搜索字段,如開始日期和結束日期,以及一些可選的搜索字段,如匹配條目的搜索字符串或父搜索字符串,以匹配父條目。親子關係只是通過包含每個條目的祖先ID的字段來描述。

問題如下:如果提供了搜索和父搜索字符串,是否有一種方法可以在執行查詢之前知道,應該先執行哪個查詢,以便更快地提供結果並提高性能?

例如,它可能是一個特定的父搜索結果只有2個文檔/父項,然後我們可以獲取匹配搜索字符串的所有孩子。在這種情況下,我們應該首先執行父查詢,然後執行條目查詢。

一個選項是獲取兩個查詢的計數,然後首先執行計數最小的計數,但是這種解決方案更糟糕,因爲查詢將執行兩次?一次用於計數,一次用於實際查詢。

有沒有其他的選擇來解決這個問題?

PS。我們使用elasticsearch V1.7

比方說用戶想搜索匹配以下字段的所有條目。

搜索字符串:type:BLOCK AND name:test

parentSearchString:name:parentTest AND NOT type:BLOCK

這意味着,我們要麼必須

  1. 取匹配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 
    } 
    

    回答

    0

    首先,我建議你,升級你的Elasticsearch版本,如果可能的話。自1.7以來發生了很多事情,老實說,我不能分辨下面文章中的所有內容對於這樣一箇舊版本是否有效(可能不是)。

    但是對於你的實際問題:希望我正確理解你,但你試圖估計Elasticsearch的查詢代價是多少?那麼,你不需要。如果你在一個嵌套查詢中提供所有'查詢',Elasticsearch會爲你做這件事:https://www.elastic.co/blog/elasticsearch-query-execution-order

    關於速度,我還有另外一件事情可以提到:計算得分確實需要時間。因此,如果排序不基於elasticsearch _score,則需要使用布爾過濾器查詢。這也適用,如果您只想按父匹配的_score進行排序,則可以將兒童查詢放入篩選器中。


    更新

    感謝你的榜樣,我現在看到的問題。不幸的是,ElasticSearch提供了自我引用親子關係not supported,所以你的方法可能是對的。您可能想查看關於application-joins的文檔的簡短章節。

    所以,是的,一般來說,你想發送第二個查詢儘可能少的ID /條款。雖然爲這兩個查詢計數並不像您想象的那麼糟糕,因爲結果很可能仍然被緩存,它實際上有幫助嗎?因爲如果你從孩子到父母,你將不得不計算祖先(字段值),而不是實際的文檔數量。

    我認爲,最昂貴的操作是經常從磁盤獲取結果源。所以無論你走到哪裏,你可能都應該只在第一個查詢中獲取你需要的東西。所以,你的選擇是:

    • 只獲取父匹配的ID,然後在第二個查詢上ancestors使用terms filter
    • 或者,只獲取子匹配的祖先字段,並在第二個查詢中使用id filter

    不幸的是,由於我沒有足夠的經驗來比較這些方法的速度,所以我無法幫到您。我的猜測是,一般來說,ID過濾器可能會更快。但這只是一個猜測......

    +0

    對於我們來說,更新彈性並不是一件容易的事情,所以我現在必須使用它。如果我也很瞭解你,我不認爲我可以在一個嵌套查詢中同時查詢兩個查詢,因爲要編寫每個查詢,我需要另一個查詢的結果。例如,如果我首先查詢父母的查詢,則子查詢必須對父母ID進行過濾。而且我在某處看到,這種彈性不是現在可用的 – XeniaSis

    +0

    似乎我不太瞭解您的搜索。你能否在你的開場白中提供一個簡單的例子?也許在SQL中,如果這更容易表達。然後我會嘗試相應地更新我的答案。如果你的搜索過於複雜(我假設,因爲你有一個'簡單的網頁'),我仍然認爲它可以在一個查詢中完成。 – Slomo

    +0

    我添加了一個小例子 – XeniaSis

    相關問題