许多搜索引擎都有'你的意思'功能。
是否存在使用(N)Hibernate(例如ICriteria)基于相似性来查找实体(例如关键字)的简单方法。请注意,我不是指Expression.Like或类似的东西。
我希望这个问题有道理。
感谢。
基督教
PS:
相似性意味着在我的情况下(让我们说)70%的共同字符。
我设想实现一个名为bla的扩展方法,我可以将其用于我的条件查询:
ICriteria Criteria = Session.CreateCriteria(typeof(xxx)); Criteria.Add(Expression.bla(“name”,name)); 将Criteria.List()返回List;
答案 0 :(得分:2)
这超出了nHibenate的范围。 nHibernate是一个数据访问层,它只能执行数据库所做的事情。您可能必须自己确定相似之处,可能是通过维护常见错误表来确定。无论如何,这就是搜索引擎所做的事情,它们并不只是神奇地确定了什么是错字。
答案 1 :(得分:2)
您可以在SQL中使用SOUNDEX功能
SELECT
*
FROM
Products
WHERE
SOUNDEX(ProductName) = SOUNDEX('beer')
这将返回名称类似于“啤酒”的产品。
<强>更新强>
SELECT
*
FROM
Products
WHERE
DIFFERENCE(ProductName, 'beer') IN (3, 4)
这也会返回名称相似的产品......
-Pavel
答案 2 :(得分:2)
正如其他人所说,它通常超出了RDBMS的范围。使用Lucene.Net(可能通过NHibenate.Search)或Solr(可能通过SolrNet)代替。 Solr甚至带有spell checking开箱即用,你可以用来轻松实现“你是说”的功能。
答案 3 :(得分:1)
Hibernate不会使您的数据库比现在更智能。 “你的意思是”是一件非常棘手的事情;它通常是通过对搜索引擎的反向文件索引结构和查询日志的元数据进行单词和n-gram(多字序列)的统计分析来实现的。
作为一个例子,如果我输入exmaple code
,引擎可能会扫描语料库中最常见的已知单词,计算每个单词与术语exmaple
的编辑距离。它可能会找到example
,因此建议“你的意思是example code
”。
答案 4 :(得分:0)
相似性很难定义,并且在许多用例中IMHO的定义不同。相似性可以是发音(有不同的算法,如德国的KöllnerVerfahren)。在语音相似的情况下,它是计算字符串表示的函数。然后可以使用Levenshtein距离来比较它们。我不太了解(N)Hibernate,但可以使用扩展方法来计算对象库的比较。
-sa
答案 5 :(得分:0)
我不认为NHibernate有一个本质上为你提供类似单词的功能。
您必须创建一个距离函数来计算单词之间的距离(它们的相似程度),并根据阈值,您可以考虑距离值低于该值的所有单词。< / p>
这个距离函数是关键,你可以根据它计算单词之间的距离