2009-07-06 8 views
1

У меня есть 3 таблицы, которые соединяются. Рестораны, кухни и кухня. Ресторан может продавать много кухни пищи (это плохо формулировка, но вы получите идею?)полнотекстовый поиск, результаты поиска по лучшим совпадениям

Так что я полные настройки текста на ресторане: Имя, CityTown, индекс и CuisineType: Имя

У меня есть один SearchBox на моей домашней странице и по мере того, как результаты пользовательских типов фильтруются для наилучшего соответствия.

Вот несколько примеров: SearchText = "Royal D Ed" Теперь в ресторане есть место для королевской династии, а город - Эдинбург. Но мой верный результат назад для чего-то, где город начинается с D, а также имя. Это не лучший матч.

Я покажу вам, что мой сохраненный proc, прототип, так что полученные имена немного хаки.

ALTER PROCEDURE [dbo].[RestaurantsFullText] 
    @searchText nvarchar(255) 
AS 
SELECT 
    b.*, 
    COALESCE(akt2.[Rank],0)/30 + 
    COALESCE(akt1.[Rank],0)/30 + 
    COALESCE(akt.[Rank],0)/30 + 
    COALESCE(bkt.[Rank],0) as rankCount 
FROM 
    Restaurants b 
left JOIN Cuisines c on b.Id = c.RestaurantId 
left join CuisineType a 
ON c.CuisineId = a.id 

left JOIN 
containstable(Restaurants, Name, @searchText) bkt 
ON b.id = bkt.[Key] 

left JOIN containstable(CuisineType, Name, @searchText) akt 
ON a.id = akt.[Key] 

left JOIN containstable(Restaurants, Postcode, @searchText) akt1 
ON b.id = akt1.[Key] 

left JOIN containstable(Restaurants, citytown, @searchText) akt2 
ON b.id = akt2.[Key] 

where 
    COALESCE(akt2.[Rank],0)/30 + 
    COALESCE(akt1.[Rank],0) /30 + 
    COALESCE(akt.[Rank],0)/30 + 
    COALESCE(bkt.[Rank],0) > 5 
ORDER BY 
    COALESCE(akt2.[Rank],0)/30 + 
    COALESCE(akt1.[Rank],0)/30 + 
    COALESCE(akt.[Rank],0)/30 + 
    COALESCE(bkt.[Rank],0) asc 

Я думаю, что проблема заключается в объединениях и рассчитывается ранг пути.

Я хочу, чтобы, если я перехожу в «Королевскую династию Эдинбург-д», тогда королевская династия по-прежнему является лучшим матчем.

Поскольку это фильтр, тогда матчи для городов в других городах, начиная с d, не возвращаются.

Мне было бы очень приятно помочь в этом.

ответ

2

Быстрый и легкий первый шаг

Я бы разобрать строку (если используется SQL Server 2008 есть inbuilt function удалить шумовые слова, если это возможно) и создать строку для поиска логического типа

«Royal» и "d *" и "ed *", которые вы могли бы выполнить поверх существующего запроса. Если он не возвращает никаких результатов, составьте свои данные в одном представлении или таблице и FTS, чем вместо всех отдельных таблиц, поскольку это может быть так, что ED не найден в таблице Ресторана и поэтому игнорируется.

Если это не доставит вас достаточно близко. Если я буду жить, я остановлюсь и посмотрю на поиски, которые люди делают, и данные, которые они ищут, более тесно работают, чтобы улучшить эти результаты. Если это невозможно; я бы построил эту функцию перед изменением поиска, зная, как люди используют программное обеспечение, прежде чем изменять его, - лучшее место для запуска imo. Там может быть интерфейс способ улучшения вещей; например лучше решить проблему в интерфейсе, предложив людям королевскую династию в качестве опции, которую они набирают в королевском d в поле поиска.

Как я не знаю, сколько людей ищут название ресторана, кухню или местоположение в вашем приложении, это довольно общее. В зависимости от того, что вы видите, люди ищут из ваших журналов, тогда я бы пошел по-другому. В подобном сценарии я бы построил свой поиск более динамично, а не один запрос на передачу, как кодированный (хотя для каждого поиска потребуется больше вычислительной мощности, поэтому вам, возможно, придется это учитывать.)

Рассмотрите либо глубокий поиск в данных или или разделителя слов на основе тезауруса, который использует некоторые знания ваших данных для определения приоритетов результатов. Вместо того, чтобы перекачивать всю строку в поисках и пытаться найти Royal D в списке вашей кухни, лучше сначала найти ее в списке ресторанов в качестве высокого соответствия, а затем удалить из строки поиска; затем выполните поиск по всем матчам из ресторанов в месте/кухне против сокращенной строки поиска.Таким образом, поиски в кухне и данные о местоположении основаны на матчах в ресторане (так что это должно быть быстрее, чем набор данных), и вы ищете с меньшим количеством данных; строка почтового индекса ED, возможно.

Предлагая подсказки по результатам поиска - это хорошо; если поиск очень быстрый, пользователи часто будут искать несколько раз, чтобы получить лучшие результаты, поэтому на экране с результатами поиска. Вы имели в виду, что Edinburgh снова поможет вам улучшить ваш поиск.

+0

быстро сыграл сегодня утром; удачи :) – u07ch

+0

Спасибо, я немного обновил дизайн (я не дизайнер, так что делаю маленькие биты за раз;)) Думаю, мне нужно будет провести следующие несколько дней на других фальсификациях, поскольку поиск и фильтр по почтовому индексу все занимают мою голову в га. Я вообще не разбираюсь в SQL – ddd