Тестирование полного поиска в LINQ (запрос пользовательского фильтра)
-
05-07-2019 - |
Вопрос
У меня есть таблица со списком названий ресторанов и ссылками на другую таблицу, содержащую тип кухни.
Я хочу разместить на своей веб-странице окно поиска, в котором при вводе каждое слово ищется в базе данных и возвращает результаты.Я искал решение, которое не требует настройки полнотекстового поиска sql, поскольку я хочу иметь возможность протестировать это с помощью Linq to SQL.
Из моего старого кода у меня есть функция, которая создает фильтр запроса на основе входного текста и возвращает все результаты на его основе.
Private Function SetupQuery(ByVal searchText As String) As String
Dim searchFields As New List(Of String)
searchFields.Add("Name")
searchFields.Add("Postcode")
searchFields.Add("Cuisine")
Dim firstCol As Boolean = True
Dim a() As String
Dim j As Integer
a = searchText.Trim.Split(" ")
Dim filter As String = ""
Dim compareString As String
For Each col As String In searchFields
For j = 0 To a.GetUpperBound(0)
compareString = a(j).ToUpper()
compareString = compareString.Trim()
If firstCol Then
filter = filter & col & " LIKE '" & compareString & "%' "
firstCol = False
Else
filter = filter & " or " & col & " LIKE '" & compareString & "%' "
End If
Next
Next
Return filter
End Function
При этом поля поиска жестко запрограммированы, а затем циклически проходится по каждому слову в тексте поиска, чтобы создать фильтр ИЛИ НРАВИТСЯ.
Я уверен, что затем я мог бы использовать это в своем коде LINQ, но это не кажется элегантным решением, особенно потому, что столбцы жестко запрограммированы и не используются так, как их использует LINQ.
Может ли кто-нибудь порекомендовать лучший способ сделать это или несколько советов, в каком направлении двигаться?
Спасибо
Решение
Вы можете использовать полнотекстовый поиск и при этом использовать LINQ to SQL.Вы можете создать хранимую процедуру и использовать LINQ для ее вызова.Помимо поиска точных совпадений, вы можете вернуть:
- Простой поиск по конкретным словам или фразам
- Тезаурус ищет синонимичные формы слов – поиск в IE может возвращать результаты в Internet Explorer и IE (расширенный поиск на основе тезауруса);поиск в Бомбее может также вернуть результаты в Мумбаи (поиск замены на основе тезауруса)
- Поиски, которые вернут все различные лингвистические формы слова (называемые поколениями), поиск по банку будет возвращать совпадения с банковским делом, банком, банками, банками и банками и т. д.(все склонения и/или спряжения банка поисковых запросов)
- Поиск без учета акцента: поиск по кафе вернет результаты к кафе и кафе.
http://www.simple-talk.com/sql/learn-sql-server/sql-server-full-text-search-language-features/
Другие советы
Я не знаю, как это повлияет на ваше тестирование, но LinqtoSQL можно заставить работать с полнотекстовым индексированием, приложив несколько усилий:
Вероятно, это не лучший способ сделать это, но если вы всегда получаете текст поиска в виде строки, разделенной на массив из трех, вы можете попробовать использовать это:
from t in temp
where t.Name == a(0)
|| t.Postcode == a(1)
|| t.Cuisine == a(2)
select t
Обычно я занимаюсь C#, поэтому, естественно, все в VB пугает, но я думаю, что синтаксис LINQ должен быть похожим.