Запрос оценки функции ElasticSearch

#elasticsearch #elasticsearch-2.0

#elasticsearch #elasticsearch-2.0

Вопрос:

Ниже приведен мой запрос function_score. Я хочу дать дополнительную оценку документам, в которых качество продукта лучше.

Но _score в ответе поиска всегда равен 0. Чего мне не хватает? Спасибо.

Когда я удаляю запрос bool и заменяю его только фильтром терминов, оценка не равна нулю. Я предполагаю, что речь идет о bool запроса, но не могу понять, почему.

Версия Elasticsearch 2.4

 {
  "from": 0,
  "size": 20,
  "query": {
    "function_score": {
      "query": {
        "bool": {
          "filter": [
            {
              "bool": {
                "should": {
                  "terms": {
                    "categories.category1Id": [
                      63
                    ]
                  }
                }
              }
            }
          ]
        }
      },
      "functions": [
        {
          "gauss": {
            "updatedDate": {
              "origin": "2016-10-03 05:10:18",
              "scale": "0.5h",
              "decay": 0.1,
              "offset": "1h"
            }
          }
        },
        {
          "filter": {
            "term": {
              "productQuality": "EXCELLENT"
            }
          },
          "weight": 7
        },
        {
          "filter": {
            "term": {
              "productQuality": "HIGH"
            }
          },
          "weight": 5
        },
        {
          "filter": {
            "term": {
              "productQuality": "MEDIUM"
            }
          },
          "weight": 3
        },
        {
          "filter": {
            "term": {
              "productQuality": "LOW"
            }
          },
          "weight": 1
        }
      ],
      "score_mode": "sum"
    }
  }
}
  

Комментарии:

1. Самая первая часть вашего запроса — это фильтр. Фильтры возвращают только постоянную оценку. Вы можете использовать explain api, чтобы увидеть, как работает запрос: elastic.co/guide/en/elasticsearch/reference/current /…

2. @jay прав, bool/filter запросы не дают оценки

Ответ №1:

Как сказал @Val.

bool.filter присваивает оценку 0 всем документам, поскольку запрос оценки не был указан (ссылка).

Если вам нужна оценка, вы можете добавить "must": {"match_all": {}} ее в свой запрос. match_all присвоит 1.0 всем документам (ссылка).

Вот ваш запрос с match_all :

 {
  "from": 0,
  "size": 20,
  "query": {
    "function_score": {
      "query": {
        "bool": {
          "must": { 
              "match_all": {}
          },
          "filter": [
            {
              "bool": {
                "should": {
                  "terms": {
                    "categories.category1Id": [
                      63
                    ]
                  }
                }
              }
            }
          ]
        }
      },
      "functions": [
        {
          "gauss": {
            "updatedDate": {
              "origin": "2016-10-03 05:10:18",
              "scale": "0.5h",
              "decay": 0.1,
              "offset": "1h"
            }
          }
        },
        {
          "filter": {
            "term": {
              "productQuality": "EXCELLENT"
            }
          },
          "weight": 7
        },
        {
          "filter": {
            "term": {
              "productQuality": "HIGH"
            }
          },
          "weight": 5
        },
        {
          "filter": {
            "term": {
              "productQuality": "MEDIUM"
            }
          },
          "weight": 3
        },
        {
          "filter": {
            "term": {
              "productQuality": "LOW"
            }
          },
          "weight": 1
        }
      ],
      "score_mode": "sum"
    }
  }
}