在我学习计算机科学的过程中,我遇到了一些像Prolog这样的函数式语言,但是现在我在过去的10年里只做过像C#,Ruby JavaScript和Java这样的命令式的东西.目前我正在为网上商店创建一个全文搜索引擎,我已经走到了"必要的方式".但是,遇到像Caskjure的Haskell这样的函数式语言时,很明显功能范式非常合适,并且命令式方法不适合这项工作.
所以我们有一个大约1000万条记录的全文索引.每个记录基本上包含一个单词出现,以及它所来自的记录中的id和text位置.
当用户输入搜索字符串时,它将被解析为表达式树.例如,搜索字符串"transformer 100 W"会产生类似的结果
AND('transformer%', OR(NEAR('100', 'W'), NEAR('100', 'watts'), '100W', '0.1kW'))
Run Code Online (Sandbox Code Playgroud)
这里还有一些额外的"情报",但这个问题无关紧要.
然后递归地评估表达式树,并导致一些sql查询,这些查询可以以.NET-DataTables的形式返回多达100,000行.然后将它们读入集合或字典中,并根据谓词应用交叉点和联合,以便找到与整个搜索表达式匹配的所有结果.对于NEAR评估,还比较找到的事件的位置索引.但这一切都是必须完成的,有很多for循环.
此外,还有一个排名功能,可以将找到的单词出现次数加起来.仅作为前缀或模糊匹配(由数据库服务器完成)的单词得分低于精确匹配.
对于每个结果项,我还需要获得匹配的所有单词出现的列表,以便在结果页中突出显示这些单词.
所以大致评估算法是一个像
expression tree, full text index ->
resulting items that match the expressin tree,
each with a ranking sum
and a list of all found word occurrences for this item
Run Code Online (Sandbox Code Playgroud)
我只是在这里给出一个粗略的概述,但我希望你能得到足够的图片.
现在"现实世界"的限制:
由于我需要继续使用.NET,我正在研究Clojure-CLR,F#和Scala for .NET.
我很喜欢Clojure的概念,但是现在我无法评估它是否符合这项工作.阅读F#给了我复杂的感受,因为它似乎想要能够完成所有事情,而我倾向于为给定的任务采用更"纯粹"的数学方法.但也许F#也可以这样做,我还没有意识到这一点.我还没有深入研究过Scala,但它似乎已经很成熟了.
任何见解都会受到欢迎!
非常(经常)我们需要写一些像
Dim Data = GetSomeData()
If Data IsNot Nothing Then
Data.DoSomething()
Else
...
End If
Run Code Online (Sandbox Code Playgroud)
也许我是在徒劳地问,但我非常希望VB.Net有一些结构如下:
IfExists Data = GetSomeData() Then
Data.DoSomething()
Else
...
End IfExists
Run Code Online (Sandbox Code Playgroud)
在我的梦中,它做了两件重要的事情:
有什么类似于我还没有发现的东西吗?
谢谢!
编辑:灵感来自Bjørn-RogerKringsjå的答案我想出了一些令我满意的东西(VB.Net的不足之处):
<Extension()>
Public Sub IfExists(Of T)(This As T, DoIfNotNothing As Action(Of T), Optional DoIfNothing As Action = Nothing)
If This IsNot Nothing Then
DoIfNotNothing(This)
ElseIf DoIfNothing IsNot Nothing Then
DoIfNothing()
End If
End Sub
Run Code Online (Sandbox Code Playgroud)
然后我可以像这样调用它(假部分是可选的)
GetSomeData().IfExists(Sub(Data) Data.DoSomething())
Run Code Online (Sandbox Code Playgroud)
要么
GetSomeData().IfExists(Sub(Data) Data.DoSomething(), Sub() DoSomethingElse())
Run Code Online (Sandbox Code Playgroud) 我即将部署具有敏感数据的应用程序。因此,磁盘上不应存储任何数据。有没有办法禁用服务器端缓存?我找不到。