5

假设我有三个模型/表:operating_systemswordsprogramming_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,引擎必须选择:wordoperating_system。此外,当用户搜索windows(小写字母“w”)时,引擎会选择word,但也应该显示Assuming 'windows' is a word. Use as an <a href="etc..">operating system</a> instead

谁能通过解析和选择搜索查询的主题为我指明正确的方向?谢谢。


注意:它不需要像 WA 那样执行计算。

4

3 回答 3

2

有一个名为的新索引表terms,其中包含每个有效术语的标记化版本。这样,您只需搜索一张表。

# terms
Id Name     Type               Priority
1  window   word               false
2  Windows  operating_system   true

然后您可以看到用户搜索词的匹配程度。即“Windows”将与2- 100% 匹配,因此假设,但1也接近匹配,因此建议将其作为替代方案。您必须编写自己的规则引擎来决定单词匹配的接近程度(即“windows”与“Windows”的假设是什么?)Priority如果规则引擎无法决定,则该字段可能是最终决定者,并且可以理论上是由用户活动驱动的,因此它可以了解用户更可能指的是什么。

于 2010-05-07T16:27:05.127 回答
1

以及如何以所有关键字所在的数据库表的形式进行缓存。

搜索查询将是这样的:

SELECT * FROM keywords WHERE keyword = '<YourKeyWord>'   /* mysql */

关键字表将包含对您的模块的某种引用。

这种方法的优点当然是快速搜索。

您可以使用两个查询来模拟您要求的行为:

  • 完全匹配(在 mysql 中没有问题)
  • 不区分大小写的搜索
于 2010-05-07T16:20:21.970 回答
0

Wolfram Alpha 比您的示例复杂得多……我不确定它的内部工作原理(我对它的阅读很少),但我相信它是一个非常庞大且复杂的自动推理系统。它们实现起来相当简单(Prolog 基本上是一个通用的,你可以将任何你需要的数据放入其中),但它们很难发挥作用。

于 2010-05-07T17:43:59.683 回答