Проблема:
Я несколько раз запрашивал эластичный поиск с одним и тем же запросом и обнаружил, что даже когда я выполняю один и тот же запрос, возвращаемые документы не согласованы. Мой запрос выглядит так:
GET idx/_search
{
"query": {
"bool": {
"must": [
{
"bool": {
"should": [
{
},
{
}
]
}
}
],
"filter": [
{
},
{
}
]
}
},
"rescore": {
}
}
}
Я записал результаты выполнения одного и того же запроса четыре раза.
Документы вернулись в первый раз:
648626
629879
1237173
655329
9434601
Документы вернулись во второй раз:
648626
1237173
503380
9434601
14530103
Документы вернулись в третий раз:
648626
1237173
503380
9434601
Документы вернулись в четвертый раз:
648626
629879
1237173
655329
9434601
14530103
Я подозревал, что может быть некоторая проблема с индексацией, поэтому добавил preference = _primary и получил следующие документы:
648626
629879
1237173
9434601
14530103
и с предпочтением = _replica я получил следующие документы:
648626
1237173
655329
503380
9434601
При этом я мог видеть, что первичные осколки и осколки реплик имеют несогласованность в документах, и что документы 648626, 1237173 и 9434601 являются общими в первичном, и реплика, возвращаемая, когда я запрашивал все четыре раза.
Для двойного подтверждения я установил preference = _replica и добавил следующее в фильтр bool
{
"match": {
"id": 14530103
}
}
указание документа (1453010), который вернулся, когда я указал предпочтение = _primary, но я все еще получил документ, что противоречит ранее выполненному упражнению. Я также добавил «объяснить»: правда, чтобы увидеть осколок, но он показывает только осколок и не упоминает, является ли он первичным или точным, поэтому есть вероятность, что может быть ошибка.
У меня есть два вопроса:
Есть ли вероятность того, что и основной, и реплика могут быть не синхронизированы? Если так, то каким будет решение, и что это больше не повторится.
Есть ли способ, с помощью которого я могу подтвердить, откуда (основной или реплика) приходит конкретный документ?