2012-02-15 3 views
0

Я хочу сделать таблицу ключевых слов, в которой хранятся слова в строке (из фразы с пробелами), и если пользователь вводит фразу, он добавляет ссылку на ключевое слово id в таблицу фраз.Моделирование ключевых слов и фраз в Rails

Я думаю, что таблицы должны выглядеть следующим образом:

Ключевое слово:

ID | Word 
----------- 
1, a 
2, keyword 
3, phrase 

Домен:

ID | Name 
----------- 
1, findme.org 

Фраза:

Phrase_ID | Keyword_ID | Domain_ID | Word_Weight 
----------- 
1, 1, 1, 0 
1, 2, 1, 1 
1, 3, 1, 2 

Есть ли способ, что я может сделать это в rai Возможно, с отношением has_many, чтобы я мог получить фразу, передав @ domain.phrases, возвращая список всех фраз с тем же именем Domain_ID, и @ keyword.phrases перечисляет все фразы, содержащие ключевое слово с Keyword_ID

Моя цель состоит в том, чтобы избежать дублирования строк в любой из таблиц, является ли это запутанным? Не могли бы вы предложить лучший дизайн, который является способом рельсов?

ответ

1

Что вы описываете, очень похоже на концепцию тегов, и поэтому вы можете использовать любой из имеющихся tagging libraries и/или изучить их структуру для твердого решения.

Например, here is the migration для драгоценного камня acts_as_taggable_on, который даст вам представление о том, как это сделали другие люди, включая модели (и отношения между моделями) в коде.

Эти инструменты предоставляют с очень небольшим кодом возможность добавлять @domain.tags в любую запись. Некоторые из библиотек также позволяют вам определять, что вы хотите назвать тегами, поэтому, если вы хотите назвать их ключевыми словами, вы можете это сделать и иметь такие вызовы, как @domain.keywords или @domain.phrases и т. Д., Как в вашем примере.

Кроме того, если конечная цель состоит в том, чтобы добавить ключевые слова, чтобы помочь в поиске, есть отличные библиотеки поиска и инструменты, которые позволяют full text search (где текст, заголовки и т. Д. Автоматически индексируются для ключевых слов), не требуя явно определять ключевые слова.

Действительно зависит от того, куда вы хотите отправиться, но это несколько направлений для вас.

+0

Каковы плюсы и минусы использования act_as_taggable_on над простыми, имеет много связей, как показано elhu? На второй ноте. Было бы неплохо, если бы был камень, который мог бы взять в качестве входного URL-адрес, а затем просканировать этот URL-адрес и разобрать его на ключевые слова для предложений в моем приложении. Знаете ли вы о каких-либо драгоценных камнях или API-интерфейсах, которые позволяют вам это делать? Пока я нашел https://github.com/apneadiving/SemExtractor#readme, он использует текстовые сообщения для получения текста с сайтов, но их лицензия не позволяет вам интегрироваться с веб-поиском/пауком. – Arosboro

+0

Я просто указывал на сходство того, что вы просили концепцию тегов, в случае, если вы действительно хотели, были теги или функциональный эквивалент. Проу не нужно будет реализовывать (и поддерживать его) самостоятельно, а вместо этого использовать работу других. – jefflunt

0

Как Вы проектировали приложение, вы бы три модели, следующим образом:

class Keyword < ActiveRecord::Base 
    has_many :phrases 
end 

class Domain < ActiveRecord::Base 
    has_many :phrases 
end 

class Phrase < ActiveRecord::Base 
    belongs_to :keyword 
    belongs_to :domain 
end 

С помощью этой установки вы можете получить доступ к фразам домена по и фразам для ключевых слова так, как вы описываете в конце вашего вопроса , Если вы хотите идти дальше, и получить доступ ко всем доменам с определенным ключевым словом, или все ключевые слова с определенным доменом, вы должны написать свои классы следующим образом:

class Keyword < ActiveRecord::Base 
    has_many :phrases 
    has_many :domains, through: :phrases 
end 

class Domain < ActiveRecord::Base 
    has_many :phrases 
    has_many :keywords, through: :phrases 
end 

class Phrase < ActiveRecord::Base 
    belongs_to :keyword 
    belongs_to :domain 
end 

Вы могли бы получить доступ к этим информации с следующие:

@keyword.domains # All the domains matching with the keyword 
@domain.keywords # All the keywords for a specific domain 

Cheers.

+0

Спасибо, что выписали эти классы. Будет ли @ domain.phrases возвращать список ключевых слов в том порядке, в котором они были сохранены? Я пытаюсь отследить исходную фразу, чтобы я мог сказать, что мое приложение вышло и запустило запрошенную поисковую фразу. – Arosboro

+0

Nevermind Я пропустил это в вашем сообщении «С помощью этой настройки вы можете получить доступ к фразам домена и фразам ключевого слова так, как вы описываете в конце своего вопроса» – Arosboro

+0

По умолчанию он сортирует по возрастанию ID, но вы можете легко изменить это поведение с использованием областей. В Интернете есть много документации. Тем не менее, я не уверен, что заключение предложений из списка отдельно хранимых слов будет очень хорошо работать. Я думаю, если у вас есть время, вы должны еще больше углубиться в некоторые из предложенных в его решении нормальных решений. – Elhu

Смежные вопросы