Предоставьте отрицательный результат, если не сопоставлены в Elasticsearch Query - PullRequest
0 голосов
/ 17 октября 2019

Я работаю над сумасшедшим требованием, сумасшедшим, потому что я никогда этого не делал, и, судя по всему, я не думаю, что это можно сделать напрямую. Нужна помощь на этой платформе, если кто-то может мне помочь.

Требование в Elasticsearch - если значение совпадает, тогда я должен предоставить оценку, но если поле присутствует, но не соответствует, то предоставить отрицательную оценку, которая при последнем суммировании уменьшит оценку. Пример, скажем, я ищу два поля имя и тему. Если имя соответствует, тогда указывается 50 баллов, если предмет соответствует, тогда 10 баллов. Таким образом, если оба совпадения, тогда оценка равна 60. Если предмет не соответствует, тогда оценка равна -10, что при добавлении дает мне 40.

Это легко с точки зрения некоторых языков программирования, но не удается сделать это в запросе Elasticsearch,Я использую функцию оценки, ниже пример запроса. Любая помощь в этом отношении приветствуется.

GET dummy_rps_index_2/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "dis_max": {
            "queries": [
              {
                "function_score": {
                  "boost_mode": "replace",
                  "score_mode": "max",
                  "max_boost": 100,
                  "query": {
                    "bool": {
                      "disable_coord": true,
                      "minimum_should_match": 1,
                      "should": [
                        {
                          "function_score": {
                            "score_mode": "max",
                            "boost_mode": "replace",
                            "_name": "name_match",
                            "query": {
                              "multi_match": {
                                "query": "TIFFIN",
                                "fields": [
                                "name"
                                ],
                                "operator": "or",
                                "fuzziness": "AUTO"
                              }
                            },
                            "functions": [
                              {
                                "filter": {
                                  "multi_match": {
                                    "query": "TIFFIN",
                                    "fields": [
                                      "name"
                                    ],
                                    "operator": "or",
                                    "fuzziness": 0
                                  }
                                },
                                "weight": 50
                              }
                            ]
                          }
                        },
                        {
                          "function_score": {
                            "score_mode": "max",
                            "boost_mode": "replace",
                            "_name": "multipleline_code",
                            "query": {
                              "bool": {
                                "disable_coord": true,
                                "minimum_should_match": 1,
                                "should": [
                                  {
                                    "function_score": {
                                      "boost_mode": "replace",
                                      "query": {
                                        "multi_match": {
                                          "query": "maths",
                                          "fields": [
                                            "subject
                                          ]
                                        }
                                      },
                                      "functions": [
                                        {
                                          "weight": 10
                                        }
                                      ]
                                    }
                                  }
                                ]
                              }
                            }
                          }
                        }
                      ]                      
                    }
                  }
                }
              }
            ]
          }
        }
      ]
    }
  }
}

1 Ответ

0 голосов
/ 17 октября 2019

Отрицательный вес не допускается в функциональном весе. Используя must и must_not в функциональном фильтре, можно назначить разные оценки.

Данные:

[
      {
        "_index" : "index28",
        "_type" : "_doc",
        "_id" : "bJLH2G0Bti9Q-XOmRxgV",
        "_score" : 1.0,
        "_source" : {
          "name" : "John",
          "subject" : "Math"
        }
      },
      {
        "_index" : "index28",
        "_type" : "_doc",
        "_id" : "bZLH2G0Bti9Q-XOmcxia",
        "_score" : 1.0,
        "_source" : {
          "name" : "John",
          "subject" : "English"
        }
      }
    ]

Запрос:

{
  "query": {
    "function_score": {
      "query": {
        "match_all": {}
      },
      "functions": [
        {
          "filter": {
            "bool": {
              "must": [
                {
                  "match": {
                    "name": "John"
                  }
                },
                {
                  "match": {
                    "subject": "English"
                  }
                }
              ]
            }
          },
          "weight": 60
        },
        {
          "filter": {
            "bool": {
              "must": [
                {
                  "match": {
                    "name": "John"
                  }
                }
              ],
              "must_not": [
                {
                  "match": {
                    "subject": "English"
                  }
                }
              ]
            }
          },
          "weight": 40
        },
        {
          "filter": {
            "bool": {
              "must_not": [
                {
                  "match": {
                    "name": "John"
                  }
                }
              ],
              "must": [
                {
                  "match": {
                    "subject": "English"
                  }
                }
              ]
            }
          },
          "weight": 10
        }
      ],
      "score_mode": "sum"
    }
  }
}
...