Как получить результаты, взвешенные по ссылкам из ElasticSearch - PullRequest
5 голосов
/ 06 мая 2020

У меня есть набор данных, состоящий из Notes, ссылающихся на другие Notes.

{id:"aaa", note: "lorem ipsum", references: ["ccc"]},
{id:"bbb", note: "lorem ipsum", references: ["aaa","ccc"]},
{id:"ccc", note: "lorem ipsum", references: ["bbb"]},

Я хочу, чтобы elasti c search использовал ссылки для взвешивания результатов, поэтому в этом случае, если я буду искать lorem Мне нужно вернуть идентификатор "ccc", так как на него больше всего ссылок. Согласно их документам, их графическое решение делает именно это, но я также вижу примеры, в которых они делают аналогичные вещи.

Но никаких объяснений того, как это отображается на индекс. Итак, мой вопрос: как настроить индекс ES, который использует ссылки (индексы)?

Ответы [ 3 ]

4 голосов
/ 26 мая 2020

Другие ответы дали некоторые подсказки, но затем @ 7379490 предоставил ответ в другом канале:

Нет возможности сделать это непосредственно в ES. Есть два возможных решения: предварительно вычислить ссылки и передать их в ES путем сопоставления нового значения с документом.

Или агрегировать и использовать агрегирование для сортировки ответа:

{
  "query": {
    "function_score": {
      "query": {
        "match": {
          "note": "lorem"
        }
      },
      "aggs": {
      "references":{
        "terms" : {
          "field" : "references.keyword",
          "order": { "_count": "desc" }
        }
      }
    }
  }
}
1 голос
/ 24 мая 2020

Если ваши данные содержат referencesGiven и вам нужно искать по referencesReceived, я бы рекомендовал двусторонний проход:

  1. вставьте все документы с пустым полем для referencesReceived: []
    (или referencesReceivedCount: 0, если этого достаточно)
  2. для каждого документа, для каждого элемента в referencesGiven обновите документ, получив ссылку
1 голос
/ 24 мая 2020

Оценка_функции может использоваться, чтобы дать более высокий балл документам с большим количеством значений для поля ссылки

Сопоставление:

{
  "mappings": {
    "properties": {
      "id": {
        "type": "integer"
      },
      "note": {
        "type": "text"
      },
      "references": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword"
          }
        }
      }
    }
  }
}

Запрос:

{
  "query": {
    "function_score": {
      "query": {
        "match": {
          "note": "lorem"
        }
      },
      "functions": [
        {
          "script_score": {
            "script": "_score * doc['references.keyword'].length" --> references length
          }
        }
      ]
    }
  }
}

Результат:

 "hits" : [
      {
        "_index" : "index71",
        "_type" : "_doc",
        "_id" : "iJObRHIBXTOhZcHPaYks",
        "_score" : 0.035661265,
        "_source" : {
          "id" : 2,
          "note" : "lorem ipsum",
          "references" : [
            1,
            3
          ]
        }
      },
      {
        "_index" : "index71",
        "_type" : "_doc",
        "_id" : "h5ObRHIBXTOhZcHPYok2",
        "_score" : 0.017830633,
        "_source" : {
          "id" : 1,
          "note" : "lorem ipsum",
          "references" : [
            3
          ]
        }
      },
      {
        "_index" : "index71",
        "_type" : "_doc",
        "_id" : "iZObRHIBXTOhZcHPb4k4",
        "_score" : 0.017830633,
        "_source" : {
          "id" : 3,
          "note" : "lorem ipsum",
          "references" : [
            2
          ]
        }
      }
    ]
...