当前位置: 首页 > 知识库问答 >
问题:

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

颜经艺
2023-03-14

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

我们正在构建一个基于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>   

然后将包含关键字/排名字段数组的嵌套字段“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上是一个好的设计吗?有更好的方法的建议吗?

提前感谢!

共有1个答案

傅正豪
2023-03-14

最好将关键字与原始文档索引在一个单独的字段中,然后在搜索期间,只需增强该字段中的匹配。

这并不完全是您所描述的,因为它不能很好地控制每个关键字的提升因子。但如果查询包含特定关键字,这绝对是一种使特定文档在搜索结果中显示得更高的方法

如果您确实需要更好地控制不同关键字的提升因子,您仍然可以使用此方法来实现这一点。但您需要创建几个“增强的关键字”字段,并在查询中以不同的方式增强它们。

例如:

{ "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
 类似资料:
  • 我实际上是一个新手到Java,并试图做一个小项目。所以,在我的项目中,我想让用户输入一个句子,我想让程序在句子中搜索特定的单词,并基于此给出输出。我使用NetBeans开发我的应用程序。 我的代码是这样的 我知道这段代码没有意义,也不会运行,但我这样说是为了让人们对我试图实现的目标有一个大致的了解。 请帮帮我.

  • 问题内容: 我有三个食物类型索引:“意大利”,“西班牙”,“美国”。当用户搜索“奶酪”时,“意大利”文档似乎出现在顶部。如果我偏爱说“西班牙语”,是否可以“增强”结果?(我仍然应该获得意大利语的结果,但是基于索引类型“ Spanish”的一些数值提升值,结果中返回的文档的顺序将优先使用“ Spanish”索引。在用户输入的lucene和/或ES查询? 问题答案: 添加带有字词查询或字段(或两者都有

  • 我有像这样的字符串: (或) 我想看看这个字符串是否有单词“place”。 如果它们是我使用的字符串中的单词,则包含("place")。因为这是所有一个字符串,我尝试拆分但它给出了语法错误。你能让我知道如何获取它吗?

  • 问题内容: 好的,所以我有这个yaml文件,我想替换一个字符串 与字符串 但是我不知道该怎么办。这是完整的Yaml文件 问题答案: 假设您使用的操作系统不错,并且您的YAML文档称为:

  • 如何告诉Elasticsearch在按术语搜索时排除某个字段? 当一个普通用户搜索摩托车时,什么都不应该返回,但如果他们搜索史密斯,这两个都应该返回。 有能力搜索认证字段的用户如果搜索摩托车将返回标记,如果搜索史密斯将返回标记。

  • 我是Elasticsearch的新手,我面临一个问题。我的任务是搜索一组文档。例如,我有这样结构的数据: 但是困难的是,我如何获取所有带有project_id=abc的文档,然后通过与关键字“测试”匹配的任何其他字段(代码、名称、状态)搜索它们(例如)。我如何在Elasticsearch查询中做到这一点,请帮助我! 谢谢