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

StackOverflow https://stackoverflow.com/questions/67706

  •  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» — это табличная функция, которая внутренне использует полнотекстовый поиск.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top