我需要你的索引设计帮助,以实现真实的场景.这可能是一个很长的问题,让我尝试尽可能简洁地解释它.
我们正在构建一个基于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个匹配文档应该是Path值为的文档
分别为“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" }
并在查询中将calculate the total score作为总和:
>主要查询scire
>“boost_kw1”中匹配的得分乘以10
>“boost_kw2”中匹配的得分乘以5