Позволяет говорят, что у меня есть три модели/таблицы: operating_systems
, words
, и programming_languages
:
# operating_systems
name:string created_by:string family:string
Windows Microsoft MS-DOS
Mac OS X Apple UNIX
Linux Linus Torvalds UNIX
UNIX AT&T UNIX
# words
word:string defenitions:string
window (serialized hash of defenitions)
hello (serialized hash of defenitions)
UNIX (serialized hash of defenitions)
# programming_languages
name:string created_by:string example_code:text
C++ Bjarne Stroustrup #include <iostream> etc...
HelloWorld Jeff Skeet h
AnotherOne Jon Atwood imports 'SORULEZ.cs' etc...
Когда пользователь ищет hello
, система показывает определения 'привет'. Это относительно легко реализовать. Однако, когда пользователь ищет UNIX
, механизм должен выбрать: word
или operating_system
. Кроме того, когда пользователь ищет windows
(строчная буква 'w'), механизм выбирает word
, но должен также показать Assuming 'windows' is a word. Use as an <a href="etc..">operating system</a> instead
.
Кто-либо может указать на меня в правильном направлении с парсингом и выбором темы поискового запроса?Спасибо.
Примечание: это не должно мочь выполнить вычисления, как WA может сделать.
Иметь новая индексная таблица, называемая термины
, которая содержит токенизированную версию каждого действительного термина. Таким образом, вам нужно будет искать только в одной таблице.
# terms
Id Name Type Priority
1 window word false
2 Windows operating_system true
Затем вы можете увидеть, насколько близко соответствует поисковый запрос пользователей. Т.е. «Windows» будет на 100% совпадать с 2
- так что предположим, но также будет близким совпадением с 1
, поэтому предложите это в качестве альтернативы. Вы должны написать свой собственный механизм правил, который определял бы, насколько близко слово соответствует (то есть, что предполагается с «windows» против «Windows»?) Поле Priority
может быть окончательным решающим, если механизм правил не может принять решение и теоретически может определяться действиями пользователя, чтобы узнать, о чем пользователи, скорее всего, имеют в виду.
Wolfram Alpha намного сложнее, чем ваш пример ... Я не уверен в его внутренней работе (я очень мало читал о нем), но я считаю, что это очень большой и сложный автоматический вывод система . Их довольно легко реализовать (Prolog, по сути, является универсальным, вы можете поместить в него любые нужные вам данные), но их очень сложно сделать полезными.
А как насчет того, чтобы сделать кеш в виде таблицы базы данных, где будут все ключевые слова.
Поисковый запрос будет выглядеть примерно так:
SELECT * FROM keywords WHERE keyword = '<YourKeyWord>' /* mysql */
таблица ключевых слов будет содержать ссылки на ваши модули.
Преимущество этого подхода, конечно, в быстром поиске.
Вы можете использовать два запроса, чтобы смоделировать запрашиваемое поведение: