Elasticsearch:按日期排序字段(降序):gauss或field_value_factor?

时间:2016-10-10 18:10:16

标签: elasticsearch

我有一个关于根据创建日期修改得分文档的问题。我尝试过高斯函数和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"
                                  }
                                }
                  }
          }

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

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年的其他文档,即使我设置了修饰符&#34; sqrt&#34;因素:100 !!!!

我认为guass功能将是合适的解决方案。如何反转这个高斯结果?或者我如何增加field_value_factor以使2016年到来之前?

非常感谢,

吉尔赫尔梅

1 个答案:

答案 0 :(得分:5)

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

TcpListener _server = new TcpListener(_localAddr, _port);
_server.Start();
while (true)
{
    if (_server.Pending())
    {
        Byte[] bytes = new Byte[256];//Works fine if message under this size
        string data = string.Empty;
        _client = _server.AcceptTcpClient();
        NetworkStream stream = _client.GetStream();
        int i;
        while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
        {
            data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
            data = data.ToUpper();
            //Do stuff with data
        }
}

此外,原点应为最新日期,而不是{ "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"

这有帮助吗?