LinqToSql и полнотекстовый поиск – можно ли это сделать?
-
09-06-2019 - |
Вопрос
Кто-нибудь придумал хороший способ выполнения полнотекстового поиска (FREETEXT() CONTAINS()
) для любого количества произвольных ключевых слов с использованием стандартного синтаксиса запросов LinqToSql?
Я, очевидно, хотел бы избежать необходимости использовать хранимую процедуру или генерировать вызовы динамического SQL.
Очевидно, я мог бы просто передать строку поиска по параметру в SPROC, который использует FREETEXT() или CONTAINS(), но я надеялся подойти к поиску более творчески и составить такие запросы, как:
«пицца пепперони» и гамбургер, а не «яблочный пирог».
Я знаю, это безумие, но разве не было бы здорово иметь возможность делать это прямо из LinqToSql?Любые советы о том, как этого добиться, будут высоко оценены.
Обновлять:Я думаю, что я могу что-то понять здесь...
Также:Я отменил изменение, внесенное в заголовок моего вопроса, потому что оно фактически изменило смысл того, что я спрашивал.я знать что полнотекстовый поиск не поддерживается в LinqToSql — я бы задал этот вопрос, если бы хотел это знать.Вместо этого я обновил свой заголовок, чтобы успокоить массы, довольные редактированием и нажимающие на спусковой крючок.
Решение
К сожалению, LINQ to SQL не поддерживает полнотекстовый поиск.
Есть ряд продуктов, которые, на мой взгляд, могут:На ум приходит Lucene.NET, NHibernate Search.LINQ для NHibernate в сочетании с NHibernate Search, вероятно, предоставит эту функциональность, но оба все еще находятся на стадии бета-тестирования.
Другие советы
Мне удалось обойти это, используя функцию с табличным значением для инкапсуляции компонента полнотекстового поиска, а затем сославшись на нее в моем выражении 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» — это табличная функция, которая внутренне использует полнотекстовый поиск.