elasticsearch 如何在Elasticsearch中增强给定搜索词的特定文档?,elasticsearch,elasticsearch" /> elasticsearch 如何在Elasticsearch中增强给定搜索词的特定文档?,elasticsearch,elasticsearch" />

elasticsearch 如何在Elasticsearch中增强给定搜索词的特定文档?

elasticsearch 如何在Elasticsearch中增强给定搜索词的特定文档?,elasticsearch,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",

我需要你帮我设计一个真实场景的索引。这可能是一个很长的问题,让我尽量简明扼要地解释一下

我们正在构建一个基于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>
然后在查询时,使用嵌套查询获得给定搜索关键字的每个匹配文档的排名值,然后使用评分脚本根据该排名值调整相关性评分

由于boosting XML的秩值远大于正常的相关性得分(通常小于5),因此在boosting 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" }
在查询中,您可以将其作为以下各项的总和:

  • 主查询服务器
  • “boost_kw1”比赛的分数乘以10
  • “boost_kw2”中的比赛分数乘以5

它与elasticsearch有什么关系?对不起,您所说的“与elasticsearch有什么关系”是什么意思?我们正在使用Elasticsearch构建我们的搜索平台。所以我问Elasticsearch是如何做到的?我的意思是因为我没有看到你的问题与Elasticsearch相关,所以实际上你需要一个基于如何使用Elasticsearch的意见?明白了。在我最初的帖子中,我提出了一个Elasticsearch解决方案,它使用嵌套对象为每个文档存储一个关键字/排名数组。然后,在进行查询时,使用嵌套查询+评分脚本获取匹配文档的排名值,并根据排名值调整文档的评分。这样,前N个文档应该是给定关键字的boostingxml文件中的文档。但我正在寻找更好的解决方案,如果有。我知道这是一个老问题,但我遇到了一个类似的要求-任何解决方案?谢谢你的回答。但您的方法的一个问题是,我们必须在文档中预先定义固定数量的“增强关键字”字段,但在我们的场景中,每个关键字的增强文档数量不是固定的,有些是3个,有些可能是10个或更多。@Youxu,此方法不限制每个关键字的文档数或每个文档的关键字数。@Youxu,此方法不限制每个关键字的文档数或每个文档的关键字数。但当查询中出现某个关键字时,它可以将某些文档提升到顶部。正如我前面所说的,这并不是完全按照你所描述的那样做的,但肯定是为了同样的目的。但是,如果你真的需要在顶部显示“最佳匹配”,就像谷歌AdWords一样,请在单独的索引或对象类型中为它们编制索引,并对其执行独立搜索。谢谢astax。让我举一个例子,假设我们的客户在搜索“关键字1”时希望显示的前三个文档是doc1、doc2、doc3。那么,如何在所有三个文档的boost_kw1和boost_kw2字段中放置“关键字1”?似乎我需要添加一个新的字段boost_kw3?如果客户想为“关键字1”在订购的文档中添加doc4,我需要添加“boost_kw4”,对吗?
{
  "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",
     ...
}
{ "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" }