Заказ Elasticsearch по _score или max_score из API SearchResponse Java - PullRequest
0 голосов
/ 10 февраля 2020

У меня есть индекс, который содержит документы с тем же именем сотрудника и адресом электронной почты, но отличается от другой информации, такой как посещенные встречи и потраченная сумма.

{
   "emp_name" : "Raju",
   "emp_email" : "raju@abc.com",
   "meeting" : "World cup 2019",
   "cost" : "2000" 
}

{
   "emp_name" : "Sanju",
   "emp_email" : "sanju@abc.com",
   "meeting" : "International Academy",
   "cost" : "3000" 
}

{
   "emp_name" : "Sanju",
   "emp_email" : "sanju@abc.com",
   "meeting" : "School of Education",
   "cost" : "4000" 
}

{
   "emp_name" : "Sanju",
   "emp_email" : "sanju@abc.com",
   "meeting" : "Water world",
   "cost" : "1200" 
}

{
   "emp_name" : "Sanju",
   "emp_email" : "sanju@abc.com",
   "meeting" : "Event of Tech",
   "cost" : "5200" 
}

{
   "emp_name" : "Bajaj",
   "emp_email" : "bajaju@abc.com",
   "meeting" : "Event of Tech",
   "cost" : "4500" 
}

Теперь, когда я выполняю поиск по полю emp_name, например "raj", тогда я должен получить один из документов Raju, Sanju и Bajaj, так как я использую функцию нечеткого поиска (fuzziness (auto)).

Я реализуюasticsearch с использованием Java Высокий уровень покоя клиента 6.8 API .

TermsAggregationBuilder termAggregation = AggregationBuilders.terms("employees")
            .field("emp_email.keyword")
            .size(2000);

    TopHitsAggregationBuilder termAggregation1 = AggregationBuilders.topHits("distinct")
            .sort(new ScoreSortBuilder().order(SortOrder.DESC))
            .size(1)
            .fetchSource(includeFields, excludeFields);

Исходя из приведенного выше кода, он получает отдельные документы, но запись Раджу не находится в верхней части ответа, вместо этого мы видим документ Санджу из-за количества отсчетов.

Ниже JSON создан на основе запроса поиска.

{
  "size": 0,
  "query": {
    "bool": {
      "must": [
        {
          "multi_match": {
            "query": "raj",
            "fields": [
              "emp_name^1.0",
              "emp_email^1.0"
            ],
            "boost": 1.0
          }
        }
      ],
      "filter": [
        {
          "range": {
            "meeting_date": {
              "from": "2019-12-01",
              "to": null,
              "boost": 1.0
            }
          }
        }
      ],
      "adjust_pure_negative": true,
      "boost": 1.0
    }
  },
  "aggregations": {
    "employees": {
      "terms": {
        "field": "emp_email.keyword",
        "size": 2000,
        "min_doc_count": 1,
        "shard_min_doc_count": 0,
        "show_term_doc_count_error": false,
        "order": [
          {
            "_count": "desc"
          },
          {
            "_key": "asc"
          }
        ]
      },
      "aggregations": {
        "distinct": {
          "top_hits": {
            "from": 0,
            "size": 1,
            "version": false,
            "explain": false,
            "_source": {
              "includes": [
                "all_uid",
                "emp_name",
                "emp_email",
                "meeting",
                "country",
                "cost"
              ],
              "excludes": [

              ]
            },
            "sort": [
              {
                "_score": {
                  "order": "desc"
                }
              }
            ]
          }
        }
      }
    }
  }
}

Я думаю, что если мы упорядочим по max_score или _score, то запись Раджу будет в верхней части ответа.

Не могли бы вы дать я знаю, как получить заказ по _score или max_score документа, возвращенного ответом?

Пример ответа

{
  "took": 264,
  "timed_out": false,
  "_shards": {
    "total": 3,
    "successful": 3,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 232,
    "max_score": 0.0,
    "hits": [

    ]
  },
  "aggregations": {
    "sterms#employees": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "Sanju",
          "doc_count": 4,
          "top_hits#distinct": {
            "hits": {
              "total": 4,
              "max_score": 35.71312,
              "hits": [
                {
                  "_index": "indexone",
                  "_type": "employeedocs",
                  "_id": "1920424",
                  "_score": 35.71312,
                  "_source": {
                    "emp_name": "Sanju",
                      ...
                   }
            }
          ]
        }
      }
    }, 
    {
          "key": "Raju",
          "doc_count": 1,
          "top_hits#distinct": {
            "hits": {
              "total": 1,
              "max_score": 89.12312,
              "hits": [
                {
                  "_index": "indexone",
                  "_type": "employeedocs",
                  "_id": "1920424",
                  "_score": 89.12312,
                  "_source": {
                    "emp_name": "Raju",
                      ...
                   }
            }
          ]
        }
      }
    }

Позвольте мне теперь, если у вас есть какие-либо вопросы.

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

Спасибо, Четан

...