簡體   English   中英

如何在Elasticsearch中為特定搜索詞提升特定文檔?

[英]How to boost specific documents for a given search term in 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個匹配文檔應該是Path字段值為“ 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”,其中包含一個關鍵字/排名字段數組,如下例所示:

{
  "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上是一個很好的設計嗎? 對更好方法的任何建議?

提前致謝!

將關鍵字索引在原始文檔的單獨字段中可能會更好,然后在搜索期間,只需在該字段中增強匹配。

這並不是您所描述的,因為它不能很好地控制每個關鍵字的提升因子。 但是,如果查詢包含特定關鍵字,這絕對是一種使特定文檔在搜索結果中顯得更高的方法。

如果您確實需要更好地控制不同關鍵字的提升因子,您仍然可以使用此方法執行此操作。 但是,您需要創建幾個“提升關鍵字”字段,並在查詢中以不同方式對其進行推廣。

例如:

{ "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" }

在查詢中,您將總分數計算為:

  • 主要查詢scire
  • “boost_kw1”中匹配的得分乘以10
  • “boost_kw2”中匹配的得分乘以5

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM