【问题标题】:Elasticsearch: Order by date field (descending): gauss or field_value_factor?Elasticsearch:按日期字段排序(降序):高斯还是 field_value_factor?
【发布时间】:2017-02-19 05:28:33
【问题描述】:

我有一个关于根据创建日期修改乐谱文档的问题。我试过高斯函数和field_value_factor。

第一个是(所有查询子句):

@search_definition[:query] = {
                           function_score:{
                              query: {
                                  bool: {
                                      must: [
                                          {
                                  query_string: {
                                      query: <query_term>,
                                      fields: %w( field_1ˆ2
                                                         field_2ˆ3
                                                         ...
                                                         field_n^2),
                                      analyze_wildcard: true,
                                      auto_generate_phrase_queries: false,
                                      analyzer: 'brazilian',
                                      default_operator: 'AND'
                                  }
                              }
                             ],
                            filter: {
                                       bool: {
                                            should: [
                                                 { term: {"boolean_field": false}},
                                                 { terms:     {"array_field_1": options[:key].ids}},
                  { term: {"array_field_2.id": options[:key].id}}
                ]
             }
        }
                            }
                          },
                                gauss:{
                                  date_field: {
                                      scale: "1d",
                                      decay: "0.5"
                                  }
                                }
                  }
          }

通过这个配置,我告诉 elastic,最后一个文档必须有更高的分数。当我用它执行查询时,结果完全相反!首先返回最旧的文件。即使我将原点更改为

origin: "2010-05-01 00:00:00"

这是第一个文档的日期,最旧的也被首先检索。我做错了什么?

有了field_value_factor,事情变得更好了,但还不是我等待的......(所有的查询子句都是)

@search_definition[:query] = {
                           function_score:{
                              query: {
                                  bool: {
                                      must: [
                                          {
                                  query_string: {
                                      query: <query_term>,
                                      fields: %w( field_1ˆ2
                                                         field_2ˆ3
                                                         ...
                                                         field_n^2),
                                      analyze_wildcard: true,
                                      auto_generate_phrase_queries: false,
                                      analyzer: 'brazilian',
                                      default_operator: 'AND'
                                  }
                              }
                             ],
                            filter: {
                                       bool: {
                                            should: [
                                                 { term: {"boolean_field": false}},
                                                 { terms:     {"array_field_1": options[:key].ids}},
                  { term: {"array_field_2.id": options[:key].id}}
                ]
             }
        }
                            }
                          },
                                field_value_factor: {
                                     field: "date_field",
                                     factor : 100,
                                      modifier: "sqrt"
                                   }

                  }
          }

使用这种其他配置,首先返回 2016 年和 2015 年的文档,但是 2016 年的大量文档的得分低于 2015 年的其他文档,即使我将修饰符“sqrt”设置为因子:100 ! !!!

我认为 guass 函数是合适的解决方案。我怎样才能反转这个高斯结果?或者我怎样才能增加 field_value_factor 以便 2016 比 2015 早??

非常感谢,

吉尔赫姆

【问题讨论】:

  • 你能把你的整个查询告诉我们吗?
  • @ChintanShah25 ,我已经编辑了我的问题,包括整个查询。提前致谢

标签: elasticsearch


【解决方案1】:

您可能想尝试将 gauss 函数放入 functions param 并给它一个权重,就像下面的查询一样。我还认为规模太小,可能会使很多文档得分为零。我还将衰减增加到 0.8,并赋予最近文档更高的权重。您也可以使用explain api 查看评分是如何完成的。

{
    "function_score": {
        query: {
            bool: {
                must: [{
                    query_string: {
                        query: < query_term > ,
                        fields: % w(field_1ˆ2 field_2ˆ3
                            ...field_n ^ 2),
                        analyze_wildcard: true,
                        auto_generate_phrase_queries: false,
                        analyzer: 'brazilian',
                        default_operator: 'AND'
                    }
                }],
                filter: {
                    bool: {
                        should: [{
                            term: {
                                "boolean_field": false
                            }
                        }, {
                            terms: {
                                "array_field_1": options[: key].ids
                            }
                        }, {
                            term: {
                                "array_field_2.id": options[: key].id
                            }
                        }]
                    }
                }
            }
        },
        "functions": [{
            "gauss": {
                "date_field": {
                    "origin": "now"
                    "scale": "30d",
                    "decay": "0.8"
                }
            },
            "weight": 20
        }]
    }
}

来源也应该是最新日期,而不是origin: "2010-05-01 00:00:00",试试

origin: "2016-05-01 00:00:00"

这有帮助吗?

【讨论】:

  • 非常感谢!!太棒了!
  • 是的!完美!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多