【问题标题】:Replace default Elasticsearch score替换默认的 Elasticsearch 分数
【发布时间】:2013-12-07 23:42:23
【问题描述】:

我有一个用户个人资料,其中包含以下字段:

  • 用户名
  • 性别
  • 国籍
  • 年龄
  • 语言
  • 首选语言
  • 首选年龄

每个用户都应该能够根据一些过滤器(用户名、性别、年龄、语言)搜索其他用户,并且最终结果应该根据偏好(首选语言、首选年龄)按分数排序

考虑这个例子:

用户个人资料:

  • 用户名 = 'randomdude'
  • 性别 = '男性'
  • 国籍 = '意大利'
  • 年龄 = '21'
  • language = '英语、意大利语、西班牙语'
  • 首选语言 = '英语、意大利语'
  • 首选年龄 = '20-30'

Randomdude 想要对我们的 ElasticSearch 文档进行研究,他会设置这些过滤器:

  • 性别 = '女性'
  • 国籍 = '西班牙'

所以最终列表应该只包含西班牙女性,但它应该更喜欢在语言领域具有英语或意大利语且年龄在 20 到 30 岁之间的人,而不排除其他人。所以他仍然可以看到说西班牙语的人有 40 个,但几乎排在列表的末尾。

我正在使用 Elasticsearch 的 php 包装器。我尝试使用很多函数,我认为我应该使用函数分数查询,但我无法使其工作,因为文档对我来说非常混乱。

【问题讨论】:

  • 没错,function_score 是要走的路。很高兴分享您尝试过的内容以及失败的地方。实际上,function_score 文档可能是我们曾经拥有的最好的文档,正如一些人在 twitter 上所说的:) twitter.com/alexbilbie/status/382136147893571584

标签: php elasticsearch


【解决方案1】:

我会理解 ES :D 我用这样的 bool 查询解决了这个问题,但我不确定这是最好的解决方案

{
    "query" : {
        "bool" : {
            "must" :[
                {"term" : { "gender" : "female" } },
                {"term" : { "nationality" : "spanish" } },
            ],
            "should" :[
                {"match" : { "language" : { "query" : "english italian","operator" : "or" } } },
            ]
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-05
    • 2017-02-12
    • 2016-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-28
    • 2020-05-13
    相关资源
    最近更新 更多