2010-04-09 106 views
0

許多搜索引擎都具有「您的意思」功能。相似度匹配

有沒有簡單的方法來使用(N)Hibernate(例如ICriteria)基於相似性來查找實體(例如關鍵字)。請注意,我不是指Expression.Like或類似的東西。

我希望這個問題有道理。

謝謝。

基督教

PS:

相似性是指在我的情況(比方說)在共性的70%。

我設想實現稱爲擴展方法BLA,我可以用我的標準的查詢:

的ICriteria標準= Session.CreateCriteria(typeof運算(XXX)); Criteria.Add(Expression.bla(「name」,name)); 將Criteria.List()作爲List返回;

+0

我只知道這被稱爲「模糊查找」 - 在過去我使用過的SSIS中有類似的功能。 – 2010-04-09 11:53:18

+0

當我說相似性時,我的意思是共同的字符 - 不區分大小寫。感謝帕維爾 - 這聽起來很有趣,但它會將其與SQL Server綁定。 爲了實現Expression.InsensitiveLike是否(n)hibernate使用'ansi標準數據庫功能'? – cs0815 2010-04-09 12:07:42

回答

2

它超出了nHibenate的範圍。 nHibernate是一個數據訪問層,它只能執行數據庫所做的事情。您必須自己確定相似性,也許通過維護一個常見的錯誤類型表。這就是搜索引擎所做的事情,它們不只是魔術般地確定了什麼是拼寫錯誤。

+0

>這就是搜索引擎所做的事情,它們不只是魔法般地確定什麼是拼寫錯誤。 不知道他們是否將這些信息存儲在數據庫中 - 我寧願認爲他們使用算法 - 就像共同的字符或其他東西 – cs0815 2010-04-09 12:08:50

+0

兩者。他們必須確切地知道,這個錯字不是某種名字。但是對於「相似性」你可能有不同的標準。 – 2010-04-09 12:27:33

+0

維護常見的錯誤表格是一個非常糟糕的主意!不要這樣做! – 2010-04-09 13:08:43

1

Hibernate不會讓你的數據庫變得比以前更聰明。 「你的意思是」是一件非常棘手的事情,它通常通過對搜索引擎的倒排文件索引結構和查詢日誌的元數據進行單詞和n元組(多詞序列)的統計分析來實現。

作爲一個例子,如果我鍵入exmaple code,引擎可能會掃描文集中最常見的已知單詞,從術語exmaple計算每個單詞的編輯距離。它可能會找到example,因此建議,「你的意思是example code」。

0

相似性很難定義,恕我直言在許多用例中定義不同。相似性可以是語音上的(有不同的算法,如德國的KöllnerVerfahren)。在語音相似的情況下,它是一個計算字符串表示的函數。然後可以使用Levenshtein距離來比較它們。我不太瞭解(N)Hibernate,但可以使用擴展方法來計算對象庫的比較。

-sa

+0

感謝 - 擴展方法 - 這就是我一直在尋找的。我設想的是,我實現了一種名爲bla的擴展方法,可以用於我的條件查詢: ICriteria Criteria = Session.CreateCriteria(typeof(xxx)); Criteria.Add(Expression.bla(「name」,name)); return Criteria.List ()as List ; – cs0815 2010-04-09 12:18:24

0

我不認爲NHibernate的有一個功能,它本質上爲您提供的類似的話。

您必須創建一個距離函數來計算單詞之間的距離(它們的相似程度)以及基於閾值,您可以考慮所有距離值低於該值的單詞。

這個距離函數是關鍵,你可以根據你計算字之間的距離有許多標準

+0

嗨, 我可以以某種方式使用ICriteria實現這一點。我確信我可以實現一個接口或者某些東西來計算可以以某種方式使用的共同字符數。如果使用Expression.Bla,c#(3.5)對於可能出現的方法有一個特殊名稱。希望這是有道理的。 據我所知,NHIbernate是一種數據訪問技術,但我也看到了它與Lucene集成的地方 - 實際上有一本關於冬眠搜索的書,我認爲。 – cs0815 2010-04-09 12:02:18

2

可以使用SOUNDEX功能SQL

SELECT 
    * 
FROM 
    Products 
WHERE 
    SOUNDEX(ProductName) = SOUNDEX('beer') 

這將返回產品,有類似「啤酒」的名字。

UPDATE:

SELECT 
    * 
FROM 
    Products 
WHERE 
    DIFFERENCE(ProductName, 'beer') IN (3, 4) 

這也將返回產品具有類似名稱...

-Pavel

+0

有趣 - 只是試了一下,結果看起來不錯。 這是一個ANSI標準的UDF? – cs0815 2010-04-09 12:13:26

+0

對於SOUNDEX:所有語音算法的缺點是,它們專注於特定語言(soundex英語)。 KöllnerVerfahren是爲德國等開發的。第二:類似的並不意味着完全相同的功能輸出,所以可能你也必須有soundex結果的距離。 – Sascha 2010-04-09 12:52:56

2

正如有人說,它通常是超出範圍的RDBMS。使用Lucene.Net(可能通過NHibenate.Search)或Solr(可能通過SolrNet)來代替。 Solr甚至附帶spell checking開箱即用,您可以輕鬆實現「您的意思」功能。