假设我有三个模型/表: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那样执行计算。
答案 0 :(得分:2)
有一个名为terms
的新索引表,其中包含每个有效术语的标记化版本。这样,您只需要搜索一个表。
# terms
Id Name Type Priority
1 window word false
2 Windows operating_system true
然后,您可以看到用户搜索字词的匹配程度。即“Windows”与2
100%匹配 - 所以假设,但与1
的匹配也是如此,因此建议作为替代方案。你必须编写自己的规则引擎,决定一个单词的匹配程度(即“windows”与“Windows”的假设是什么?)Priority
字段可以是最终决策者,如果规则引擎可以'决定,理论上可以由用户活动驱动,以便了解用户更有可能参考的内容。
答案 1 :(得分:1)
如何以数据库表的形式创建一个缓存,其中包含所有关键字。
搜索查询将是这样的:
SELECT * FROM keywords WHERE keyword = '<YourKeyWord>' /* mysql */
keywords 表将包含对模块的某种引用。
此审批的优势当然是快速搜索。
您可以使用两个查询来模拟您要求的行为:
答案 2 :(得分:0)
Wolfram Alpha比你的例子复杂得多......我不确定它的内部运作方式(我对它的阅读很少),但我认为它是一个非常庞大而复杂的automated inference system 。它们实现起来相当简单(Prolog基本上是一个通用的,你可以把你需要的任何数据放进去),但它们很难有用。