当前位置: 首页 > 面试题库 >

重写多项查询时,请在每个项(而不是整个查询)中添加constant_score

桑鸿志
2023-03-14
问题内容

我正在从地名数据库中查找城市。典型的搜索字符串是“ San Francisco
CA”。我有包含城市和州域的文档。我进行match查询,将搜索字符串匹配到城市和州,然后使用组合这些匹配项bool

"query" : {
    "bool" : {
        "must" : {
            "match" : {
                "country" : {
                    "query" : "San Francisco CA"
                }
            }
        },
        "should" : {
            "match" : {
                "city" : {
                    "query" : "San Francisco CA"
                }
            }
        }
    }
}

我的数据库中有以下两个文档:

{"city" : "San Francisco", "state" : "CA"}
{"city" : "San Marino", "state" : "San Marino"}

问题在于,将“ san”匹配到圣马力诺州的得分要比将CA匹配到旧金山州的得分高得多,因为存在许多州“ CA”的城市和很少州“ San Marino”的城市。

我尝试使用禁用IDF
constant_score,但这会导致另一个问题:将匹配两个术语的“旧金山CA”匹配到“旧金山”,将仅匹配一个术语的“旧金山CA”匹配到“圣马力诺”得到相同的分数。当将一项多项匹配查询重写为单独的术语时,是否可以对constant_score每个重写查询进行查询,以使匹配“
San Francisco”的得分为2,而仅匹配“ San”的得分为1?


问题答案:

在ElasticSearch讨论论坛的友好帮助下,我有了一个解决方案。

使IDF保持不变的最简单方法是创建一个自定义类以进行相似度计算。这是我对ElasticSearch
1.7.0的更新示例

该类强制IDF始终等于1,这解决了我的问题。



 类似资料:
  • 问题内容: 通常,您需要显示数据库项目的列表以及有关每个项目的特定汇总号。例如,当您在“堆栈溢出”中键入标题文本时,将出现“相关问题”列表。该列表显示了相关条目的标题以及每个标题的响应数量的单个汇总数量。 我有一个类似的问题,但需要多个聚合。我想根据用户选项以3种格式中的任何一种显示项目列表: 我的商品的名称(共15个,我拥有的13个) 我的商品的名称(共15个) 我的商品的名称(我拥有13个)

  • 我有一个使用. NET 6 Web API的应用程序。一旦用户登录到应用程序,关于该用户的基于小上下文的信息被附加到查询参数。 API中AuthPolicy的一部分是,当调用endpoint时,这些查询参数必须存在,即使该endpoint没有使用它们。 例如,此 终结点具有在请求正文中传递的实际输入,但 AuthPolicy 要求查询参数存在,即使未使用它也是如此。 有效EX: 无效的EX: 有没

  • 问题内容: JOIN查询比几个查询快吗?(您运行主查询,然后根据主查询的结果运行许多其他的SELECT) 我问是因为加入它们会使我的应用程序设计复杂化 如果速度更快,谁能大致估算出多少?如果是1.5倍,我不在乎,但是如果是10倍,我想我是。 问题答案: 这太模糊了,无法为您提供与您的具体情况相关的答案。这取决于很多事情。Jeff Atwood(该网站的创始人)实际上撰写了有关此内容的文章。但是,在

  • 问题内容: 可以按多行订购吗? 我希望我的用户按last_activity进行排序,但与此同时,我希望带有图片的用户出现在没有图片的用户之前 像这样: 问题答案:

  • 我希望在一个select请求中运行以下查询: 问题是所有内容都是由单独的多个查询获取的。我只希望团队和团队的球员和每个球员的技能在一个请求中被获取。但是相反,我有多个选择查询来获取每个团队、玩家、每个玩家的统计数据和技能。 以下是与注释一起使用的实体: 游戏实体: 团队实体: 玩家实体: 你能指出所犯的错误吗?我需要一个选择查询来加载游戏,它是团队、团队的球员和每个球员的技能。 编辑1:以下是po

  • 问题内容: 我想编写Sql Query,以按百分比增加商品价格。 场景是:- 在表中,我有3个栏目:ID,项目名称,价格 问题答案: 如果您要更新表,则可以进行条件更新。 如果您希望在选择时不对表进行任何更新就显示增加的价格,则可以执行以下操作。