С точки зрения структуры данных, как Lucene (Solr/ElasticSearch) так быстро отфильтровывает термины? Например, для всех документов, содержащих слово "бекон", найти счетчики для всех слов в этих документах.
Во-первых, для фона я понимаю, что Lucene полагается на структуру данных сжатого массива бит, сродни CONCISE. Концептуально этот бит-массив содержит 0 для каждого документа, который не соответствует термину, и 1 для каждого документа, который соответствует термину. Но классная/удивительная часть состоит в том, что этот массив может быть сильно сжат и очень быстро работает в булевых операциях. Например, если вы хотите знать, какие документы содержат термины "красный" и "синий", то вы берете бит-бит, соответствующий "красному", и бит-бит, соответствующий "синему", и "И" вместе, чтобы получить бит-массив, соответствующий соответствия документов.
Но как же Луцен быстро определяет подсчеты для всех слов в документах, которые соответствуют "беку"? В моем наивном понимании Люцену пришлось бы взять бит-массив, связанный с беконом, и И это с битовыми массивами для каждого другого слова. Я что-то упускаю? Я не понимаю, как это может быть эффективно. Кроме того, нужно ли снимать эти битовые массивы с диска? Это звучит все хуже!
Как работает волшебство?