У эластичного поиска должны быть разные оценки

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

      {
"query": {
    "bool": {
        "should": [
            {
              "term": 
                   { 
                     "color": "Yellow"
                   } 
            },
            {
              "term": 
                   { 
                     "color": "Red"
                   } 
            },

            {
              "term": 
                   { 
                     "color": "Blue"
                   } 
            }
        ],
        "minimum_should_match": 1
    }
}

Если данные имеют только «желтый», это дает мне оценку «1,5», но если данные имеют только «красный», они дают мне оценку «1,4». И я хотел, чтобы оценка была такой же. Каждые данные имеют только одно совпадение, так почему же оценки разные? Есть ли что-нибудь, чтобы игнорировать порядок терминов в запросе следует? Когда у меня только 1 матч, «желтый» всегда будет с высоким счетом ...

3 ответа

Как уже упоминалось, оценка зависит от множества факторов. Однако, если вы хотите игнорировать их все, вы можете использовать constant_score присвоить постоянную оценку, если документ соответствует определенному термину, например:

      {
  "query": {
    "bool": {
      "should": [
        {
          "constant_score": {
            "filter": {
              "term": {
                "color": "Yellow"
              }
            },
            "boost": 1
          }
        },
        {
          "constant_score": {
            "filter": {
              "term": {
                "color": "Red"
              }
            },
            "boost": 1
          }
        },
        {
          "constant_score": {
            "filter": {
              "term": {
                "color": "Blue"
              }
            },
            "boost": 1
          }
        }
      ],
      "minimum_should_match": 1
    }
  }
}

Я считаю, что это должно соответствовать вашим требованиям.

@ESCoder, используя приведенный выше пример, у меня есть:

"Желтый"

      {
                      "value" : 1.5995531,
                      "description" : "idf, computed as log(1 + (N - n + 0.5) / (n + 0.5)) from:",
                      "details" : [
                        {
                          "value" : 30,
                          "description" : "n, number of documents containing term",
                          "details" : [ ]
                        },
                        {
                          "value" : 150,
                          "description" : "N, total number of documents with field",
                          "details" : [ ]
                        }
                      ]
                    },

"Красный"

      {
                      "value" : 1.0375981,
                      "description" : "idf, computed as log(1 + (N - n + 0.5) / (n + 0.5)) from:",
                      "details" : [
                        {
                          "value" : 53,
                          "description" : "n, number of documents containing term",
                          "details" : [ ]
                        },
                        {
                          "value" : 150,
                          "description" : "N, total number of documents with field",
                          "details" : [ ]
                        }
                      ]
                    },

Каждый из них (красный и желтый) появляется в каждом документе только один раз. Я хочу иметь такой же балл, если у меня красный или желтый. Меня не волнует, сколько документов у каждого. Если один документ имеет только желтый цвет, а другой - только красный, я хотел бы иметь одинаковую оценку для обоих. Является ли это возможным?

Вы можете использовать filter пункт вместе с bool/should пункт, если оценка для вас не важна

Контекст фильтра избегает оценочной части и представляет собой обычный запрос типа "да / нет". Таким образом, для совпадающих документов оценка всегда будет 0,0.

      {
  "query": {
    "bool": {
      "filter": {
        "bool": {
          "should": [
            {
              "term": {
                "color.keyword": "Yellow"
              }
            },
            {
              "term": {
                "color.keyword": "Black"
              }
            },
            {
              "term": {
                "color.keyword": "Purple"
              }
            }
          ],
          "minimum_should_match": 1
        }
      }
    }
  }
} 

Оценка сопоставленных документов зависит от нескольких факторов, таких как длина поля, частота термина, общее количество документов и т. Д.

Вы можете узнать больше о том, как рассчитывается оценка, используя объяснительный API

      GET /_search?explain=true
Другие вопросы по тегам