поиск релевантности по нескольким связанным таблицам - PullRequest
0 голосов
/ 31 марта 2012

У меня есть таблица с именем cards, в которой есть связанные таблицы brigades и identifiers. Одна карта может иметь несколько бригад и идентификаторов. Я хочу взять поиск по одному, например 'purple king', где «пурпурный» - бригада, а «король» - идентификатор, и найти карточки с этими бригадами и идентификаторами. Этот ответ на похожий вопрос https://stackoverflow.com/a/9951200/633513, показал, как можно выполнять полнотекстовый поиск по нескольким таблицам. Я хотел бы сделать то же самое, за исключением того, что я просто хочу соответствующие совпадения. Это возможно?

Структура таблицы:

Cards: id as INT, title as VARCHAR(50)
Brigades: id as INT, brigade as VARCHAR(50)
Identifier: id as INT, identifier as VARCHAR(50)

Присоединиться к столам:

CardBrigades: id as INT, card_id as INT, brigade_id as INT
CardIdentifiers: id as INT, card_id as INT, identifier_id as INT

Идентификаторы образца:

Angel
Animal
Archer
Army
Assyrian
Babylonian
Based on Prophecy
Beast
Bows, Arrows, Spears, Javelins and Darts
Canaanite
'Capture' in Special Ability
'Censer' in Title
Chief Priest
Child of Leah
Commander
Connected to David
Connected to Demons
'Covenant' in Title
'David' in Title
'David' in Verse
Deacon
Prince

Пример бригад:

None
Black
Brown
Crimson
Gold (Evil)
Gray
Orange
Pale Green
Multi (Evil)
Blue
Gold (Good)
Green
Purple
Red
Silver
Teal
White
Multi (Good)
Multi

Ответы [ 2 ]

1 голос
/ 31 марта 2012

Основываясь на ответе по ссылке, которую вы разместили, вы можете сделать что-то вроде этого

SELECT id,SUM(relevance) as total_relevance FROM (
SELECT 
    id, 
    (MATCH(title) AGAINST ('search string')) AS relevance
    FROM Cards
UNION
SELECT 
    Cards.id,
    (MATCH(brigade) AGAINST ('search string')) AS relevance
    FROM Brigades 
    INNER JOIN CardBrigades ON Brigades.id=brigade_id
    INNER JOIN Cards ON card_id=Cards.id 
UNION
SELECT 
    Cards.id,
    (MATCH(identifier) AGAINST ('search string')) AS relevance
    FROM Identifier 
    INNER JOIN CardIdentifier ON Identifier.id=identifier_id
    INNER JOIN Cards on card_id=Cards.id 
) AS combined_search 
GROUP BY id
HAVING total_relevance > 0

Я не уверен, насколько хорошо это будет работать.Возможно, вам лучше рассмотреть другое решение, такое как Solr, Lucene или даже механизм хранения NoSQL.

0 голосов
/ 12 октября 2013

Если вы просто хотите получить соответствующие (релевантные?) Результаты, вы можете использовать поиск FULLTEXT в BOOLEAN MODE следующим образом:

select 
    identifier, brigade, P.id as identifier_id, B.id as brigade_id, 
    match(identifier)  against ('purple prince') +
    match(brigade)     against ('purple prince')   as score
from Identifier P, Brigade B
where 
    match(identifier)  against ('purple prince' IN BOOLEAN MODE) and 
    match(brigade)     against ('purple prince' IN BOOLEAN MODE)
order by -score
;

(Для простоты я просто показываю поисковую часть FULLTEXT и опускаю соединение с таблицей Card *)

...