PriorityQueue не является SortedList
или SortedDictionary
.Это своего рода реализация сортировки, где она возвращает лучшие результаты M (размер вашего PriorityQueue) из N элементов.Вы можете добавить InsertWithOverflow
столько элементов, сколько хотите, но в нем будут содержаться только самые верхние элементы M.
Предположим, ваш поиск дал 1000000 просмотров.Вы бы вернули все результаты пользователю?Лучшим способом было бы вернуть первые 10 элементов пользователю (используя PriorityQueue(10)
), и если пользователь запрашивает следующие 10 результатов, вы можете выполнить новый поиск с помощью PriorityQueue(
20
)
и вернуть следующие 10 элементы и так далее.Это хитрость, которую использует большинство поисковых систем, подобных Google.
Everytime Commit gets called, I can add the result to an internal PriorityQueue
.
Я не могу понять отношения между Commit
и search
, поэтому я добавлю пример использованияPriorityQueue:
public class CustomQueue : Lucene.Net.Util.PriorityQueue<Document>
{
public CustomQueue(int maxSize): base()
{
Initialize(maxSize);
}
public override bool LessThan(Document a, Document b)
{
//a.GetField("field1")
//b.GetField("field2");
return //compare a & b
}
}
public class MyCollector : Lucene.Net.Search.Collector
{
CustomQueue _queue = null;
IndexReader _currentReader;
public MyCollector(int maxSize)
{
_queue = new CustomQueue(maxSize);
}
public override bool AcceptsDocsOutOfOrder()
{
return true;
}
public override void Collect(int doc)
{
_queue.InsertWithOverflow(_currentReader.Document(doc));
}
public override void SetNextReader(IndexReader reader, int docBase)
{
_currentReader = reader;
}
public override void SetScorer(Scorer scorer)
{
}
}
searcher.Search(query,new MyCollector(10)) //First page.
searcher.Search(query,new MyCollector(20)) //2nd page.
searcher.Search(query,new MyCollector(30)) //3rd page.
РЕДАКТИРОВАТЬ для @ nokturnal
public class MyPriorityQueue<TObj, TComp> : Lucene.Net.Util.PriorityQueue<TObj>
where TComp : IComparable<TComp>
{
Func<TObj, TComp> _KeySelector;
public MyPriorityQueue(int size, Func<TObj, TComp> keySelector) : base()
{
_KeySelector = keySelector;
Initialize(size);
}
public override bool LessThan(TObj a, TObj b)
{
return _KeySelector(a).CompareTo(_KeySelector(b)) < 0;
}
public IEnumerable<TObj> Items
{
get
{
int size = Size();
for (int i = 0; i < size; i++)
yield return Pop();
}
}
}
var pq = new MyPriorityQueue<Document, string>(3, doc => doc.GetField("SomeField").StringValue);
foreach (var item in pq.Items)
{
}