2009-11-07 68 views
5

例如我需要創造一些像谷歌搜索查詢分析器來分析這些表述爲:如何創建一個搜索查詢分析器

飛行遠足 swiming - 「**行走在靴子**」 **作者:** **哈米什作者:**裏德

房子紐約售價超過 $ 500000 游泳池

我怎麼會連着手開始建立類似的東西?任何好的資源?

C#相關,請(如果可能)

  • 編輯:這是一件我應該以某種方式能夠轉換成SQL查詢

回答

5

您有多少個關鍵字(如'或','in','定價超過','有')?如果你只有幾個人,我會建議去簡單的字符串處理(正則表達式)。

但是如果你有比你可能要考慮實施真正解析器這些搜索表達式的更多。 Irony.net可能會幫助你(我發現它非常容易使用,因爲你可以直接在代碼中以近乎bnf的形式表達你的語法)。

+0

有潛在的數百個關鍵字,但並非全部都是一次性要求的。 – b0x0rz 2009-11-07 18:15:42

+0

這不是一個容易解決的問題,因爲您必須爲這數百個關鍵字指定一個「含義」。我想知道你的數據庫模式可能是什麼樣子? – andyp 2009-11-07 18:22:13

+0

Irony.net的偉大鏈接,+1 – SRKX 2013-05-23 12:50:48

-1

我想你應該只是做一些字符串處理。沒有明智的做法。

因此,用您自己的或運營商(例如||)替換「OR」。據我所知,這裏沒有圖書館。

我建議你去正則表達式。

1

Lucene/NLucene項目也具有布爾查詢和一些其他查詢格式的功能。我不知道在你的情況下添加自己的擴展名的可能性,但它可能是值得檢查的。

1

有多種方法做這件事,他們兩個:使用grammar(對於複雜的語言很有用)

根據您的示例,該語言非常基本,因此根據關鍵字拆分字符串可能是最佳解決方案。

string sentence = "house in new york priced over $500000 with a swimming pool"; 
string[] values = sentence.Split(new []{" in ", " priced over ", " with a "}, 
           StringSplitOptions.None); 
string type = values[0]; 
string area = values[1]; 
string price = values[2]; 
string accessories = values[3]; 

然而,可能出現的一些問題是:如何驗證如果句子屹立於預期的形式?如果某些關鍵字可以作爲值的一部分出現,會發生什麼情況?

如果遇到這種情況,您可以使用一些庫來解析使用定義的語法的輸入。與.Net一起工作的這些庫中有兩個是ANTLRGold Parser,兩者都是免費的。主要的挑戰是定義語法。

+0

喜歡黃金到目前爲止最好。 – b0x0rz 2009-11-07 18:21:51

1

文法會很好地工作,你給第二個例子,但第一(任意次序關鍵字/命令字符串)將使用斯普利特()和一個類來處理不同的關鍵字和命令來最好的處理。在分割之前,您必須執行初始處理以處理引用區域(例如,用罕見/未使用的字符替換引用區域中的空格)。

在分割完成後,「:」命令很容易找到並從搜索字符串中拉出來進行處理。簡單地遍歷數組。

+/-關鍵字也很容易找到並作爲AND/AND NOT子句添加到sql查詢中。

您可能遇到的唯一問題是「或」,因爲您必須定義如何處理它。如果有多個「或」?但數組中關鍵字的順序與查詢中的順序相同,因此不會成爲問題。