2010-10-19 4 views
0

У нас есть база данных SQL Server с миллионными записями, которые индексируются Lucene.net через Nhibernate.Search. Когда мы построили индекс для наших классов, мы старались быть обширными, поскольку затраты на индексацию/извлечение были действительно небольшими. Цель заключалась в том, чтобы предлагать полнотекстовый поиск пользователям на веб-странице с разбивкой на страницы.Lucene.Net и Nhibernate.Search: как управлять комплексными поисками?

Поскольку SQL Server жалуется на то, что к нему отправляется слишком много параметров (по умолчанию 2100 параметров), и поскольку мы не хотели изменять этот параметр каждый раз, когда мы достигаем предела (что может случиться легко, некоторые термины в нашем документе очень распространенный, но должен быть доступен для поиска) мы решили обработать все, от сортировки до подкачки в Lucene. Оно работало завораживающе.

Однако в последнее время функция-ползучесть вызывает у нас некоторую проблему, потому что новые запросы должны иметь доступ не только к полям, которые не индексируются, но также к полям, к которым не следует обращаться или к которым нельзя получить доступ: вычисленные поля, списки рекомендаций и т. д. ...

Поскольку мы поставили все наши поисковые вызовы и сортировку в Lucene.Net, и поскольку SQL Server придирчив к своим параметрам, как мы можем управлять своим пирогом и есть его?

Сначала я занимаюсь вычислением запросов sql, сводя элементы к их идентификатору документа, а затем загружая Lucene гигантский запрос OR со всеми возможными идентификаторами, чтобы позволить ему правильно выбрать то, что возможно, но я беспокоюсь о размере запроса

псевдокод

listIds = Nhibernate.Criteria.ReduceToIds.List(of MyObject) 
queryIds = String.join(" ID:", l) 
return NHibernate.Search(queryIds) 

по-видимому, можно иметь Lucene Фильтры работают, позволяя только некоторые документы ID быть частью запроса, поэтому оно должно быть возможно, но я не очень см. способ сделать это в Nhibernate.search

Есть ли у вас идеи, как я должен справиться с этой проблемой? Можно ли отфильтровать запрос, запросив SQL список идентификаторов? Это слишком много? Любое другое решение?

ответ

1

Обычно у вас есть проблемы, когда Lucene.Net возвращает более 2100 результатов, так как NHibernate.Search будет построить большой SELECT * FROM T WHERE ID IN (@ p0, p1 @ ...)

Таким образом, если ваш запрос lucene не возвращает более 2100 результатов, вы должны быть в порядке.

 Смежные вопросы

  • Нет связанных вопросов^_^