У меня есть Lucene-Index со следующими документами:
doc1 := { caldari, jita, shield, planet }
doc2 := { gallente, dodixie, armor, planet }
doc3 := { amarr, laser, armor, planet }
doc4 := { minmatar, rens, space }
doc5 := { jove, space, secret, planet }
, поэтому эти 5 документов используют 14 различных терминов:
[ caldari, jita, shield, planet, gallente, dodixie, armor, amarr, laser, minmatar, rens, jove, space, secret ]
частота каждого термина:
[ 1, 1, 1, 4, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1 ]
для удобства чтения:
[ caldari:1, jita:1, shield:1, planet:4, gallente:1, dodixie:1,
armor:2, amarr:1, laser:1, minmatar:1, rens:1, jove:1, space:2, secret:1 ]
Теперь я хочу узнать, как получить термин «вектор частоты» для набора
документы?
например:
Set<Documents> docs := [ doc2, doc3 ]
termFrequencies = magicFunction(docs);
System.out.pring( termFrequencies );
приведет к выводу:
[ caldari:0, jita:0, shield:0, planet:2, gallente:1, dodixie:1,
armor:2, amarr:1, laser:1, minmatar:0, rens:0, jove:0, space:0, secret:0 ]
удалить все нули:
[ planet:2, gallente:1, dodixie:1, armor:2, amarr:1, laser:1 ]
Обратите внимание, что вектор результата содержит только термин частоты набора
документы. НЕ общие частоты всего индекса!
Термин «планета» присутствует 4 раза во всем индексе, но набор источников
документов содержит только 2 раза.
Наивной реализацией было бы просто перебирать все документы в
docs
установить, создать карту и подсчитать каждый термин.
Но мне нужно решение, которое также будет работать с размером набора документов
100 000 или 500 000.
Есть ли в Lucene функция, которую я могу использовать для получения этого термина-вектора?
Если такой функции нет, как будет выглядеть структура данных?
кто-то может создать во время индекса, чтобы получить такой термин вектор
легко и быстро?
Я не эксперт по Lucene, поэтому извините, если решение очевидно или тривиально.
Возможно, стоит упомянуть: решение должно работать достаточно быстро для веб-приложения, применяемого к поисковым запросам клиентов.