Это типичный подход к фильтрации писем из заданной строки.
#include
char s[20] = "something";
char no_vowels[20] = {0};
int i = 0;
int j = 0;
const char *vowels = "aeiou";
while (s[i]) {
if (!strchr(vowels, s[i])) {
no_vowels[j] = s[i];
j++;
}
i++;
}
Вот рабочий пример .
Идеально была бы утилита где-нибудь, чтобы сделать это, но я не знаю о том. Однако не слишком трудно сделать это "вручную" довольно эффективным способом. Я предположу, что у Вас уже есть a Query
и/или Filter
возразите, что можно использовать для определения подмножества интереса.
Во-первых, создайте список в память обо всех идентификаторах документа в Вашем индексном подмножестве. Можно использовать IndexSearcher.search(Query, Filter, HitCollector)
сделать это очень быстро; HitCollector
документация включает пример, который кажется, что она должна работать, или можно использовать некоторый другой контейнер для хранения идентификаторов документа.
Затем, инициализируйте пустой HashMap (или безотносительно), чтобы отобразить условия на общую частоту и заполнить карту путем вызова одного из IndexReader.getTermFreqVector
методы для каждого документа и интересующей области. Форма с тремя аргументами кажется более простой, но любой должен быть очень хорошо. Для формы с тремя аргументами Вы сделали бы a TermVectorMapper
чей map
метод проверяет если term
находится в карте, партнеры это с frequency
в противном случае или добавляет frequency
к существующему значению раз так. Обязательно используйте то же TermVectorMapper
объект через все вызовы к getTermFreqVector
в этой передаче, вместо того, чтобы инстанцировать новой для каждого документа в цикле. Можно также ускорить вещи вполне немного путем переопределения isIgnoringPositions()
и isIgnoringOffsets()
; Ваш объект должен возвратиться true
для обоих из тех. Это похоже на Ваш TermVectorMapper
мог бы также быть вынужден определить a setExpectations
метод, но что ничего не нужно сделать.
После того как Вы создали свою карту, просто сортируете объекты карты по убывающей частоте и прочитываете однако много вершин, называет Вас как. Если Вы знаете заранее, сколько условий Вы хотите, Вы могли бы предпочесть делать некоторый необычный основанный на "куче" алгоритм для нахождения вершины k, объекты в линейное время вместо того, чтобы использовать O (n регистрируют n), вид. Я предполагаю, что простой вид будет много быстро на практике. Но Вам решать.
Если Вы предпочитаете, можно объединить первые два этапа при наличии Вашего HitCollector
вызвать getTermFreqVector
непосредственно. Это должно, конечно, привести к одинаково корректным результатам и интуитивно кажется, что было бы более простым и лучше, но документы, кажется, предупреждают, что выполнение так, вероятно, будет вполне немного медленнее, чем подход с двумя передачами (на той же странице как пример HitCollector выше). Или я мог неправильно истолковывать их предупреждение. Если Вы чувствуете себя амбициозными, Вы могли бы попробовать его оба пути, выдержать сравнение и сообщить нам.