Различные функции оценки в запросе bool - PullRequest
1 голос
/ 24 июня 2019

Я работаю в индексе продуктов наasticsearch. У меня есть запрос bool с группами множественного соответствия для получения результатов, которые я хочу:

{
  "query": {
    "bool": {
      "should": [
        {
          "multi_match": {
            "query": "term",
            "fields": [
              "name^3.0",
              "name.fullName^10.0",
              "description",
              "description.fullDesc",
              "detail",
              "detail.fullDetail"
            ],
            "type": "cross_fields",
            "operator": "AND",
            "slop": 0,
            "prefix_length": 0,
            "max_expansions": 50,
            "zero_terms_query": "NONE",
            "auto_generate_synonyms_phrase_query": true,
            "fuzzy_transpositions": true,
            "boost": 10
          }
        },
        {
          "multi_match": {
            "query": "term",
            "fields": [
              "name.fullName",
              "description.fullDesc",
              "detail.fullDetail"
            ],
            "type": "cross_fields",
            "operator": "OR",
            "slop": 0,
            "prefix_length": 0,
            "max_expansions": 50,
            "zero_terms_query": "NONE",
            "auto_generate_synonyms_phrase_query": true,
            "fuzzy_transpositions": true,
            "boost": 6
          }
        }
      ],
      "adjust_pure_negative": true,
      "boost": 1
    }
  }
}

Мне нужно оценивать каждую группу документов, полученных в запросе с несколькими совпадениями, отдельно. Я рассмотрел использование функции оценки, но она позволяет мне определить одну функцию оценки для всего запроса bool следующим образом:

{
  "from": 0,
  "size": 500,
  "query": {
    "function_score": {
      "query": {
        "bool": {
          "should": [
            {
              "multi_match": {
                "query": "term",
                "fields": [
                  "name^3.0",
                  "name.fullName^10.0",
                  "description",
                  "description.fullDesc",
                  "detail",
                  "detail.fullDetail"
                ],
                "type": "cross_fields",
                "operator": "AND",
                "slop": 0,
                "prefix_length": 0,
                "max_expansions": 50,
                "zero_terms_query": "NONE",
                "auto_generate_synonyms_phrase_query": true,
                "fuzzy_transpositions": true,
                "boost": 10
              }
            },
            {
              "multi_match": {
                "query": "term",
                "fields": [
                  "name.fullName",
                  "description.fullDesc",
                  "detail.fullDetail"
                ],
                "type": "cross_fields",
                "operator": "OR",
                "slop": 0,
                "prefix_length": 0,
                "max_expansions": 50,
                "zero_terms_query": "NONE",
                "auto_generate_synonyms_phrase_query": true,
                "fuzzy_transpositions": true,
                "boost": 6
              }
            }
          ],
          "adjust_pure_negative": true,
          "boost": 1
        }
      },
      "boost": "5",
      "field_value_factor": {
        "field": "gain",
        "factor": 1.2,
        "modifier": "sqrt",
        "missing": 1
      },
      "boost_mode": "multiply"
    }
  },
  "version": true
}

Мне нужно определить различные функции оценки (по одной для каждого запроса на несколько совпадений), чтобы оценивать результаты независимо.

1 Ответ

1 голос
/ 25 июня 2019

Вы можете обернуть каждый запрос multi_match в запрос function_score. Затем вы можете легко определить различные функции для каждого multi_match. Вот так будет выглядеть ваш запрос:

{
  "from": 0,
  "size": 500,
  "query": {
    "bool": {
      "should": [
        {
          "function_score": {
            "query": {
              "multi_match": {
                "query": "term",
                "fields": [
                  "name^3.0",
                  "name.fullName^10.0",
                  "description",
                  "description.fullDesc",
                  "detail",
                  "detail.fullDetail"
                ],
                "type": "cross_fields",
                "operator": "AND",
                "slop": 0,
                "prefix_length": 0,
                "max_expansions": 50,
                "zero_terms_query": "NONE",
                "auto_generate_synonyms_phrase_query": true,
                "fuzzy_transpositions": true,
                "boost": 10
              }
            },
            "boost": "5",
            "field_value_factor": {
              "field": "gain",
              "factor": 1.2,
              "modifier": "sqrt",
              "missing": 1
            },
            "boost_mode": "multiply"
          }
        },
        {
          "function_score": {
            "query": {
              "multi_match": {
                "query": "term",
                "fields": [
                  "name.fullName",
                  "description.fullDesc",
                  "detail.fullDetail"
                ],
                "type": "cross_fields",
                "operator": "OR",
                "slop": 0,
                "prefix_length": 0,
                "max_expansions": 50,
                "zero_terms_query": "NONE",
                "auto_generate_synonyms_phrase_query": true,
                "fuzzy_transpositions": true,
                "boost": 6
              }
            },
            "boost": "5",
            "field_value_factor": {
              "field": "gain",
              "factor": 1.2,
              "modifier": "sqrt",
              "missing": 1
            },
            "boost_mode": "multiply"
          }
        }
      ],
      "adjust_pure_negative": true,
      "boost": 1
    }
  },
  "version": true
}

Обратите внимание, что в приведенном выше запросе я использовал одинаковую логику оценки в обоих запросах multi_match. Вы можете изменить их в соответствии с вашими потребностями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...