Существует документ типа «человек» с двумя полями «город» и «пол», например.elasticsearch BitSet Filter или что-то еще?
person : {
"name" : "x",
"city" : "stockholm",
"gender" : "m"
}
Пример данных:
person: {name: "x", "city" : "stockholm", "gender" : "m"}
person: {name: "y", "city" : "stockholm", "gender" : "m"}
person: {name: "z", "city" : "stockholm", "gender" : "m"}
person: {name: "zz", "city" : "stockholm", "gender" : "f"}
person: {name: "xy", "city" : "uppsala", "gender" : "m"}
person: {name: "xz", "city" : "stockholm", "gender" : "m"}
person: {name: "yy", "city" : "uppsala", "gender" : "f"}
Первый запрос: выбрать 2-х человек случайно, которые живут в стокгольм
size: 2,
"query": {
"function_score": {
"query": {
"term": {
"city": {
"value": "stockholm"
}
}
},
"functions": [
{
"random_score": {
"seed": 314159265359
}
}
]
}
}
Всего хитов выше запроса 5, из которых были отобраны 2 результатов в случайном порядке
possible result (As it can be random):
person: {name: "y", "city" : "stockholm", "gender" : "m"}
person: {name: "zz", "city" : "stockholm", "gender" : "f"}
Второй запрос: теперь я хочу выбрать людей, у которых есть пол «м», но не был выбран по первому запросу. что-то вроде
bool : must [{
term: {
"gender" : "m"
}
}]
must_not : [{ /*NOT SELECTED BY FIRST QUERY i.e name = y, zz */}]
result:
person: {name: "x", "city" : "stockholm", "gender" : "m"}
person: {name: "z", "city" : "stockholm", "gender" : "m"}
person: {name: "xy", "city" : "uppsala", "gender" : "m"}
person: {name: "xz", "city" : "stockholm", "gender" : "m"}
Возможно ли это с помощью каких-либо средств в elasticsearch? Возможно, с помощью фильтров (с использованием BitSet для быстрого доступа к идентификаторам документов) или с помощью разборки запроса?
Обратите внимание, что размер данных составляет миллионы, и если я извлекаю данные из первого запроса, что приводит к нескольким миллионам, это занимает много времени, что неприемлемо в нашем сценарии. Мне нужно только подсчет, а не фактические данные в обоих запросах.
Я не против делать это в одном запросе, если это возможно, но я не уверен, как это сделать.
Вам нужен точный подсчет или примерный? – Giovanni
Точный подсчет хорош, но если это невозможно, я пока буду приближаться, пока он близок к точному счету. – Zeeshan
Поскольку это случайное значение, вам необходимо вручную ввести условия обязательного условия must_not. как «must_not»: [{"name": "y"}, {"name": "zz"}] – Varshaan