Доступ к вложенным объектам в Elasticsearch с помощью скрипта - PullRequest
0 голосов
/ 02 июля 2019

Я пытаюсь использовать данные из результатов ElasticSearch 6 при настройке оценки для моих результатов.

Часть моего отображения выглядит так:

{
    "properties": {
        "annotation_date": {
            "type": "date"
        },
        "annotation_date_time": {
            "type": "date"
        },
        "annotations": {
            "properties": {
                "details": {
                    "type": "nested",
                    "properties": {
                        "filter": {
                            "type": "text",
                            "fielddata": True,
                            "fields": {
                                "keyword": {
                                    "type": "keyword",
                                    "ignore_above": 256
                                }
                            }
                        },
                        "bucket":  {
                            "type": "text",
                            "fielddata": True,  
                            "fields": {
                                "keyword": {
                                    "type": "keyword",
                                    "ignore_above": 256
                                }
                            }
                        },
                        "keyword":  {
                            "type": "text",
                            "fielddata": True,
                            "fields": {
                                "keyword": {
                                    "type": "keyword",
                                    "ignore_above": 256
                                }
                            }
                        },
                        "frequency": { 
                            "type": "long",
                            }
                        }
                    }
                }
            }
        }
    }

Пример части документа JSON:

"annotations": {
      "details": [
        {
          "filter": "filter_A",
          "bucket": "bucket_A",
          "keyword": "keyword_A",
          "frequency": 6
        },
        {
          "filter": "filter_B",
          "bucket": "bucket_B",
          "keyword": "keyword_B",
          "frequency": 7
        }
      ]

Я хочу использовать частоту моих аннотаций.детали, если они попадают в определенное «ведро», что я пытаюсь сделать со следующим:

GET my_index/_search
{
  "size": 10000,
  "query": {
    "function_score": {
      "query": {
            "match": { "title": "<search term>" }
      },
      "script_score": {
        "script": {
          "lang": "painless",
          "source": """ 

          int score = 0;
          for (int i = 0; i < doc['annotations.details.filter'].length; i++){
            if (doc['annotations.details.filter'][i].keyword == "bucket_A"){
              score += doc['annotations.details.frequency'][i].value;
            }
          }

          return score;


          """
        }
      }
    }
  }
}

В конечном счете, это будет означать, что в данной конкретной ситуации ожидаемая оценка составляет 6 баллов. Если бы она попала в большее количество сегментов, счет увеличивается с частотой попадания.

1 Ответ

0 голосов
/ 02 июля 2019

Вы должны использовать bool, must с range и gt

пример

GET /_search
{
    "query": {
        "nested" : {
            "path" : "obj1",
            "score_mode" : "avg",
            "query" : {
                "bool" : {
                    "must" : [
                    { "match" : {"obj1.name" : "blue"} },
                    { "range" : {"obj1.count" : {"gt" : 5}} }
                    ]
                }
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...