Полнотекстовый поиск с использованием 2 таблиц - PullRequest
0 голосов
/ 20 апреля 2010

Я очень недолюбливаю к полнотекстовому поиску, и мне сказали сделать полнотекстовый поиск по двум таблицам и отсортировать результаты по релевантности.

Я посмотрю на таблицу "Посты" и таблицу "ПостКомментарии". Я должен искать поисковый термин (скажем, «AnyWord») в Posts.Description, Posts.Title и PostComments.Comments.

Я должен вернуть порядок сообщений по релевантности, но так как я просматриваю сообщения и сообщения, я не знаю, имеет ли это смысл. Я бы сказал, что мне нужна вся информация в той же таблице, чтобы отсортировать по релевантности.

Не могли бы вы помочь мне понять, имеет ли это смысл, и если да, то как его достичь?

EDIT

Я постараюсь немного лучше объяснить, что мне нужно.

Сообщение релевантно для поиска, если искомый термин присутствует в заголовке, описании или в любом из связанных PostComments.

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

Таким образом, у вас могут быть сообщения о результатах поиска, которые соответствуют JUST, поскольку поисковый термин присутствует в одном или нескольких комментариях

1 Ответ

1 голос
/ 20 апреля 2010

Только ContainsTable возвращает оценку релевантности. Вы не упомянули, что нужно вернуть, поэтому я просто возвратил имя таблицы, из которой хранится значение, вместе с первичным ключом данной таблицы (вы должны заменить «PrimaryKey» на фактическое имя столбца первичного ключа, например, PostId или PostCommentsId) , значение и его ранг.

Select Z.TableName, Z.PK, Z.Value, Z.Rank
From    (
        Select  'Posts' As TableName, Posts.PrimaryKey As PK, Posts.Description As Value, CT.Rank
        From Posts
            Join ContainsTable( Posts, Description, 'Anyword' ) As CT
                On CT.Key = Posts.PrimaryKey
        Union All
        Select  'PostComments', PostComments.PrimaryKey,  PostComments.Comments, CT.Rank
        From PostComments
        Join ContainsTable( PostComments, Comments, 'Anyword' ) As CT
                On CT.Key = PostComments.PrimaryKey
        ) As Z
Order By Z.Rank Desc

РЕДАКТИРОВАТЬ Учитывая дополнительную информацию, это гораздо яснее. Во-первых, может показаться, что ранжирование поиска не имеет никакого отношения к результатам. Таким образом, все, что необходимо, это использовать ИЛИ между поиском по информации поста и поиском по PostComments:

Select ...
From Posts
Where Contains( Posts.Description, Posts.Title, 'searchterm' )
    Or Exists   (
                Select 1
                From PostComments
                Where PostComments.PostId = Posts.Id
                    And Contains( PostComments.Comments, 'searchterm' )
                )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...