powered by simpleCommunicator - 2.0.28     © 2024 Programmizd 02
Map
Форумы / NoSQL, Big Data [игнор отключен] [закрыт для гостей] / Агрегации ElasticSearch
2 сообщений из 2, страница 1 из 1
Агрегации ElasticSearch
    #39784516
alex1610
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день! Возникла необходимость обработать дублирующиеся по совпадению ряда полей записи, хранящиеся в эластике. Возникло 2 вопроса по агрегациям...

1) Несоответствие количества записей
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
GET /my_index/_search
{
    "size":0,
    "aggs" : {
        "duplicateCount" : {
            "terms" : {
              "field" : "LastName.keyword",
              "min_doc_count": 2,
              "show_term_doc_count_error": true
            }
        }
    }
}


Получаю

Код: sql
1.
2.
3.
4.
5.
6.
7.
...
{
          "key": "Иванов",
          "doc_count": 2909,
          "doc_count_error_upper_bound": 0
}
...



Но если я сделаю, например запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
GET /my_index/_search
{
  "query": {
    "multi_match" : {
      "query":    "Иванов", 
      "fields": [ "LastName" ] 
     }
  }
}



Получаю

Код: sql
1.
2.
3.
4.
...
"hits": {
    "total": 2942,
...



Откуда берется вот такое расхождение? В моем случае это не особо критично, но могу я быть уверен, что curl с агрегацией не пропустит дубликаты?

2) Не могу сделать группировку по нескольким полям

Почему не работает вот это вот я понимаю...
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
GET /my_index/_search
{
    "size":0,
    "aggs" : {
        "duplicateCount" : {
            "terms" : {
                "script": "doc['LastName.keyword'].value + doc['FirstName.keyword'].value",
                "min_doc_count": 2
            }
        }
    }
}



Но если я хочу сделать вот так вот:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
GET /my_index/_search
{
    "size":0,
    "aggs" : {
        "duplicateCount" : {
            "terms" : {
                "script": "doc['LastName'].value + doc['FirstName'].value",
                "min_doc_count": 2
            }
        }
    }
}



я получаю ошибку

"Fielddata is disabled on text fields by default. Set fielddata=true on [LastName] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead."

Решение из доков мне не помогает: https://www.elastic.co/guide/en/elasticsearch/reference/current/fielddata.html#_enabling_fielddata_on_literal_text_literal_fields

После выполнения

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
PUT /my_index/info/_doc
{
  "properties": {
    "FirstName": { 
      "type":     "text",
      "fielddata": true
    }
  }
}

PUT /my_index/info/_doc
{
  "properties": {
    "LastName": { 
      "type":     "text",
      "fielddata": true
    }
  }
}



У меня поменялся мапинг:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
{
  "mapping": {
    "info": {
      "properties": {
        "FirstName": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "LastName": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        ...
        "properties": {
          "properties": {
            "FirstName": {
              "properties": {
                "fielddata": {
                  "type": "boolean"
                },
                "type": {
                  "type": "text",
                  "fields": {
                    "keyword": {
                      "type": "keyword",
                      "ignore_above": 256
                    }
                  }
                }
              }
            },
            "LastName": {
              "properties": {
                "fielddata": {
                  "type": "boolean"
                },
                "type": {
                  "type": "text",
                  "fields": {
                    "keyword": {
                      "type": "keyword",
                      "ignore_above": 256
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}



Но нужный мне curl все равно не работает.

Прошу прощения за большое полотно писанины, очень нуждаюсь в подсказке / хорошем мануале. Очень не хочется выгружать в приложение вообще все данные из эластика (документов очень много) и искать дубликаты. Хотелось бы вернуть только задублированные и уже потом их обработать.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Агрегации ElasticSearch
    #39997513
Фотография Apex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex1610Откуда берется вот такое расхождение?
Скорее всего поэтому
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-terms-aggregation.html Terms are collected and ordered on a shard level and merged with the terms collected from other shards in a second step. However, the shard does not have the information about the global document count available. The decision if a term is added to a candidate list depends only on the order computed on the shard using local shard frequencies. The min_doc_count criterion is only applied after merging local terms statistics of all shards. In a way the decision to add the term as a candidate is made without being very certain about if the term will actually reach the required min_doc_count. This might cause many (globally) high frequent terms to be missing in the final result if low frequent terms populated the candidate lists. To avoid this, the shard_size parameter can be increased to allow more candidate terms on the shards. However, this increases memory consumption and network traffic.

alex1610Но нужный мне curl все равно не работает.
После изменения маппинга документы надо реиндексировать.
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / NoSQL, Big Data [игнор отключен] [закрыт для гостей] / Агрегации ElasticSearch
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]