LinqToSql и полнотекстовый поиск — можно ли это сделать?

Кто-нибудь придумал хороший способ выполнения полнотекстового поиска (FREETEXT() CONTAINS()) для любого количества произвольных ключевых слов с использованием стандартного синтаксиса запросов LinqToSql?

Я, очевидно, хотел бы избежать использования Stored Proc или необходимости генерировать вызовы Dynamic SQL.

Очевидно, я мог бы просто передать строку поиска по параметру в SPROC, который использует FREETEXT() или CONTAINS(), но я надеялся подойти к поиску более творчески и создать такие запросы, как:

"пицца пепперони" и бургер, а не "яблочный пирог".

Сумасшествие, я знаю, но было бы здорово иметь возможность делать это прямо из LinqToSql? Любые советы о том, как этого добиться, будут высоко оценены.

Обновление: я думаю, что могу найти что-то здесь...

Кроме того: я отменил изменение, внесенное в заголовок моего вопроса, потому что оно фактически изменило смысл того, что я спрашивал. Я знаю, что полнотекстовый поиск не поддерживается в LinqToSql — я бы задал этот вопрос, если бы хотел это знать. Вместо этого я обновил свой заголовок, чтобы успокоить массы, которые любят редактирование.


person RobertTheGrey    schedule 15.09.2008    source источник


Ответы (2)


К сожалению, LINQ to SQL не поддерживает полнотекстовый поиск.

Есть куча продуктов, которые, я думаю, могли бы это сделать: на ум приходит Lucene.NET, NHibernate Search. LINQ для NHibernate в сочетании с NHibernate Search, вероятно, даст эту функциональность, но оба все еще находятся в стадии бета-тестирования.

person Jon Limjap    schedule 15.09.2008
comment
Привет, Джон, спасибо за это. Я доволен вашим ответом в принципе и знаю, что могу добавить еще один уровень абстракции. Хотя это не идеально - можно также написать CONTAINS() SPROC и использовать Linq для всего остального. Мой вопрос: можно ли это сделать с помощью Linq? Если нет, то вашего ответа будет достаточно. - person RobertTheGrey; 16.09.2008
comment
Я решил использовать для этого Lucene.NET, и он действительно работает очень хорошо. Теперь мне просто нужно запустить Memcached, и мне вряд ли понадобится обращаться к БД ;-) - person RobertTheGrey; 29.12.2008

Мне удалось обойти это, используя функцию с табличным значением для инкапсуляции компонента полнотекстового поиска, а затем сославшись на него в моем выражении LINQ, сохраняя преимущества отложенного выполнения:

string q = query.Query;
IQueryable<Story> stories = ActiveStories
                        .Join(tvf_SearchStories(q), o => o.StoryId, i => i.StoryId, (o,i) => o)
                        .Where (s => (query.CategoryIds.Contains(s.CategoryId)) &&
                                    /* time frame filter */
                                (s.PostedOn >= (query.Start ?? SqlDateTime.MinValue.Value)) &&
                                (s.PostedOn <= (query.End ?? SqlDateTime.MaxValue.Value)));

Здесь tvf_SearchStories — это функция с табличным значением, которая внутренне использует полнотекстовый поиск.

person LaserJesus    schedule 12.12.2008