2015-04-30 51 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

相关问题