Как я могу получить главные условия для подмножества документов в индексе Lucene?

Это типичный подход к фильтрации писем из заданной строки.

#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++;
}

Вот рабочий пример .

7
задан Andrew Rimmer 12 October 2008 в 12:34
поделиться

1 ответ

Идеально была бы утилита где-нибудь, чтобы сделать это, но я не знаю о том. Однако не слишком трудно сделать это "вручную" довольно эффективным способом. Я предположу, что у Вас уже есть 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 выше). Или я мог неправильно истолковывать их предупреждение. Если Вы чувствуете себя амбициозными, Вы могли бы попробовать его оба пути, выдержать сравнение и сообщить нам.

6
ответ дан 7 December 2019 в 07:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: