Я недавно начал использовать Elastic Search в первый раз, и я ищу некоторую информацию / помощь.У меня проблема с запросом термина, который не очень хорошо работает, и это наводит меня на мысль, что мой подход к «разделению» индексов может быть не лучшим.Я надеюсь, что кто-то может дать некоторое представление об этом.
набор данных, который мне нужен для перехода в Elastic Search, состоит из ок.60-70 миллионов записей.записи в основном представляют собой записи человек + адрес + метаданные, и существует два очевидных способа разделить / разделить их на несколько индексов.Я делаю это прямо сейчас, создав 4 индекса.Эти 4 индекса связаны с 4 различными «типами» записей, которые содержатся в наборе данных.Думайте о 4 типах как "счета клиентов", "перспективы", "должники" и "лица / адреса из черного списка".каждая из записей в этих 4 индексах связана с компанией, и я хочу иметь возможность поиска (среди прочего) по «типу» и «компании».
«по типу» легко, япросто обратитесь к индексу, связанному с типом.для части "by company" я начал использовать термин запроса, подобный этому (это запрос bool, потому что он обычно включает дополнительные параметры поиска, которые я исключил здесь для простоты / ясности):
{
"query": {
"bool": {
"filter": [{
"term": { "company": "MY COMPANY NAME" }
}]
}
}
}
получаетсячто этот запрос не очень быстрый, по крайней мере, не для индекса "счета клиента" и крупнейшей компании, имеющей aprox.16 миллионов записей аккаунтов клиентов.
Насколько я понимаю, в обратном индексе будет запись "ИМЯ КОМПАНИИ", с которой будет связано 16 миллионов документов, а термин запрос должен повторяться по всемиз них.
профилирование запроса показывает, что большую часть времени тратится на "next_doc" (насколько я понимаю, это итерационная часть):
"profile": {"shards": [ {
"id": "[ysJiBZNTRsuha0E8LU28sA][kunden][0]",
"searches": [ {
"query": [ {
"type": "BoostQuery",
"description": "(ConstantScore(company:MY COMPANY NAME))^0.0",
"time_in_nanos": 11295720987,
"breakdown": {
"score": 2778410326,
"build_scorer_count": 54,
"match_count": 0,
"create_weight": 19602,
"next_doc": 8485047975,
"match": 0,
"create_weight_count": 1,
"next_doc_count": 15728947,
"score_count": 15728921,
"build_scorer": 785161,
"advance": 0,
"advance_count": 0
},
"children": [ {
"type": "TermQuery",
"description": "company:MY COMPANY NAME",
"time_in_nanos": 2873750226,
"breakdown": {
"score": 0,
"build_scorer_count": 54,
"match_count": 0,
"create_weight": 9745,
"next_doc": 2857426300,
"match": 0,
"create_weight_count": 1,
"next_doc_count": 15728947,
"score_count": 0,
"build_scorer": 585179,
"advance": 0,
"advance_count": 0
}
}]
}],
кстати,поле компании отображается как поле «ключевого слова».
На данный момент я не уверен, как решить эту проблему производительности.
Возможно, существует другой тип запроса, который может сделать это более эффективным?или я могу по-разному параметризовать запрос запроса, чтобы сделать его быстрее?
Я также решил поместить каждую комбинацию «тип» и «компания» в свой собственный индекс, чтобы избежать запроса «по компании» в целом.
, поэтому у меня будет, например, индекс с именем "progress_COMPANY_A", другой с именем "progress_COMPANY_B", другой с именем "debtors_COMPANY_A" и т. Д.
, чтобы я мог фильтровать по "типу" и по«company», указав правильный индекс, а затем просто отфильтровав его по дополнительным параметрам поиска, которые я исключил в моем примере здесь (эта часть запроса (куча предложений «should») уже очень быстрая)
но я не уверен, что это тоже хорошая идея, потому что это приведет к большому количеству индексов (около 60 различных компаний в наборе данных), многие из них будут содержать только пару тысяч или, может быть, десяткитысячи записей.и для запросов, которые ищут «все компании», мне потенциально пришлось бы искать по 60 индексам параллельно.у которого, возможно, есть потенциал для совершенно другого вида червей.
Я хотел бы получить некоторую информацию о том, как к этому подойти.
Заранее спасибо!
С уважением Марио