Как отфильтровать результат "попадания", возвращаемый функцией indexsearcher.search ()? - PullRequest
3 голосов
/ 12 марта 2012

Как я могу уменьшить размер объекта "Hits", который возвращается функцией indexsearcher.search ()?

В настоящее время я делаю что-то вроде:

Hits hits = indexSearch.search(query,filter,...);

Iterator hitsIt = hits.iterator();
int newSize=0;
while (hitsIt.hasNext()){
   Hit currHit = (Hit)hitsIt.next();

   if (hasPermission(currHit)){
      newSize++;
   }
}

Однако этосоздает огромную проблему с производительностью, когда число обращений велико (например, 500 или более).

Я слышал о чем-то под названием «HitsCollector» или, может быть, «Collector», что должно помочь повысить производительность, но японятия не имею, как его использовать.

Буду признателен, если кто-нибудь укажет мне правильное направление.

Мы используем Apache Lucene для индексации в веб-приложении Atlassian Confluence.

Ответы [ 2 ]

3 голосов
/ 15 июля 2012

Collector - это простой механизм обратного вызова, который вызывается для каждого попадания документа, вы бы использовали такой коллектор, как этот: -

public class MyCollector extends HitCollector {

// this is called back for every document that 
// matches, with the docid and the score

public void collect(int doc, float score){

    // do whatever you have to in here

}
}

..

HitCollector collector = new MyCollector();

indexSearch(query,filter,collector);
1 голос
/ 30 марта 2012

Для хорошей производительности вы должны индексировать информацию о безопасности вместе с каждым документом. Это, конечно, зависит от вашей модели безопасности. Например, если вы можете назначить каждый документ ролям безопасности, для которых есть разрешения, используйте его. Также проверить этот вопрос . Ваш в значительной степени дублирует это.

...