Повышение результатов эластичного поиска во время запроса на основе последнего проиндексированного времени - PullRequest
1 голос
/ 01 ноября 2019

Я пытаюсь выяснить, как повысить релевантность результатов поиска на основе последнего проиндексированного времени. Итак, если для поискового запроса есть несколько совпадений, мне нужно повысить результаты на основе последней проиндексированной временной метки документа.

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

GET code_sourcenodedupefilecontractv4_1421_shared_5dd3788f-2d0a-4a49-b679-98bbf519013e/_search
{
  "query": {
    "function_score": {
      "query": {
        "match": {
          "originalContent": "sample"
        }
      },
      "functions": [
        {
          "linear": {
            "indexedTimeStamp": {
              "scale": "30d",
              "decay": 0.5
            }
          }
        }
      ]
    }
  }
}

При выполнении вышеуказанного запроса в kibana я получаю следующее сообщение:

"failed_shards": [
  {
    "shard": 0,
    "index": "code_sourcenodedupefilecontractv4_1421_shared_5dd3788f-2d0a-4a49-b679-98bbf519013e",
    "node": "UX5mwT1sT_a2QuqeFG-JUw",
    "reason": {
      "type": "query_shard_exception",
      "reason": "failed to create query: {\n  \"function_score\" : {\n    \"query\" : {\n      \"match\" : {\n        \"originalContent\" : {\n          \"query\" : \"sample\",\n          \"operator\" : \"OR\",\n          \"prefix_length\" : 0,\n          \"max_expansions\" : 50,\n          \"fuzzy_transpositions\" : true,\n          \"lenient\" : false,\n          \"zero_terms_query\" : \"NONE\",\n          \"auto_generate_synonyms_phrase_query\" : true,\n          \"boost\" : 1.0\n        }\n      }\n    },\n    \"functions\" : [\n      {\n        \"filter\" : {\n          \"match_all\" : {\n            \"boost\" : 1.0\n          }\n        },\n        \"linear\" : {\n          \"indexedTimeStamp\" : {\n            \"scale\" : \"30d\",\n            \"decay\" : 0.5\n          },\n          \"multi_value_mode\" : \"MIN\"\n        }\n      }\n    ],\n    \"score_mode\" : \"multiply\",\n    \"max_boost\" : 3.4028235E38,\n    \"boost\" : 1.0\n  }\n}",
      "index_uuid": "U6os7SW0QuqOuuS3sASCrg",
      "index": "code_sourcenodedupefilecontractv4_1421_shared_5dd3788f-2d0a-4a49-b679-98bbf519013e",
      "caused_by": {
        "type": "illegal_argument_exception",
        "reason": "Can't load fielddata on [indexedTimeStamp] because fielddata is unsupported on fields of type [date]. Use doc values instead."
      }
    }
  }
]"

Значение поля (indexedTimeStamp), сохраненного в упругом поиске:

"indexedTimeStamp": {
        "type": "date",
        "store": true,
        "doc_values": false,
        "format": "epoch_second"
      },

Я что-то здесь упустил?

[EDIT]: Если doc_valueравен false, то мы не можем сортировать или агрегировать по этому полю. Это ограничение со стороны упругого поиска. Я попытался создать новый индекс с doc_value как true, и он работал как ожидалось.

Ответы [ 2 ]

0 голосов
/ 05 ноября 2019

Если doc_value равно false, то мы не можем сортировать или агрегировать в этом поле. Ни мы не можем обновить поле. Это ограничение со стороны упругого поиска. Я попытался создать новый индекс с doc_value как true, и он работал как ожидалось.

Дополнительная информация здесь .

0 голосов
/ 01 ноября 2019

Вы не можете использовать field_value_factor здесь, потому что он может принимать только число в качестве аргумента. Вы должны использовать другие функции, например gauss, для определения приоритетов новых записей.

Это может выглядеть примерно так:

{
  "query": {
    "function_score": {
      "query": {
        "match": {
          "content": "sample"
        }
      },
      "functions": [
        {
          "gauss": {
            "indexedTimeStamp": {
              "origin": "now",
              "scale": "30d"
            }
          }
        }
      ]
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...