2015-04-30 137 views
3

我需要你的指導設計幫助一個真實的場景。這可能是一個很長的問題,讓我儘可能簡潔地解釋它。如何提高Elasticsearch中給定搜索詞的特定文檔?

我們正在建立一個基於Elasticsearch爲我們的客戶網站的搜索體驗的搜索平臺,在索引中的文件可能是這樣的:

{ "Path":"http://www.foo.com/doc/abc/1", "Title":"Title 1", "Description":"The description of doc 1", ... } 
{ "Path":"http://www.foo.com/doc/abc/2", "Title":"Title 2", "Description":"The description of doc 2", ... } 
{ "Path":"http://www.foo.com/doc/abc/3", "Title":"Title 3", "Description":"The description of doc 3", ... } 
... 

對於每個查詢,返回的目標文件默認情況下按相關性排序,但我們的客戶也希望提高一些具體的文件對於某些關鍵字,

他們給我們像提高XML配置如下:

<boost> 
    <Keywords value="keyword1"> 
     <Path rank="10000">http://www.foo.com/doc/abc/1</Path> 
    </Keywords> 

    <Keywords value="keyword2"> 
     <Path rank="10000">http://www.foo.com/doc/abc/2</Path> 
     <Path rank="9900">http://www.foo.com/doc/abc/1</Path> 
    </Keywords> 

    <Keywords value="keyword3"> 
     <Path rank="10000">http://www.foo.com/doc/abc/3</Path> 
     <Path rank="9900">http://www.foo.com/doc/abc/2</Path> 
     <Path rank="9800">http://www.foo.com/doc/abc/1</Path> 
    </Keywords> 
</boost> 

這意味着,如果用戶搜索「keyword1」,則前1個命中文檔應該是其路徑字段值爲「www.foo.com/doc/abc/1」的文檔,無論該文檔的相關性分值如何。 同樣,如果搜索「keyword3」,前3個命中文檔應該是其路徑值爲 「www.foo.com/doc/abc/3」,「www.foo.com/doc/abc/2「和」www.foo.com/doc/abc/1「。

爲了滿足這一特殊要求,我的設計,首先反轉原來提高的XML格式如下:

<boost> 
    <Path value="http://www.foo.com/doc/abc/1"> 
     <keywords> 
      <keyword value="keyword1" rank="10000" /> 
      <keyword value="keyword2" rank="9900" /> 
      <keyword value="keyword3" rank="9800" /> 
     </keywords> 
    </Path> 

    <Path value="http://www.foo.com/doc/abc/2"> 
     <keywords> 
      <keyword value="keyword2" rank="10000" /> 
      <keyword value="keyword3" rank=9900" /> 
     </keywords> 
    </Path> 
    <Path value="http://www.foo.com/doc/abc/3"> 
     <keywords> 
      <keyword value="keyword3" rank="10000" /> 
     </keywords> 
    </Path> 
</boost> 

然後添加一個嵌套場「升壓」,其包含關鍵字/排名領域的陣列,到Elasticsearch文檔下面的例子:

{ 
    "Boost": [ 
    { "keyword":"keyword1", "rank": 10000}, 
    { "keyword":"keyword2", "rank": 9900}, 
    { "keyword":"keyword3", "rank": 9800} 
    ] 
    "Path":"http://www.foo.com/doc/abc/1", 
    "Title":"Title 1", 
    "Description":"The description of doc 1", 
    ... 
} 

{ 
    "Boost": [ 
     { "keyword":"keyword2", "rank": 10000}, 
     { "keyword":"keyword3", "rank": 9900} 
    ] 
    "Path":"http://www.foo.com/doc/abc/2", 
    "Title":"Title 2", 
    "Description":"The description of doc 2", 
    ... 
} 

{ 

    "Boost": [ 
     { "keyword":"keyword3", "rank": 10000} 
    ] 
    "Path":"http://www.foo.com/doc/abc/3", 
    "Title":"Title 3", 
    "Description":"The description of doc 3", 
    ... 
} 

然後在查詢的時候,使用嵌套查詢來獲取給定的搜索關鍵詞的每個匹配的文檔的排名值,然後使用得分腳本通過調整相關性得分這個排名值。

由於來自增強XML的排名值比正常相關性得分(通常小於5)大得多,因此在爲給定關鍵字增強XML時配置的文檔的調整得分應該是最高分。

你認爲這是一個很好的Elasticsearch設計?任何建議更好的方法?

在此先感謝!

+0

它與elasticsearch有什麼關係? – eliasah

+0

對不起,您對「elasticsearch」有什麼意見?我們正在使用Elasticsearch來構建我們的搜索平臺。所以我問Elasticsearch如何做到這一點? – Youxu

+0

我的意思是因爲我沒有看到你的問題與elasticsearch有關,所以實際上你需要基於如何做你想用elasticsearch做什麼的意見? – eliasah

回答

1

將關鍵字與原始文檔分別放在一個字段中,然後在搜索過程中只需增加該字段的匹配可能會更好。

這不完全是你所描述的,因爲它不能讓你精確控制每個關鍵字的提升因子。但是,如果查詢包含特定關鍵字,這絕對是一種使特定文檔在搜索結果中顯示得更高的方法。

如果您確實需要更好地控制不同關鍵字的增強因子,則仍然可以使用此方法執行此操作。但是您需要創建幾個「提升關鍵字」字段,並在查詢中以不同方式提升它們。

例如:

{ "Path":"http://www.foo.com/doc/abc/1", 
    "Title":"Title 1", 
    "Description":"The description of doc 1", 
    "boost_kw1": "keyword1 keyword2", 
    "boost_kw2": "keyword3 keyword4" }, 
{ "Path":"http://www.foo.com/doc/abc/1", 
    "Title":"Title 1", 
    "Description":"The description of doc 1", 
    "boost_kw1": "keyword3", 
    "boost_kw2": "keyword1 keyword2" } 

並在查詢你calculate the total score爲的總和:

  • 主查詢scire
  • 匹配的 「boost_kw1」 分數乘以10
  • 「boost_kw2」中的比賽得分乘以5
+0

謝謝你的回覆。但是你的方法的一個問題是,我們必須在文檔中預先定義固定數量的「提升關鍵字」字段,但在我們的場景中,每個關鍵字的增強文檔數量並不固定,有些是3,有些可能是10或更多。 – Youxu

+0

@Youxu,這種方法不會限制每個關鍵字的文檔數量或每個文檔的關鍵字數量。 – astax

+0

@Youxu,此方法不會限制每個關鍵字的文檔數量或每個文檔的關鍵字數量。但是,當查詢中存在某個關鍵字時,它可以將某些文檔推到頂部。正如我剛纔所說,這不是完全按照你所描述的來完成的,但絕對起到相同的作用。但是,如果您真的只需在類似於Google AdWords的頂部顯示「最佳匹配」,請將它們索引爲單獨的索引或對象類型,並對其進行獨立搜索。 – astax

相關問題