我需要你的指导设计帮助一个真实的场景。这可能是一个很长的问题,让我尽可能简洁地解释它。如何提高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设计?任何建议更好的方法?
在此先感谢!
它与elasticsearch有什么关系? – eliasah
对不起,您对“elasticsearch”有什么意见?我们正在使用Elasticsearch来构建我们的搜索平台。所以我问Elasticsearch如何做到这一点? – Youxu
我的意思是因为我没有看到你的问题与elasticsearch有关,所以实际上你需要基于如何做你想用elasticsearch做什么的意见? – eliasah